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:
@@ -0,0 +1,27 @@
|
||||
-- +goose Up
|
||||
-- Per-game blocks of a disguised-robot opponent. A disguised robot is a shared pool
|
||||
-- account reused across games under different per-game names, so it must never go into
|
||||
-- `blocks` (that would make the same robot look blocked in the blocker's other games under
|
||||
-- other names, leaking that it is a bot, and show its pool name instead of the one seen).
|
||||
-- Each such block is recorded here against the specific game + seat, snapshotting the name
|
||||
-- the player saw, so the blocked list shows it as a distinct personality and the in-game
|
||||
-- card re-marks that one seat. The real robot account is never blocked, so the matchmaker
|
||||
-- leaves robots free. Unblocking deletes the row.
|
||||
SET search_path = backend, pg_catalog;
|
||||
|
||||
CREATE TABLE robot_blocks (
|
||||
id uuid PRIMARY KEY,
|
||||
blocker_id uuid NOT NULL REFERENCES accounts (account_id) ON DELETE CASCADE,
|
||||
game_id uuid NOT NULL REFERENCES games (game_id) ON DELETE CASCADE,
|
||||
seat smallint NOT NULL,
|
||||
robot_id uuid NOT NULL REFERENCES accounts (account_id) ON DELETE CASCADE,
|
||||
display_name text NOT NULL,
|
||||
created_at timestamptz NOT NULL DEFAULT now(),
|
||||
UNIQUE (blocker_id, game_id, seat)
|
||||
);
|
||||
|
||||
CREATE INDEX robot_blocks_blocker_idx ON robot_blocks (blocker_id);
|
||||
|
||||
-- +goose Down
|
||||
SET search_path = backend, pg_catalog;
|
||||
DROP TABLE robot_blocks;
|
||||
Reference in New Issue
Block a user