epitoulouse-bot/src/state.ts

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]);
}
}