c127bc9f0e
CI / changes (pull_request) Successful in 1s
CI / unit (pull_request) Successful in 9s
CI / integration (pull_request) Successful in 13s
CI / ui (pull_request) Successful in 54s
CI / gate (pull_request) Successful in 0s
CI / deploy (pull_request) Successful in 1m25s
Functional: the in-game add-friend handshake aimed at an auto-match opponent who is secretly a pooled robot now records the request per (game, seat) in a new robot_friend_requests table -- never against the shared robot account -- mirroring the robot_blocks pattern. The shared account stays out of friendships, the "requested" state is pinned to the seat (not leaked across the player's other games), the robot ignores it, and a background reaper drops the row 7 days after its game finishes. The outgoing-requests list carries these per-game rows so the seat control stays disabled across reloads. No withdraw UI, per owner decision. Cosmetics: - Lobby: an in-progress game tints the viewer's own score number green when leading or tied, red when trailing (reusing --ok/--danger); scores now render in seat-number order, matching the over-the-board scoreboard. - Stats: the per-variant best move is laid out on two lines -- the variant label, then the score (right-aligned in its column) and the word tiles (left-aligned) below it. - Dark theme: the played-tile background is a touch darker so a player-placed tile reads with more contrast (light theme unchanged). Docs (ARCHITECTURE, FUNCTIONAL + _ru mirror, backend README, UI_DESIGN) updated in the same change.
83 lines
2.9 KiB
TypeScript
83 lines
2.9 KiB
TypeScript
// automatically generated by the FlatBuffers compiler, do not modify
|
|
|
|
import * as flatbuffers from 'flatbuffers';
|
|
|
|
export class RobotFriendRef {
|
|
bb: flatbuffers.ByteBuffer|null = null;
|
|
bb_pos = 0;
|
|
__init(i:number, bb:flatbuffers.ByteBuffer):RobotFriendRef {
|
|
this.bb_pos = i;
|
|
this.bb = bb;
|
|
return this;
|
|
}
|
|
|
|
static getRootAsRobotFriendRef(bb:flatbuffers.ByteBuffer, obj?:RobotFriendRef):RobotFriendRef {
|
|
return (obj || new RobotFriendRef()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
|
|
}
|
|
|
|
static getSizePrefixedRootAsRobotFriendRef(bb:flatbuffers.ByteBuffer, obj?:RobotFriendRef):RobotFriendRef {
|
|
bb.setPosition(bb.position() + flatbuffers.SIZE_PREFIX_LENGTH);
|
|
return (obj || new RobotFriendRef()).__init(bb.readInt32(bb.position()) + bb.position(), bb);
|
|
}
|
|
|
|
id():string|null
|
|
id(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
|
|
id(optionalEncoding?:any):string|Uint8Array|null {
|
|
const offset = this.bb!.__offset(this.bb_pos, 4);
|
|
return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
|
|
}
|
|
|
|
displayName():string|null
|
|
displayName(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
|
|
displayName(optionalEncoding?:any):string|Uint8Array|null {
|
|
const offset = this.bb!.__offset(this.bb_pos, 6);
|
|
return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
|
|
}
|
|
|
|
gameId():string|null
|
|
gameId(optionalEncoding:flatbuffers.Encoding):string|Uint8Array|null
|
|
gameId(optionalEncoding?:any):string|Uint8Array|null {
|
|
const offset = this.bb!.__offset(this.bb_pos, 8);
|
|
return offset ? this.bb!.__string(this.bb_pos + offset, optionalEncoding) : null;
|
|
}
|
|
|
|
seat():number {
|
|
const offset = this.bb!.__offset(this.bb_pos, 10);
|
|
return offset ? this.bb!.readInt32(this.bb_pos + offset) : 0;
|
|
}
|
|
|
|
static startRobotFriendRef(builder:flatbuffers.Builder) {
|
|
builder.startObject(4);
|
|
}
|
|
|
|
static addId(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset) {
|
|
builder.addFieldOffset(0, idOffset, 0);
|
|
}
|
|
|
|
static addDisplayName(builder:flatbuffers.Builder, displayNameOffset:flatbuffers.Offset) {
|
|
builder.addFieldOffset(1, displayNameOffset, 0);
|
|
}
|
|
|
|
static addGameId(builder:flatbuffers.Builder, gameIdOffset:flatbuffers.Offset) {
|
|
builder.addFieldOffset(2, gameIdOffset, 0);
|
|
}
|
|
|
|
static addSeat(builder:flatbuffers.Builder, seat:number) {
|
|
builder.addFieldInt32(3, seat, 0);
|
|
}
|
|
|
|
static endRobotFriendRef(builder:flatbuffers.Builder):flatbuffers.Offset {
|
|
const offset = builder.endObject();
|
|
return offset;
|
|
}
|
|
|
|
static createRobotFriendRef(builder:flatbuffers.Builder, idOffset:flatbuffers.Offset, displayNameOffset:flatbuffers.Offset, gameIdOffset:flatbuffers.Offset, seat:number):flatbuffers.Offset {
|
|
RobotFriendRef.startRobotFriendRef(builder);
|
|
RobotFriendRef.addId(builder, idOffset);
|
|
RobotFriendRef.addDisplayName(builder, displayNameOffset);
|
|
RobotFriendRef.addGameId(builder, gameIdOffset);
|
|
RobotFriendRef.addSeat(builder, seat);
|
|
return RobotFriendRef.endRobotFriendRef(builder);
|
|
}
|
|
}
|