52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
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]);
|
|
}
|
|
}
|