import { v1 as uuid } from "https://deno.land/std@0.213.0/uuid/mod.ts"; export type StoredUser = { discord_user_id: string; cri_login: string }; export class State { kv; constructor(kv: Deno.Kv) { this.kv = kv; } public static async from_dir(local_path: string) { await Deno.mkdir(local_path, { recursive: true }); const kv = await Deno.openKv(local_path + "/kv"); return new State(kv); } public async *users() { const query = this.kv.list({ prefix: ["users/"] }); for await (const { value } of query) yield value as StoredUser; } public async users_count() { let result = 0; for await (const _ of this.users()) result += 1; return result; } public async get_user(discord_user_id: string) { const { value: user_uuid } = await this.kv.get(["users_by_discord_id/", discord_user_id]); if (user_uuid === null) return undefined; const { value: stored } = await this.kv.get(["users/", user_uuid as string]); return stored as StoredUser; } public async set_user(discord_user_id: string, cri_login: string) { await this.remove_user(discord_user_id); await this.add_user(discord_user_id, cri_login); } private async add_user(discord_user_id: string, cri_login: string) { const user_uuid = uuid.generate() as string; const stored: StoredUser = { discord_user_id, cri_login }; await this.kv.set(["users/", user_uuid], stored); await this.kv.set(["users_by_discord_id/", discord_user_id], user_uuid); } private async remove_user(discord_user_id: string) { const { value: user_uuid } = await this.kv.get(["users_by_discord_id/", discord_user_id]); if (user_uuid === null) return undefined; await this.kv.delete(["users/", user_uuid as string]); await this.kv.delete(["users_by_discord_id/", discord_user_id]); } }