fix(social): robot blocks
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 17s
CI / ui (pull_request) Successful in 52s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m21s
CI / changes (pull_request) Successful in 3s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 17s
CI / ui (pull_request) Successful in 52s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m21s
Blocking an auto-match opponent who is secretly a pooled robot is recorded instead in a separate `robot_blocks` table. Now blocking behaves the same in that game (struck name, hidden composer) and lists the blocked opponent under the name you saw, but is recorded only against that game — the disguise holds, the shared robot is never globally blocked, and the matchmaker keeps pairing you with robots (so you can never block yourself out of opponents). - the shared robot account is never put in `blocks` - the matchmaker keeps it free and it is not blocked under its other per-game names - the blocked list and the in-game card still show it by joining that table; an unblock deletes the row
This commit is contained in:
@@ -17,8 +17,10 @@
|
||||
let busy = $state(false);
|
||||
let tick = $state(0);
|
||||
// The opponents the viewer has blocked: when every opponent is blocked the composer is hidden
|
||||
// (only the chat log remains), matching the backend guard that rejects messaging a blocked peer.
|
||||
// (only the chat log remains). blockedIds are blocked humans (by account); blockedRobotSeats are
|
||||
// the seats of blocked disguised robots in this game (a robot block is per game+seat).
|
||||
let blockedIds = $state(new Set<string>());
|
||||
let blockedRobotSeats = $state(new Set<number>());
|
||||
|
||||
const myId = $derived(app.session?.userId ?? '');
|
||||
const isMyTurn = $derived(
|
||||
@@ -40,7 +42,10 @@
|
||||
const v = view;
|
||||
if (!v) return false;
|
||||
const opponents = v.game.seats.filter((s) => s.seat !== v.seat && !!s.accountId);
|
||||
return opponents.length > 0 && opponents.every((s) => blockedIds.has(s.accountId));
|
||||
return (
|
||||
opponents.length > 0 &&
|
||||
opponents.every((s) => blockedIds.has(s.accountId) || blockedRobotSeats.has(s.seat))
|
||||
);
|
||||
});
|
||||
const nudgeCooldownSecs = 3600;
|
||||
// The nudge is one-per-hour-per-game and clears once the player chats (engagement); the
|
||||
@@ -80,7 +85,8 @@
|
||||
if (app.profile?.isGuest) return;
|
||||
try {
|
||||
const bl = await gateway.blocksList();
|
||||
blockedIds = new Set(bl.map((b) => b.accountId));
|
||||
blockedIds = new Set(bl.blocked.map((b) => b.accountId));
|
||||
blockedRobotSeats = new Set(bl.robots.filter((r) => r.gameId === id).map((r) => r.seat));
|
||||
} catch {
|
||||
/* best-effort */
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user