Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/groups/meta_group_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -396,7 +396,10 @@ Napi::Value MetaGroupWrapper::memberGetAllPendingRemovals(const Napi::CallbackIn
return wrapResult(info, [&] {
std::vector<session::config::groups::member> allMembersRemoved;
for (auto& member : *this->meta_group->members) {
if (member.is_removed()) {
auto memberStatus = member.status();
if (memberStatus == member::Status::removed_unknown ||
memberStatus == member::Status::removed ||
memberStatus == member::Status::removed_including_messages) {
allMembersRemoved.push_back(member);
}
}
Expand Down
81 changes: 48 additions & 33 deletions src/groups/meta_group_wrapper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "../utilities.hpp"
#include "./meta_group.hpp"
#include "oxenc/bt_producer.h"
#include "session/config/groups/members.hpp"
#include "session/config/user_groups.hpp"

namespace session::nodeapi {
Expand All @@ -25,43 +26,57 @@ struct toJs_impl<member> {
obj["pubkeyHex"] = toJs(env, info.session_id);
obj["name"] = toJs(env, info.name);
obj["profilePicture"] = toJs(env, info.profile_picture);
obj["removedStatus"] = toJs(env, info.removed_status);

// promoted() is true as soon as the member is scheduled to be promoted
// Note: this should be part of `libsession-util`, not `libsession-util-nodejs`
if (info.promoted() && !info.promotion_pending()) {
obj["memberStatus"] = toJs(env, "PROMOTION_ACCEPTED");
} else if (info.promotion_failed()) {
obj["memberStatus"] = toJs(env, "PROMOTION_FAILED");
} else if (info.promotion_pending()) {
obj["memberStatus"] = toJs(env, "PROMOTION_SENT");
} else if (info.admin) {
obj["memberStatus"] = toJs(env, "PROMOTION_NOT_SENT");
} else if (info.invite_status == 0) {
obj["memberStatus"] = toJs(env, "INVITE_ACCEPTED");
} else if (info.invite_not_sent()) {
obj["memberStatus"] = toJs(env, "INVITE_NOT_SENT");
} else if (info.invite_failed()) {
obj["memberStatus"] = toJs(env, "INVITE_FAILED");
} else if (info.invite_pending()) {
// Note: INVITE_NOT_SENT is 3, which makes invite_pending() return true, so be sure to
// check for invite_not_sent() above.
obj["memberStatus"] = toJs(env, "INVITE_SENT");
} else {
obj["memberStatus"] = toJs(env, "UNKNOWN");

auto status = info.status();

switch (status) {
// invite statuses
case member::Status::invite_unknown:
obj["memberStatus"] = toJs(env, "INVITE_UNKNOWN");
break;
case member::Status::invite_not_sent:
obj["memberStatus"] = toJs(env, "INVITE_NOT_SENT");
break;
case member::Status::invite_failed:
obj["memberStatus"] = toJs(env, "INVITE_FAILED");
break;
case member::Status::invite_sent: obj["memberStatus"] = toJs(env, "INVITE_SENT"); break;
case member::Status::invite_accepted:
obj["memberStatus"] = toJs(env, "INVITE_ACCEPTED");
break;

// promotion statuses
case member::Status::promotion_unknown:
obj["memberStatus"] = toJs(env, "PROMOTION_UNKNOWN");
break;
case member::Status::promotion_not_sent:
obj["memberStatus"] = toJs(env, "PROMOTION_NOT_SENT");
break;
case member::Status::promotion_failed:
obj["memberStatus"] = toJs(env, "PROMOTION_FAILED");
break;
case member::Status::promotion_sent:
obj["memberStatus"] = toJs(env, "PROMOTION_SENT");
break;
case member::Status::promotion_accepted:
obj["memberStatus"] = toJs(env, "PROMOTION_ACCEPTED");
break;

// removed statuses
case member::Status::removed_unknown:
obj["memberStatus"] = toJs(env, "REMOVED_UNKNOWN");
break;
case member::Status::removed: obj["memberStatus"] = toJs(env, "REMOVED_MEMBER"); break;
case member::Status::removed_including_messages:
obj["memberStatus"] = toJs(env, "REMOVED_MEMBER_AND_MESSAGES");
break;

default: throw std::runtime_error{"Invalid member status got as an enum"};
}

// we display the "crown" on top of the member's avatar when this field is true
obj["nominatedAdmin"] = toJs(env, info.admin);

if (!info.is_removed()) {
obj["removedStatus"] = toJs(env, "NOT_REMOVED");
} else {
if (info.should_remove_messages()) {
obj["removedStatus"] = toJs(env, "REMOVED_MEMBER_AND_MESSAGES");
} else {
obj["removedStatus"] = toJs(env, "REMOVED_MEMBER");
}
}
return obj;
}
};
Expand Down
47 changes: 35 additions & 12 deletions types/groups/groupmembers.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,33 +12,56 @@ declare module 'libsession_util_nodejs' {
profilePicture: ProfilePicture | null;
};

/**
* Unified status that a member can have based on the various libsession-util values.
*
* **Invite statuses**
* - INVITE_UNKNOWN: fallback invite case
* - INVITE_NOT_SENT: as soon as we've scheduled that member to be invited, but before we've tried sending the invite message
* - INVITE_FAILED: we know the invite failed to be sent to the member
* - INVITE_SENT: we know the invite has been sent to the member
* - INVITE_ACCEPTED: regular member
*
* **Promotion statuses**
* - PROMOTION_UNKNOWN: promotion fallback case
* - PROMOTION_NOT_SENT: as soon as we've scheduled that guy to be an admin, but before we've tried sending the promotion message
* - PROMOTION_FAILED: we know the promotion failed to be sent to the member
* - PROMOTION_SENT: we know the promotion message was sent to the member
* - PROMOTION_ACCEPTED: regular admin
*
* **Removed statuses**
* - REMOVED_MEMBER: the member is pending removal from the group
* - REMOVED_MEMBER_AND_MESSAGES: the member and his messages are pending removal from the group
* - REMOVED_UNKNOWN: the member is pending removal, fallback case;
*/
type MemberStateGroupV2 =
| 'INVITE_NOT_SENT' // as soon as we've scheduled that guy to be invited, but before we've tried sending the invite message
| 'INVITE_UNKNOWN'
| 'INVITE_NOT_SENT'
| 'INVITE_FAILED'
| 'INVITE_SENT'
| 'INVITE_ACCEPTED' // regular member
| 'PROMOTION_NOT_SENT' // as soon as we've scheduled that guy to be an admin, but before we've tried sending the promotion message
| 'INVITE_ACCEPTED'
| 'PROMOTION_UNKNOWN'
| 'PROMOTION_NOT_SENT'
| 'PROMOTION_FAILED'
| 'PROMOTION_SENT'
| 'PROMOTION_ACCEPTED' // regular admin
| 'UNKNOWN';
| 'PROMOTION_ACCEPTED'
| 'REMOVED_MEMBER'
| 'REMOVED_MEMBER_AND_MESSAGES'
| 'REMOVED_UNKNOWN';

export type GroupMemberGet = GroupMemberShared & {
memberStatus: MemberStateGroupV2;

/**
* NOT_REMOVED = 0:
* REMOVED_MEMBER = 1,
* REMOVED_MEMBER_AND_MESSAGES = 2;
*/
removedStatus: 'NOT_REMOVED' | 'REMOVED_MEMBER' | 'REMOVED_MEMBER_AND_MESSAGES' | 'UNKNOWN';
/**
* True if the member is scheduled to get the keys (.admin field of libsession).
* True if the member is scheduled to get the keys (`.admin` field of libsession).
* This is equivalent of memberStatus being one of:
* - PROMOTION_UNKNOWN
* - PROMOTION_NOT_SENT
* - PROMOTION_FAILED
* - PROMOTION_SENT
* - PROMOTION_ACCEPTED
*
* We display the "crown" on top of the member's avatar when this field is true
*/
nominatedAdmin: boolean;
};
Expand Down
Loading