Add tournament and multiplayer community chat moderation
All checks were successful
Deploy MineGeo to Dokploy / deploy (push) Successful in 12m17s
All checks were successful
Deploy MineGeo to Dokploy / deploy (push) Successful in 12m17s
This commit is contained in:
@@ -88,6 +88,129 @@ try {
|
||||
[dataset, secret(1), account],
|
||||
)
|
||||
).rows[0].id;
|
||||
{
|
||||
const moderationRoom = await accountRoom();
|
||||
await db.query("select public.join_multiplayer_room($1,$2,$3,$4)", [
|
||||
moderationRoom,
|
||||
secret(2),
|
||||
secondAccount,
|
||||
"Ignored",
|
||||
]);
|
||||
await db.query("select public.join_multiplayer_room($1,$2,null,$3)", [
|
||||
moderationRoom,
|
||||
secret(3),
|
||||
"Guest",
|
||||
]);
|
||||
const roster = (await act(moderationRoom, 1)).players;
|
||||
const friend = roster.find((p) => p.name === "Account friend");
|
||||
let guest = roster.find((p) => p.name === "Guest");
|
||||
const community = async (who, action, payload = {}) =>
|
||||
(
|
||||
await db.query("select public.party_community($1,$2,$3,$4) as value", [
|
||||
moderationRoom,
|
||||
secret(who),
|
||||
action,
|
||||
JSON.stringify(payload),
|
||||
])
|
||||
).rows[0].value;
|
||||
const chat = (who, text, clientId) =>
|
||||
db.query("select public.multiplayer_chat($1,$2,$3,$4)", [
|
||||
moderationRoom,
|
||||
secret(who),
|
||||
text,
|
||||
clientId,
|
||||
]);
|
||||
await assert.rejects(
|
||||
community(2, "ban", { playerId: guest.id }),
|
||||
/moderator permission/,
|
||||
);
|
||||
await community(1, "admin", { playerId: friend.id });
|
||||
await assert.rejects(
|
||||
community(2, "ban", { playerId: roster[0].id }),
|
||||
/owner or yourself/,
|
||||
);
|
||||
await community(2, "tag", { playerId: guest.id, tag: "Explorer" });
|
||||
await community(2, "slow", { seconds: 10 });
|
||||
const chatId = randomUUID();
|
||||
await chat(3, "Hello", chatId);
|
||||
await chat(3, "Hello", chatId);
|
||||
await assert.rejects(chat(3, "Too fast", randomUUID()), /slow mode/);
|
||||
await db.query(
|
||||
"update public.party_chat_cooldowns set last_message_at=clock_timestamp()-interval '11 seconds' where room_id=$1 and access_hash=$2",
|
||||
[moderationRoom, secret(3)],
|
||||
);
|
||||
await db.query(
|
||||
"update public.multiplayer_messages set created_at=clock_timestamp()-interval '11 seconds' where room_id=$1 and player_id=$2",
|
||||
[moderationRoom, guest.id],
|
||||
);
|
||||
await chat(3, "Hello", chatId);
|
||||
await chat(3, "A new message", randomUUID());
|
||||
await act(moderationRoom, 3, "leave");
|
||||
await db.query("select public.join_multiplayer_room($1,$2,null,$3)", [
|
||||
moderationRoom,
|
||||
secret(3),
|
||||
"Guest",
|
||||
]);
|
||||
guest = (await act(moderationRoom, 1)).players.find(
|
||||
(p) => p.name === "Guest",
|
||||
);
|
||||
assert.ok(guest);
|
||||
await assert.rejects(
|
||||
chat(3, "Rejoined too fast", randomUUID()),
|
||||
/slow mode/,
|
||||
);
|
||||
await db.query(
|
||||
"update public.party_chat_cooldowns set last_message_at=clock_timestamp()-interval '11 seconds' where room_id=$1 and access_hash=$2",
|
||||
[moderationRoom, secret(3)],
|
||||
);
|
||||
await assert.rejects(chat(3, "", randomUUID()), /Invalid chat message/);
|
||||
await chat(3, "Cooldown expired", randomUUID());
|
||||
const state = await community(2, "ban", { playerId: guest.id });
|
||||
await assert.rejects(
|
||||
db.query("select public.join_multiplayer_room($1,$2,null,$3)", [
|
||||
moderationRoom,
|
||||
secret(3),
|
||||
"Guest",
|
||||
]),
|
||||
/banned/,
|
||||
);
|
||||
await community(2, "unban", { banId: state.bans[0].id });
|
||||
await db.query("select public.join_multiplayer_room($1,$2,null,$3)", [
|
||||
moderationRoom,
|
||||
secret(3),
|
||||
"Guest",
|
||||
]);
|
||||
await community(1, "ban", { playerId: friend.id });
|
||||
await assert.rejects(
|
||||
db.query("select public.join_multiplayer_room($1,$2,$3,$4)", [
|
||||
moderationRoom,
|
||||
secret(8),
|
||||
secondAccount,
|
||||
"Ignored",
|
||||
]),
|
||||
/banned/,
|
||||
);
|
||||
await assert.rejects(community(2, "slow", { seconds: 0 }), /membership/);
|
||||
const privileges = (
|
||||
await db.query(`select
|
||||
has_table_privilege('anon','public.party_chat_cooldowns','select') as anon_read,
|
||||
has_table_privilege('authenticated','public.party_chat_cooldowns','select') as authenticated_read`)
|
||||
).rows[0];
|
||||
assert.equal(privileges.anon_read, false);
|
||||
assert.equal(privileges.authenticated_read, false);
|
||||
await db.query("delete from public.multiplayer_rooms where id=$1", [
|
||||
moderationRoom,
|
||||
]);
|
||||
assert.equal(
|
||||
(
|
||||
await db.query(
|
||||
"select count(*)::integer as n from public.party_chat_cooldowns where room_id=$1",
|
||||
[moderationRoom],
|
||||
)
|
||||
).rows[0].n,
|
||||
0,
|
||||
);
|
||||
}
|
||||
await assert.rejects(
|
||||
db.query(
|
||||
"select public.create_map_room($1,'normal','Guest host',4,$2,null)",
|
||||
|
||||
Reference in New Issue
Block a user