diff --git a/libsession-util b/libsession-util index c29c934..1ed9170 160000 --- a/libsession-util +++ b/libsession-util @@ -1 +1 @@ -Subproject commit c29c93457eb6abfdb9e13af378cc67a2dc68115d +Subproject commit 1ed9170c7329512f78b25cb2bcb7ecaa9a416d39 diff --git a/src/groups/meta_group_wrapper.cpp b/src/groups/meta_group_wrapper.cpp index c6e2752..7ea178e 100644 --- a/src/groups/meta_group_wrapper.cpp +++ b/src/groups/meta_group_wrapper.cpp @@ -396,7 +396,10 @@ Napi::Value MetaGroupWrapper::memberGetAllPendingRemovals(const Napi::CallbackIn return wrapResult(info, [&] { std::vector 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); } } diff --git a/src/groups/meta_group_wrapper.hpp b/src/groups/meta_group_wrapper.hpp index 2b2562c..f40c219 100644 --- a/src/groups/meta_group_wrapper.hpp +++ b/src/groups/meta_group_wrapper.hpp @@ -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 { @@ -25,43 +26,57 @@ struct toJs_impl { 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; } }; diff --git a/types/groups/groupmembers.d.ts b/types/groups/groupmembers.d.ts index b414105..2ebcc7a 100644 --- a/types/groups/groupmembers.d.ts +++ b/types/groups/groupmembers.d.ts @@ -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; };