import { OutcomeType, PlayerGameResults, PlayerStats, PlayerStatsUpdater } from "./stats"; import { getMongoObjectCollection, MongoStoredObject, MongoStoredObjectCollection, StoredObject, StoredObjectCollection, tryQuery, } from "./utils"; import {CellValue} from "../controllers/statsController"; import mongo from "mongodb"; import {Ruleset} from "../rulesets"; export interface CellDetails { id: string; value: CellValue; } export interface StoredPlayerData { _id: string; nick: string; stats: PlayerStats; } interface StoredPlayerCollection extends StoredObjectCollection { } class MongoStoredPlayerCollection extends MongoStoredObjectCollection implements StoredPlayerCollection { private updater: PlayerStatsUpdater; constructor(collectionClient: mongo.Collection) { super(collectionClient, MongoStoredPlayer); this.updater = new PlayerStatsUpdater(); } newPlayer(nick: string): Promise { return tryQuery(async () => { return this.create({nick}); }); } } export interface StoredPlayer extends StoredObject { nick(): string; setNick(newNick: string): Promise; updateStats(results: PlayerGameResults & {outcome: OutcomeType}, ruleset: Ruleset): Promise; } export class MongoStoredPlayer extends MongoStoredObject implements StoredPlayer { constructor(data: StoredPlayerData) { super(data); } nick(): string { return this.data.nick; } async setNick(newNick: string): Promise { this.data.nick = newNick; } async updateStats(playerGameResults: PlayerGameResults & {outcome: OutcomeType}, ruleset: Ruleset) { const statsUpdater = new PlayerStatsUpdater(this.data.stats); await statsUpdater.updateStats(playerGameResults, ruleset); } } const StoredPlayers = new MongoStoredPlayerCollection(getMongoObjectCollection("players")); export default StoredPlayers;