core, ui: invite member of one group to another group (#7682)

* rfc: invite member of one group to another group

* update

* update

* implement

* version

* update

* do not show error if contact was removed when joining group

---------

Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com>
This commit is contained in:
EvgenyandEvgeny @ SimpleX Chat authored and GitHub committed 2026-10-11 09:50:42 +01:00
1 parent 1053e9fb5c
commit 07c363849b
41 files changed
+1571 -52

No files matched your search

@@ -266,6 +266,23 @@ export namespace APIAddMember {
}
}
// Add member of another group to group. Requires bot to have Admin role in the group, and direct messages allowed for its role in another group.
// Network usage: interactive.
export interface APIAddMemberViaGroup {
groupId: number // int64
viaGroupId: number // int64
groupMemberId: number // int64
memberRole: T.GroupMemberRole
}
export namespace APIAddMemberViaGroup {
export type Response = CR.SentGroupInvitationViaGroup | CR.ChatCmdError
export function cmdString(self: APIAddMemberViaGroup): string {
return '/_add #' + self.groupId + ' #' + self.viaGroupId + ' ' + self.groupMemberId + ' ' + self.memberRole
}
}
// Join group.
// Network usage: interactive.
export interface APIJoinGroup {
@@ -17,6 +17,7 @@ export type ChatEvent =
| CEvt.GroupChatItemsDeleted
| CEvt.ChatItemsStatusesUpdated
| CEvt.ReceivedGroupInvitation
| CEvt.ReceivedGroupInvitationViaGroup
| CEvt.UserJoinedGroup
| CEvt.GroupUpdated
| CEvt.JoinedGroupMember
@@ -73,6 +74,7 @@ export namespace CEvt {
| "groupChatItemsDeleted"
| "chatItemsStatusesUpdated"
| "receivedGroupInvitation"
| "receivedGroupInvitationViaGroup"
| "userJoinedGroup"
| "groupUpdated"
| "joinedGroupMember"
@@ -210,6 +212,16 @@ export namespace CEvt {
memberRole: T.GroupMemberRole
}
export interface ReceivedGroupInvitationViaGroup extends Interface {
type: "receivedGroupInvitationViaGroup"
user: T.User
groupInfo: T.GroupInfo
viaGroupInfo: T.GroupInfo
viaMember: T.GroupMember
fromMemberRole: T.GroupMemberRole
memberRole: T.GroupMemberRole
}
export interface UserJoinedGroup extends Interface {
type: "userJoinedGroup"
user: T.User
@@ -51,6 +51,7 @@ export type ChatResponse =
| CR.RemoteCtrlConnecting
| CR.SentConfirmation
| CR.SentGroupInvitation
| CR.SentGroupInvitationViaGroup
| CR.SentInvitation
| CR.SentInvitationToContact
| CR.ServiceReplyAccepted
@@ -117,6 +118,7 @@ export namespace CR {
| "remoteCtrlConnecting"
| "sentConfirmation"
| "sentGroupInvitation"
| "sentGroupInvitationViaGroup"
| "sentInvitation"
| "sentInvitationToContact"
| "serviceReplyAccepted"
@@ -445,6 +447,15 @@ export namespace CR {
member: T.GroupMember
}
export interface SentGroupInvitationViaGroup extends Interface {
type: "sentGroupInvitationViaGroup"
user: T.User
groupInfo: T.GroupInfo
member: T.GroupMember
viaGroupInfo: T.GroupInfo
viaMember: T.GroupMember
}
export interface SentInvitation extends Interface {
type: "sentInvitation"
user: T.User
@@ -261,6 +261,12 @@ export class ChatClient {
throw new ChatCommandError("error adding member", r)
}
async apiAddMemberViaGroup(groupId: number, viaGroupId: number, groupMemberId: number, memberRole: T.GroupMemberRole): Promise<T.GroupMember> {
const r = await this.sendChatCmd(CC.APIAddMemberViaGroup.cmdString({groupId, viaGroupId, groupMemberId, memberRole}))
if (r.type === "sentGroupInvitationViaGroup") return r.member
throw new ChatCommandError("error adding member", r)
}
async apiJoinGroup(groupId: number): Promise<T.GroupInfo> {
const r = await this.sendChatCmd(CC.APIJoinGroup.cmdString({groupId}))
if (r.type === "userAcceptedGroupSent") return r.groupInfo