/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.entity; import com.google.j2objc.annotations.Property; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.ArrayList; import java.util.List; import im.actor.core.api.ApiAvatar; import im.actor.core.api.ApiFullUser; import im.actor.core.api.ApiGroup; import im.actor.core.api.ApiGroupFull; import im.actor.core.api.ApiGroupFullPermissions; import im.actor.core.api.ApiGroupPermissions; import im.actor.core.api.ApiMapValue; import im.actor.core.api.ApiMember; import im.actor.core.util.BitMaskUtil; import im.actor.runtime.bser.BserCreator; import im.actor.runtime.bser.BserValues; import im.actor.runtime.bser.BserWriter; import im.actor.runtime.storage.KeyValueItem; public class Group extends WrapperExtEntity<ApiGroupFull, ApiGroup> implements KeyValueItem { private static final int RECORD_ID = 10; private static final int RECORD_EXT_ID = 11; public static BserCreator<Group> CREATOR = Group::new; // // Main // @Property("readonly, nonatomic") private int groupId; private long accessHash; @NotNull @Property("readonly, nonatomic") @SuppressWarnings("NullableProblems") private String title; @Nullable @Property("readonly, nonatomic") private Avatar avatar; @Property("readonly, nonatomic") private boolean isHidden; @Property("readonly, nonatomic") private int membersCount; @Property("readonly, nonatomic") private boolean isMember; @Property("readonly, nonatomic") private boolean isCanSendMessage; @Property("readonly, nonatomic") private boolean isCanClear; @Property("readonly, nonatomic") private boolean isCanLeave; @Property("readonly, nonatomic") private boolean isCanDelete; @Property("readonly, nonatomic") private boolean isDeleted; @Property("readonly, nonatomic") private boolean isCanJoin; @Property("readonly, nonatomic") private boolean isCanViewInfo; @Property("readonly, nonatomic") private ApiMapValue ext; @NotNull @Property("readonly, nonatomic") @SuppressWarnings("NullableProblems") private GroupType groupType; // // Ext // @Property("readonly, nonatomic") private Integer ownerId; @Nullable @Property("readonly, nonatomic") private String topic; @Nullable @Property("readonly, nonatomic") private String about; @Nullable @Property("readonly, nonatomic") private String shortName; @NotNull @Property("readonly, nonatomic") @SuppressWarnings("NullableProblems") private List<GroupMember> members; @Property("readonly, nonatomic") private boolean isAsyncMembers; @Property("readonly, nonatomic") private boolean isCanInviteMembers; @Property("readonly, nonatomic") private boolean isCanInviteViaLink; @Property("readonly, nonatomic") private boolean isCanCall; @Property("readonly, nonatomic") private boolean isCanViewMembers; @Property("readonly, nonatomic") private boolean isSharedHistory; @Property("readonly, nonatomic") private boolean isCanEditInfo; @Property("readonly, nonatomic") private boolean isCanEditAdministration; @Property("readonly, nonatomic") private boolean isCanViewAdmins; @Property("readonly, nonatomic") private boolean isCanEditAdmins; @Property("readonly, nonatomic") private boolean isCanKickInvited; @Property("readonly, nonatomic") private boolean isCanKickAnyone; @Property("readonly, nonatomic") private boolean isCanEditForeign; @Property("readonly, nonatomic") private boolean isCanDeleteForeign; @Property("readonly, nonatomic") private boolean haveExtension; // // Constructors // public Group(@NotNull ApiGroup group, @Nullable ApiGroupFull ext) { super(RECORD_ID, RECORD_EXT_ID, group, ext); } public Group(@NotNull byte[] data) throws IOException { super(RECORD_ID, RECORD_EXT_ID, data); } private Group() { super(RECORD_ID, RECORD_EXT_ID); } // // Getters // public int getGroupId() { return groupId; } public long getAccessHash() { return accessHash; } @NotNull public String getTitle() { return title; } @Nullable public Avatar getAvatar() { return avatar; } public boolean isHidden() { return isHidden; } public int getMembersCount() { return membersCount; } public boolean isMember() { return isMember; } public boolean isDeleted() { return isDeleted; } public boolean isCanSendMessage() { return isCanSendMessage; } public boolean isCanClear() { return isCanClear; } public boolean isCanLeave() { return isCanLeave; } public boolean isCanDelete() { return isCanDelete; } public boolean isCanCall() { return isCanCall; } public boolean isCanJoin() { return isCanJoin; } public boolean isCanViewInfo() { return isCanViewInfo; } @NotNull public GroupType getGroupType() { return groupType; } // // Ext // @NotNull public List<GroupMember> getMembers() { return members; } @Nullable public String getTopic() { return topic; } @Nullable public String getAbout() { return about; } @Nullable public String getShortName() { return shortName; } @Nullable public Integer getOwnerId() { return ownerId; } public boolean isAsyncMembers() { return isAsyncMembers; } public boolean isCanInviteMembers() { return isCanInviteMembers; } public boolean isCanViewMembers() { return isCanViewMembers; } public boolean isCanEditInfo() { return isCanEditInfo; } public boolean isSharedHistory() { return isSharedHistory; } public boolean isHaveExtension() { return haveExtension; } public boolean isCanEditAdministration() { return isCanEditAdministration; } public boolean isCanViewAdmins() { return isCanViewAdmins; } public boolean isCanEditAdmins() { return isCanEditAdmins; } public boolean isCanInviteViaLink() { return isCanInviteViaLink; } public boolean isCanKickInvited() { return isCanKickInvited; } public boolean isCanKickAnyone() { return isCanKickAnyone; } public boolean isCanEditForeign() { return isCanEditForeign; } public boolean isCanDeleteForeign() { return isCanDeleteForeign; } public ApiMapValue getExt() { return ext; } public Group updateExt(@Nullable ApiGroupFull ext) { return new Group(getWrapped(), ext); } // // Editing Main // public Group editTitle(String title) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), title, w.getAvatar(), w.getMembersCount(), w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), w.getExt()); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } public Group editAvatar(ApiAvatar avatar) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), avatar, w.getMembersCount(), w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), w.getExt()); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } public Group editIsMember(boolean isMember) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), w.getMembersCount(), isMember, w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), w.getExt()); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } public Group editIsDeleted(boolean isDeleted) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), w.getMembersCount(), w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), isDeleted, w.getExt()); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } public Group editPermissions(long permissions) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), w.getMembersCount(), w.isMember(), w.isHidden(), w.getGroupType(), permissions, w.isDeleted(), w.getExt()); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } public Group editExt(ApiMapValue ext) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), w.getMembersCount(), w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), ext); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } // // Members // public Group editMembers(List<ApiMember> members) { ApiGroupFull fullExt = null; if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), members, e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); } ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), members.size(), w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), w.getExt()); return new Group(res, fullExt); } public Group editMembers(List<ApiMember> added, List<Integer> removed, int count) { ApiGroupFull fullExt = null; if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ArrayList<ApiMember> nMembers = new ArrayList<>(e.getMembers()); // Remove members for (Integer i : removed) { for (ApiMember m : nMembers) { if (m.getUid() == i) { nMembers.remove(m); break; } } } // Adding members for (ApiMember a : added) { for (ApiMember m : nMembers) { if (m.getUid() == a.getUid()) { nMembers.remove(m); break; } } nMembers.add(a); } fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), nMembers, e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); } ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), count, w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), w.getExt()); return new Group(res, fullExt); } public Group editMembersCount(int membersCount) { ApiGroup w = getWrapped(); ApiGroup res = new ApiGroup( w.getId(), w.getAccessHash(), w.getTitle(), w.getAvatar(), membersCount, w.isMember(), w.isHidden(), w.getGroupType(), w.getPermissions(), w.isDeleted(), w.getExt()); res.setUnmappedObjects(w.getUnmappedObjects()); return new Group(res, getWrappedExt()); } public Group editMembersBecameAsync() { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), new ArrayList<>(), e.getTheme(), e.getAbout(), e.getExt(), true, e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editMemberChangedAdmin(int uid, Boolean isAdmin) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ArrayList<ApiMember> nMembers = new ArrayList<>(e.getMembers()); for (int i = 0; i < nMembers.size(); i++) { ApiMember m = nMembers.get(i); if (m.getUid() == uid) { nMembers.remove(m); nMembers.add(i, new ApiMember(m.getUid(), m.getInviterUid(), m.getDate(), isAdmin)); break; } } ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), nMembers, e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } // // Editing Ext // public Group editTopic(String topic) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), e.getMembers(), topic, e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editAbout(String about) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), e.getMembers(), e.getTheme(), about, e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editShortName(String shortName) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), e.getMembers(), e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), shortName, e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editFullExt(ApiMapValue ext) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), e.getMembers(), e.getTheme(), e.getAbout(), ext, e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editOwner(int uid) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), uid, e.getMembers(), e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editHistoryShared() { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), e.getMembers(), e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), true, e.getShortName(), e.getPermissions()); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } public Group editExtPermissions(long permissions) { if (getWrappedExt() != null) { ApiGroupFull e = getWrappedExt(); ApiGroupFull fullExt = new ApiGroupFull(e.getId(), e.getCreateDate(), e.getOwnerUid(), e.getMembers(), e.getTheme(), e.getAbout(), e.getExt(), e.isAsyncMembers(), e.isSharedHistory(), e.getShortName(), permissions); fullExt.setUnmappedObjects(e.getUnmappedObjects()); return new Group(getWrapped(), fullExt); } else { return this; } } @Override protected void applyWrapped(@NotNull ApiGroup wrapped, @Nullable ApiGroupFull ext) { this.groupId = wrapped.getId(); this.accessHash = wrapped.getAccessHash(); this.title = wrapped.getTitle(); this.avatar = wrapped.getAvatar() != null ? new Avatar(wrapped.getAvatar()) : null; this.isHidden = wrapped.isHidden() != null ? wrapped.isHidden() : false; this.membersCount = wrapped.getMembersCount() != null ? wrapped.getMembersCount() : 0; this.isMember = wrapped.isMember() != null ? wrapped.isMember() : true; this.isDeleted = wrapped.isDeleted() != null ? wrapped.isDeleted() : false; this.ext = wrapped.getExt(); if (wrapped.getGroupType() == null) { this.groupType = GroupType.GROUP; } else { switch (wrapped.getGroupType()) { case CHANNEL: this.groupType = GroupType.CHANNEL; break; case GROUP: this.groupType = GroupType.GROUP; break; default: case UNSUPPORTED_VALUE: this.groupType = GroupType.OTHER; break; } } long permissions = 0; if (wrapped.getPermissions() != null) { permissions = wrapped.getPermissions(); } /* # 0 - canSendMessage. Default is FALSE. # 1 - canClear. Default is FALSE. # 2 - canLeave. Default is FALSE. # 3 - canDelete. Default is FALSE. */ this.isCanSendMessage = BitMaskUtil.getBitValue(permissions, ApiGroupPermissions.SEND_MESSAGE); this.isCanClear = BitMaskUtil.getBitValue(permissions, ApiGroupPermissions.CLEAR); this.isCanLeave = BitMaskUtil.getBitValue(permissions, ApiGroupPermissions.LEAVE); this.isCanDelete = BitMaskUtil.getBitValue(permissions, ApiGroupPermissions.DELETE); this.isCanJoin = BitMaskUtil.getBitValue(permissions, ApiGroupPermissions.JOIN); this.isCanViewInfo = BitMaskUtil.getBitValue(permissions, ApiGroupPermissions.VIEW_INFO); // // Ext // if (ext != null) { this.haveExtension = true; this.ownerId = ext.getOwnerUid(); this.about = ext.getAbout(); this.topic = ext.getTheme(); this.shortName = ext.getShortName(); this.isAsyncMembers = ext.isAsyncMembers() != null ? ext.isAsyncMembers() : false; this.isSharedHistory = ext.isSharedHistory() != null ? ext.isSharedHistory() : false; /* # 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. */ long fullPermissions = 0; if (ext.getPermissions() != null) { fullPermissions = ext.getPermissions(); } this.isCanEditInfo = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.EDIT_INFO); this.isCanViewMembers = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.VIEW_MEMBERS); this.isCanInviteMembers = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.INVITE_MEMBERS); this.isCanInviteViaLink = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.INVITE_VIA_LINK); this.isCanCall = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.CALL); this.isCanEditAdministration = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.EDIT_ADMIN_SETTINGS); this.isCanViewAdmins = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.VIEW_ADMINS); this.isCanEditAdmins = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.EDIT_ADMINS); this.isCanKickInvited = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.KICK_INVITED); this.isCanKickAnyone = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.KICK_ANYONE); this.isCanEditForeign = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.EDIT_FOREIGN); this.isCanDeleteForeign = BitMaskUtil.getBitValue(fullPermissions, ApiGroupFullPermissions.DELETE_FOREIGN); this.members = new ArrayList<>(); for (ApiMember m : ext.getMembers()) { this.members.add(new GroupMember(m.getUid(), m.getInviterUid(), m.getDate(), m.isAdmin() != null ? m.isAdmin() : false)); } } else { this.haveExtension = false; this.ownerId = 0; this.about = null; this.topic = null; this.shortName = null; this.members = new ArrayList<>(); this.isAsyncMembers = false; this.isCanViewMembers = false; this.isCanInviteMembers = false; this.isSharedHistory = false; this.isCanEditInfo = false; this.isCanEditAdministration = false; this.isCanViewAdmins = false; this.isCanEditAdmins = false; this.isCanInviteViaLink = false; this.isCanKickInvited = false; this.isCanKickAnyone = false; this.isCanEditForeign = false; this.isCanDeleteForeign = false; } } @Override public long getEngineId() { return groupId; } public Peer peer() { return new Peer(PeerType.GROUP, groupId); } @Override @NotNull protected ApiGroup createInstance() { return new ApiGroup(); } @Override protected ApiGroupFull createExtInstance() { return new ApiGroupFull(); } }