Skip to content

Commit 0cbff68

Browse files
Add possibility to invite users to public channels. Change moderation events channel (#22)
Add possibility to invite users to public channels. Add missing filtering during invitations. Change moderation events to be sent to "PUBNUB_INTERNAL_MODERATION.{user_id}" channel.
1 parent 907611b commit 0cbff68

File tree

5 files changed

+36
-35
lines changed

5 files changed

+36
-35
lines changed

src/application/membership_service.cpp

+18-24
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,15 @@ Membership MembershipService::invite_to_channel(const String& channel_id, const
118118

119119
Channel channel = chat_service_shared->channel_service->create_channel_object({channel_id, channel_data.to_entity()});
120120

121-
if(channel.channel_data().type == String("public"))
121+
//Check if user is not a member of the channel that he is invited to
122+
Pubnub::String filter = Pubnub::String("uuid.id == \"") + user.user_id() + Pubnub::String("\"");
123+
auto members = std::get<0>(this->get_channel_members(channel_id, channel_data, filter));
124+
if(!members.empty())
122125
{
123-
throw std::runtime_error("Channel invites are not supported in Public chats");
126+
//Already a member, just return current membership
127+
return members[0];
124128
}
125129

126-
//TODO:: check here if user already is on that channel. Requires C-Core filtering
127-
128-
129130
String include_string = "custom,channel,totalCount,customChannel";
130131
String set_memeberships_obj = create_set_memberships_object(channel_id, "");
131132

@@ -145,7 +146,6 @@ Membership MembershipService::invite_to_channel(const String& channel_id, const
145146
//This channel is updated, so we need to update it in entity repository as well
146147
ChannelEntity channel_entity = ChannelEntity::from_json(channel_data_string);
147148

148-
// TODO: no custom data?
149149
Membership membership_object = this->create_membership_object(user, channel);
150150
membership_object.set_last_read_message_timetoken(get_now_timetoken());
151151
return membership_object;
@@ -157,39 +157,34 @@ std::vector<Membership> MembershipService::invite_multiple_to_channel(const Stri
157157

158158
Channel channel = chat_service_shared->channel_service->create_channel_object({channel_id, channel_data.to_entity()});
159159

160-
if(channel.channel_data().type == String("public"))
161-
{
162-
throw std::runtime_error("Channel invites are not supported in Public chats");
163-
}
164-
165-
//TODO:: check here if users already are on that channel. Requires C-Core filtering
166-
160+
std::vector<String> users_ids;
161+
String filter;
167162

168-
std::vector<String> filtered_users_ids;
169-
170-
for(auto &user : users)
163+
for(int i = 0; i < users.size(); i++)
171164
{
172-
filtered_users_ids.push_back(user.user_id());
165+
users_ids.push_back(users[i].user_id());
166+
filter += Pubnub::String("uuid.id == \"") + users[i].user_id() + Pubnub::String("\"");
167+
if(i < users.size() - 1)
168+
{
169+
filter += Pubnub::String(" || ");
170+
}
173171
}
174172

175173
String include_string = "custom,channel,totalCount,customChannel";
176-
String set_memebers_obj = create_set_members_object(filtered_users_ids, "");
174+
String set_memebers_obj = create_set_members_object(users_ids, "");
177175

178-
auto set_members_response = [this, channel_id, set_memebers_obj, include_string] {
176+
auto set_members_response = [this, channel_id, set_memebers_obj, include_string, filter] {
179177
auto pubnub_handle = this->pubnub->lock();
180-
return pubnub_handle->set_members(channel_id, set_memebers_obj, include_string);
178+
return pubnub_handle->set_members(channel_id, set_memebers_obj, include_string, filter);
181179
}();
182180

183181
std::vector<Membership> invitees_memberships;
184182

185183
json memberships_response_json = json::parse(set_members_response);
186184
json memberships_data_array = memberships_response_json["data"];
187-
188-
String test = memberships_data_array.dump();
189185

190186
for (json::iterator single_data_json = memberships_data_array.begin(); single_data_json != memberships_data_array.end(); ++single_data_json)
191187
{
192-
// TODO: @kamil - check if this assumption is correct
193188
auto user = std::find_if(users.begin(), users.end(), [single_data_json](const User& user) {
194189
return user.user_id() == String(single_data_json.value()["uuid"]["id"]);
195190
});
@@ -198,7 +193,6 @@ std::vector<Membership> MembershipService::invite_multiple_to_channel(const Stri
198193
continue;
199194
}
200195

201-
// TODO: no custom data?
202196
Membership membership = this->create_membership_object(*user, channel);
203197
membership.set_last_read_message_timetoken(get_now_timetoken());
204198
invitees_memberships.push_back(membership);

src/application/restrictions_service.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ void RestrictionsService::set_restrictions(const String& user_id, const String&
5353
// else ignore - moderation channel already exist
5454
}
5555

56+
//Channel for moderation events is "INTERNAL_MODERATION_PREFIX.{user_id}" (INTERNAL_MODERATION_PREFIX without last _)
57+
String moderation_event_channel = INTERNAL_MODERATION_PREFIX.substring(0, INTERNAL_MODERATION_PREFIX.length() - 1) + Pubnub::String(".") + user_id;
58+
5659
//Lift restrictions
5760
if(!restrictions.ban && !restrictions.mute)
5861
{
@@ -61,7 +64,8 @@ void RestrictionsService::set_restrictions(const String& user_id, const String&
6164
pubnub_handle->remove_members(restrictions_channel, Restrictions::remove_member_payload(user_id));
6265
}
6366
String event_payload_string = Restrictions::lift_restrictions_payload(restrictions_channel, restrictions.reason);
64-
chat_service_shared->emit_chat_event(pubnub_chat_event_type::PCET_MODERATION, user_id, event_payload_string);
67+
68+
chat_service_shared->emit_chat_event(pubnub_chat_event_type::PCET_MODERATION, moderation_event_channel, event_payload_string);
6569
return;
6670
}
6771

@@ -73,8 +77,8 @@ void RestrictionsService::set_restrictions(const String& user_id, const String&
7377
}
7478
String restriction_text;
7579
restrictions.ban ? restriction_text = "banned" : "muted";
76-
String event_payload_string = String("{\"channelId\": \"") + restrictions_channel + String("\", \"restriction\": \"lifted") + restriction_text + String("\", \"reason\": \"") + restrictions.reason + String("\"}");
77-
chat_service_shared->emit_chat_event(pubnub_chat_event_type::PCET_MODERATION, user_id, event_payload_string);
80+
String event_payload_string = String("{\"channelId\": \"") + restrictions_channel + String("\", \"restriction\": \"") + restriction_text + String("\", \"reason\": \"") + restrictions.reason + String("\"}");
81+
chat_service_shared->emit_chat_event(pubnub_chat_event_type::PCET_MODERATION, moderation_event_channel, event_payload_string);
7882
}
7983

8084
Restriction RestrictionsService::get_user_restrictions(const String& user_id, const String& channel_id, const Pubnub::String &sort, int limit, const Pubnub::Page &page) const {

src/domain/restrictions.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ Pubnub::String Restrictions::remove_member_payload(const Pubnub::String &user_id
66
}
77

88
Pubnub::String Restrictions::lift_restrictions_payload(const Pubnub::String &channel_id, const Pubnub::String &reason) {
9-
return "{\"channelId\": \"" + channel_id + "\", \"restrictions\": \"lifted\", \"reason\": \"" + reason + "\"}";
9+
return "{\"channelId\": \"" + channel_id + "\", \"restriction\": \"lifted\", \"reason\": \"" + reason + "\"}";
1010
}
1111

1212
Pubnub::String Restrictions::restrict_member_payload(const Pubnub::String &user_id) {

src/infra/pubnub.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -339,13 +339,16 @@ void PubNub::remove_members(const Pubnub::String channel, const Pubnub::String m
339339
this->await_and_handle_error(result);
340340
}
341341

342-
Pubnub::String PubNub::set_members(const Pubnub::String channel, const Pubnub::String members_object, const Pubnub::String include)
342+
Pubnub::String PubNub::set_members(const Pubnub::String channel, const Pubnub::String members_object, const Pubnub::String include, const Pubnub::String filter)
343343
{
344-
auto result = pubnub_set_members(
345-
this->main_context.get(),
346-
channel,
347-
include,
348-
members_object
344+
pubnub_members_opts opt = pubnub_members_opts();
345+
opt.filter = filter;
346+
opt.include = include;
347+
auto result = pubnub_set_members_ex(
348+
this->main_context.get(),
349+
channel,
350+
members_object,
351+
opt
349352
);
350353

351354
this->await_and_handle_error(result);

src/infra/pubnub.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class PubNub {
4949
Pubnub::String get_all_channels_metadata(const Pubnub::String include, const int limit, const Pubnub::String filter, const Pubnub::String sort, const Pubnub::String page_next, const Pubnub::String page_prev);
5050
Pubnub::String get_channel_members(const Pubnub::String channel, const Pubnub::String include, const int limit, const Pubnub::String filter, const Pubnub::String sort, const Pubnub::String page_next, const Pubnub::String page_prev);
5151
void remove_members(const Pubnub::String channel, const Pubnub::String members_object);
52-
Pubnub::String set_members(const Pubnub::String channel, const Pubnub::String members_object, const Pubnub::String include = "");
52+
Pubnub::String set_members(const Pubnub::String channel, const Pubnub::String members_object, const Pubnub::String include = "", const Pubnub::String filter = "");
5353
void set_user_metadata(const Pubnub::String user_id, const Pubnub::String metadata);
5454
Pubnub::String get_user_metadata(const Pubnub::String user_id);
5555
Pubnub::String get_all_user_metadata(const Pubnub::String include, const int limit, const Pubnub::String filter, const Pubnub::String sort, const Pubnub::String page_next, const Pubnub::String page_prev);

0 commit comments

Comments
 (0)