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:
@@ -35,15 +35,23 @@ func (svc *Service) Block(ctx context.Context, blockerID, blockedID uuid.UUID) e
|
||||
return nil
|
||||
}
|
||||
|
||||
// Unblock removes blockerID's block on blockedID and confirms it to the (former)
|
||||
// blocker with a user_unblocked event so their open game screens restore the controls
|
||||
// and un-strike the name in place. Any friendship the block had been overriding becomes
|
||||
// effective again. It is idempotent.
|
||||
func (svc *Service) Unblock(ctx context.Context, blockerID, blockedID uuid.UUID) error {
|
||||
if err := svc.store.deleteBlock(ctx, blockerID, blockedID); err != nil {
|
||||
// Unblock removes blockerID's block on the given target and confirms it to the (former)
|
||||
// blocker with a user_unblocked event so their open game screens restore the controls and
|
||||
// un-strike the name in place. The target is either a blocked human's account id (the
|
||||
// blocks table) or a robot_blocks row id (a per-game disguised-robot block) — the robot
|
||||
// block is tried first, falling back to the human block. Any friendship the block had been
|
||||
// overriding becomes effective again. It is idempotent.
|
||||
func (svc *Service) Unblock(ctx context.Context, blockerID, target uuid.UUID) error {
|
||||
removed, err := svc.store.deleteRobotBlock(ctx, blockerID, target)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
svc.pub.Publish(notify.NotificationAccount(blockerID, notify.NotifyUserUnblocked, svc.accountRef(ctx, blockedID)))
|
||||
if !removed {
|
||||
if err := svc.store.deleteBlock(ctx, blockerID, target); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
svc.pub.Publish(notify.NotificationAccount(blockerID, notify.NotifyUserUnblocked, svc.accountRef(ctx, target)))
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user