11import { open } from "sqlite" ;
22import sqlite3 from "sqlite3" ;
33import { UserError } from "./error" ;
4+ import { flagQuery , withFlag , type Flag } from "./flags" ;
45import logger from "./logger" ;
56
67const db = await open ( {
@@ -15,8 +16,11 @@ export type LinkEntry = {
1516 discordId : string ;
1617 uuid : string ;
1718 rank : number ;
19+ flags : number ;
1820} ;
1921
22+ type InputLinkEntry = Omit < LinkEntry , "flags" > & Partial < LinkEntry > ;
23+
2024export type RoleEntry = {
2125 id : string ;
2226 rank : number ;
@@ -37,24 +41,29 @@ async function getLinkByDiscordId(discordId: string) {
3741 ] ) ;
3842}
3943
40- async function updateLink ( existing : LinkEntry , values : LinkEntry ) {
41- if ( values . rank === existing . rank && values . uuid === existing . uuid ) {
44+ async function updateLink ( existing : LinkEntry , values : InputLinkEntry ) {
45+ const next = { ...existing , ...values } ;
46+ if (
47+ next . rank === existing . rank &&
48+ next . uuid === existing . uuid &&
49+ next . flags === existing . flags
50+ ) {
4251 logger . debug ( "skipped linking, all values are the same" ) ;
4352 return ;
4453 }
4554
46- await db . run ( "UPDATE Link SET uuid = ?, rank = ? WHERE discordId = ?" , [
47- values . uuid ,
48- values . rank ,
49- values . discordId ,
50- ] ) ;
55+ await db . run (
56+ "UPDATE Link SET uuid = ?, rank = ?, flags = ? WHERE discordId = ?" ,
57+ [ next . uuid , next . rank , next . flags , next . discordId ]
58+ ) ;
5159
60+ const prettyFlags = next . flags . toString ( 2 ) . padStart ( 8 , "0" ) ;
5261 logger . debug (
53- `updated ${ values . discordId } <-> ${ values . uuid } (${ values . rank } )`
62+ `updated ${ next . discordId } <-> ${ next . uuid } (${ next . rank } / ${ prettyFlags } )`
5463 ) ;
5564}
5665
57- export async function persistLink ( link : LinkEntry ) {
66+ export async function persistLink ( link : InputLinkEntry ) {
5867 const existing = await getLinkByDiscordId ( link . discordId ) ;
5968
6069 if ( existing ) {
@@ -73,11 +82,19 @@ export async function persistLink(link: LinkEntry) {
7382 }
7483}
7584
76- export async function updateRank ( discordId : string , rank : number ) {
85+ async function requireLink ( discordId : string ) {
7786 const link = await getLinkByDiscordId ( discordId ) ;
78- if ( ! link )
79- throw new UserError ( "you have not linked your minecraft account yet" ) ;
87+ if ( link ) return link ;
88+ throw new UserError ( "you have not linked your minecraft account yet" ) ;
89+ }
90+
91+ export async function addFlag ( discordId : string , flag : Flag ) {
92+ const link = await requireLink ( discordId ) ;
93+ await updateLink ( link , withFlag ( link , flag ) ) ;
94+ }
8095
96+ export async function updateRank ( discordId : string , rank : number ) {
97+ const link = await requireLink ( discordId ) ;
8198 await updateLink ( link , { ...link , rank } ) ;
8299}
83100
@@ -89,6 +106,13 @@ export async function loadSupporterUuids(aboveRank: number) {
89106 return entries . map ( ( it ) => it . uuid ) ;
90107}
91108
109+ export async function loadFlaggedUuids ( flag : Flag ) {
110+ const entries = await db . all < LinkEntry [ ] > (
111+ `SELECT uuid FROM Link WHERE ${ flagQuery ( flag ) } `
112+ ) ;
113+ return entries . map ( ( it ) => it . uuid ) ;
114+ }
115+
92116export async function loadSupporterRoles ( ) {
93117 return await db . all < RoleEntry [ ] > ( "SELECT * FROM Role ORDER BY rank DESC" ) ;
94118}
0 commit comments