From 0291c73e80c88c09e0f4d2f617badcdf2e5aed68 Mon Sep 17 00:00:00 2001 From: Mari Date: Sun, 6 Nov 2022 12:04:19 -0500 Subject: [PATCH] Continued progress on character creation --- src/commands/character/create.ts | 6 ++-- src/commands/character/index.ts | 6 ++-- src/commands/index.ts | 4 +-- src/database/battle_types.ts | 4 +-- src/database/characters.ts | 32 ++++++++++++++++++++ src/database/{gender.ts => genders.ts} | 4 +-- src/database/index.ts | 28 +++++++++-------- src/database/users.ts | 4 +-- src/managers/battle_types.ts | 6 ++-- src/managers/{character.ts => characters.ts} | 9 +++++- src/managers/{gender.ts => genders.ts} | 8 ++--- src/managers/index.ts | 2 +- src/managers/users.ts | 6 ++-- 13 files changed, 81 insertions(+), 38 deletions(-) create mode 100644 src/database/characters.ts rename src/database/{gender.ts => genders.ts} (95%) rename src/managers/{character.ts => characters.ts} (55%) rename src/managers/{gender.ts => genders.ts} (97%) diff --git a/src/commands/character/create.ts b/src/commands/character/create.ts index 273969e..620f274 100644 --- a/src/commands/character/create.ts +++ b/src/commands/character/create.ts @@ -1,6 +1,6 @@ import {ApplicationCommandOptionType, ApplicationCommandSubCommandData, ChatInputCommandInteraction} from "discord.js" import {SubcommandData} from "../types" -import {UsersTable} from "../../database/users.js" +import {UserTable} from "../../database/users.js" export class CharacterCreateCommand extends SubcommandData { readonly definition: ApplicationCommandSubCommandData = { @@ -68,9 +68,9 @@ export class CharacterCreateCommand extends SubcommandData { }, ], } - private readonly _users: UsersTable + private readonly _users: UserTable - constructor({users}: { users: UsersTable }) { + constructor({users}: { users: UserTable }) { super() this._users = users } diff --git a/src/commands/character/index.ts b/src/commands/character/index.ts index cf9ce33..1a2f71f 100644 --- a/src/commands/character/index.ts +++ b/src/commands/character/index.ts @@ -1,14 +1,14 @@ import {ApplicationCommandOptionType, ApplicationCommandSubCommandData, ApplicationCommandType} from "discord.js" import {BaseChatInputCommandData, CommandWithSubcommandsData, SubcommandData} from "../types" -import {UsersTable} from "../../database/users.js" +import {UserTable} from "../../database/users.js" import {CharacterCreateCommand} from "./create.js" export class CharacterCommand extends CommandWithSubcommandsData { readonly create: CharacterCreateCommand readonly subcommands: SubcommandData[] - private readonly _users: UsersTable + private readonly _users: UserTable - constructor({users}: { users: UsersTable }) { + constructor({users}: { users: UserTable }) { super() this._users = users this.create = new CharacterCreateCommand({users}) diff --git a/src/commands/index.ts b/src/commands/index.ts index 438e7cb..4c8173e 100644 --- a/src/commands/index.ts +++ b/src/commands/index.ts @@ -10,7 +10,7 @@ import { import {CharacterCommand} from "./character/index" import {autocompleteNotImplementedError, CommandData} from "./types" import {BotCommand} from "./bot/index" -import {UsersTable} from "../database/users.js" +import {UserTable} from "../database/users.js" export const invalidCommandError = "No command by that name exists." @@ -21,7 +21,7 @@ export class Commands { readonly definitions: ApplicationCommandDataResolvable[] private readonly _nameCache: Record - constructor({users, cleanUp}: { users: UsersTable, cleanUp: () => Promise }) { + constructor({users, cleanUp}: { users: UserTable, cleanUp: () => Promise }) { this.character = new CharacterCommand({users}) this.bot = new BotCommand({users, cleanUp}) this.all = [ diff --git a/src/database/battle_types.ts b/src/database/battle_types.ts index 1bc15a1..46f1461 100644 --- a/src/database/battle_types.ts +++ b/src/database/battle_types.ts @@ -18,11 +18,11 @@ export interface BattleTypeTablesData { relationships: BattleTypeRelationshipData[] } -export interface BattleTypeTables { +export interface BattleTypeTable { getTypesAndRelationships(): Promise } -export class BattleTypeTablesImpl implements BattleTypeTables { +export class BattleTypeTableImpl implements BattleTypeTable { private readonly _transact: TransactType constructor({transact}: { transact: TransactType }) { diff --git a/src/database/characters.ts b/src/database/characters.ts new file mode 100644 index 0000000..4c16254 --- /dev/null +++ b/src/database/characters.ts @@ -0,0 +1,32 @@ +import {TransactType} from "./index"; + +export interface CharacterTable { + clearOrCreateCharacterEditor(options: {userId: string, deleteFirst: boolean}): Promise<{inserted: number, deleted: number}> +} + +export class CharacterTableImpl implements CharacterTable { + private readonly _transact: TransactType + + constructor({transact}: { transact: TransactType }) { + this._transact = transact + } + + async clearOrCreateCharacterEditor( + {userId, deleteFirst}: { userId: string; deleteFirst: boolean }): Promise<{ inserted: number, deleted: number }> { + const result = { + inserted: 0, + deleted: 0, + } + await this._transact({ + readonly: false, + async transaction(query) { + result.deleted = deleteFirst + ? (await query("DELETE FROM character_creation WHERE id = $1", [userId])).rowCount + : 0 + result.inserted = + (await query("INSERT INTO character_creation (id) VALUES ($1) ON CONFLICT (id) DO NOTHING")).rowCount + } + }) + return result + } +} \ No newline at end of file diff --git a/src/database/gender.ts b/src/database/genders.ts similarity index 95% rename from src/database/gender.ts rename to src/database/genders.ts index ea4410d..6407b3e 100644 --- a/src/database/gender.ts +++ b/src/database/genders.ts @@ -24,11 +24,11 @@ export interface GenderTablesData { markers: GenderMarkerData[] } -export interface GenderTables { +export interface GenderTable { getPronounsAndMarkers(): Promise } -export class GenderTablesImpl implements GenderTables { +export class GenderTablesImpl implements GenderTable { private readonly _transact: TransactType constructor({transact}: { transact: TransactType }) { diff --git a/src/database/index.ts b/src/database/index.ts index 19365ac..4cef734 100644 --- a/src/database/index.ts +++ b/src/database/index.ts @@ -1,7 +1,8 @@ import {QueryResult, QueryResultRow} from "pg" -import {UsersTable, UsersTableImpl} from "./users.js" -import {BattleTypeTables, BattleTypeTablesImpl} from "./battle_types"; -import {GenderTables, GenderTablesImpl} from "./gender"; +import {UserTable, UserTableImpl} from "./users.js" +import {BattleTypeTable, BattleTypeTableImpl} from "./battle_types"; +import {GenderTable, GenderTablesImpl} from "./genders"; +import {CharacterTable, CharacterTableImpl} from "./characters"; export interface PoolLike { connect(): Promise @@ -47,9 +48,10 @@ export function makeTransact(p: PoolLike): TransactType { } export interface Database { - readonly users: UsersTable - readonly gender: GenderTables - readonly battleTypes: BattleTypeTables + readonly characters: CharacterTable + readonly users: UserTable + readonly genders: GenderTable + readonly battleTypes: BattleTypeTable } export interface Queryable { @@ -63,13 +65,15 @@ export type QueryType = Queryable["query"] export type TransactType = (config: {readonly?: boolean, transaction: (client: QueryType, attempts: number) => Promise}) => Promise export class DatabaseImpl implements Database { - readonly users: UsersTableImpl - readonly gender: GenderTables - readonly battleTypes: BattleTypeTablesImpl + readonly characters: CharacterTableImpl + readonly users: UserTableImpl + readonly genders: GenderTable + readonly battleTypes: BattleTypeTableImpl constructor({query, transact}: { query: QueryType, transact: TransactType }) { - this.users = new UsersTableImpl({query}) - this.gender = new GenderTablesImpl({transact}) - this.battleTypes = new BattleTypeTablesImpl({transact}) + this.characters = new CharacterTableImpl({transact}) + this.users = new UserTableImpl({query}) + this.genders = new GenderTablesImpl({transact}) + this.battleTypes = new BattleTypeTableImpl({transact}) } } \ No newline at end of file diff --git a/src/database/users.ts b/src/database/users.ts index b90c706..d7dd5b9 100644 --- a/src/database/users.ts +++ b/src/database/users.ts @@ -1,6 +1,6 @@ import {QueryType} from "./index.js" -export interface UsersTable { +export interface UserTable { createUserOrUpdateActiveTime(id: string): Promise getUserExistsAndIsAdmin(id: string): Promise @@ -8,7 +8,7 @@ export interface UsersTable { createOrSetUserAsAdmin(id: string): Promise } -export class UsersTableImpl implements UsersTable { +export class UserTableImpl implements UserTable { private readonly _query: QueryType constructor({query}: { query: QueryType }) { diff --git a/src/managers/battle_types.ts b/src/managers/battle_types.ts index e1538fc..19ad88b 100644 --- a/src/managers/battle_types.ts +++ b/src/managers/battle_types.ts @@ -1,4 +1,4 @@ -import {BattleTypeTables} from "../database/battle_types"; +import {BattleTypeTable} from "../database/battle_types"; export interface BattleType { id: string, @@ -14,9 +14,9 @@ export class BattleTypeManager { private cachedTypeList: BattleType[] = [] private refreshPromise: Promise|null = null - private readonly _table: BattleTypeTables + private readonly _table: BattleTypeTable - constructor({battleTypes}: { battleTypes: BattleTypeTables }) { + constructor({battleTypes}: { battleTypes: BattleTypeTable }) { this._table = battleTypes } diff --git a/src/managers/character.ts b/src/managers/characters.ts similarity index 55% rename from src/managers/character.ts rename to src/managers/characters.ts index edbd959..2a90777 100644 --- a/src/managers/character.ts +++ b/src/managers/characters.ts @@ -1,7 +1,14 @@ import {Snowflake} from "discord-api-types/globals"; +import {CharacterTable} from "../database/characters"; export class CharacterManager { - async startNewCharacter(user: Snowflake, forceErase: boolean): Promise<{alreadyEditing: boolean}> { + private + + constructor({characters}: {characters: CharacterTable}) { + } + + async startNewCharacter(user: Snowflake, overwrite: boolean): Promise<{alreadyEditing: boolean, created: boolean}> { + } async abandonEditedCharacter(user: Snowflake): Promise<{abandoned: boolean}> { diff --git a/src/managers/gender.ts b/src/managers/genders.ts similarity index 97% rename from src/managers/gender.ts rename to src/managers/genders.ts index 5ae926a..5ba5a38 100644 --- a/src/managers/gender.ts +++ b/src/managers/genders.ts @@ -1,4 +1,4 @@ -import {GenderTables} from "../database/gender"; +import {GenderTable} from "../database/genders"; export interface Pronouns { id: string @@ -27,10 +27,10 @@ export class GenderManager { private cachedMarkerList: GenderMarker[] = [] private refreshPromise: Promise|null = null - private readonly _table: GenderTables + private readonly _table: GenderTable - constructor({gender}: { gender: GenderTables }) { - this._table = gender + constructor({genders}: { genders: GenderTable }) { + this._table = genders } async refreshCache(): Promise { diff --git a/src/managers/index.ts b/src/managers/index.ts index 2860378..3f6f542 100644 --- a/src/managers/index.ts +++ b/src/managers/index.ts @@ -1,6 +1,6 @@ import {BattleTypeManager} from "./battle_types"; import {UsersManager} from "./users"; -import {GenderManager} from "./gender"; +import {GenderManager} from "./genders"; import {Database} from "../database"; export class Managers { diff --git a/src/managers/users.ts b/src/managers/users.ts index dcc9ad4..eee4705 100644 --- a/src/managers/users.ts +++ b/src/managers/users.ts @@ -2,12 +2,12 @@ import {Snowflake} from "discord-api-types/globals"; import {parse as uuidParse, v1 as uuidV1, validate as uuidValidate, version as uuidVersion} from "uuid"; import {SnowflakeUtil} from "discord.js"; import {fast1a52 as fnvFast1a52} from "fnv-plus"; -import {UsersTable} from "../database/users"; +import {UserTable} from "../database/users"; export class UsersManager { - private readonly _table: UsersTable + private readonly _table: UserTable - constructor({users}: { users: UsersTable }) { + constructor({users}: { users: UserTable }) { this._table = users }