1
+ import fs , { read } from 'fs'
2
+ import { getUUID } from './usercache.js'
3
+
4
+ export class Database {
5
+ #file
6
+ #users = { }
7
+ #removed = new Set ( )
8
+
9
+ constructor ( file ) {
10
+ this . #file = file
11
+ this . load ( )
12
+ this . save ( )
13
+ }
14
+
15
+ load ( ) {
16
+ if ( ! fs . existsSync ( this . #file) ) return
17
+ const data = JSON . parse ( fs . readFileSync ( this . #file) )
18
+ this . #users = data . users
19
+ for ( const user in this . #users) {
20
+ this . #users[ user ] . uuids = this . #users[ user ] . uuids || [ ]
21
+ }
22
+ this . #removed = new Set ( data . removed || [ ] )
23
+ }
24
+
25
+ save ( ) {
26
+ fs . writeFileSync ( this . #file, JSON . stringify ( this . dump ( ) , null , 2 ) )
27
+ }
28
+
29
+ dump ( ) {
30
+ return {
31
+ users : this . #users,
32
+ removed : [ ...this . #removed]
33
+ }
34
+ }
35
+
36
+ async convertNamesToUuids ( ) {
37
+ const names = new Set ( )
38
+ for ( const user in this . #users) {
39
+ for ( const name of this . #users[ user ] . names || [ ] ) {
40
+ names . add ( name )
41
+ }
42
+ }
43
+ if ( ! names . size ) return false
44
+ const uuids = await getUUID ( [ ...names ] )
45
+ for ( const user in this . #users) {
46
+ const userUuids = new Set ( this . #users[ user ] . uuids )
47
+ for ( const name of this . #users[ user ] . names || [ ] ) {
48
+ const uuidForName = uuids [ name . toLowerCase ( ) ]
49
+ if ( ! uuidForName ) {
50
+ console . warn ( 'Invalid username ' + name + ', skipping' )
51
+ } else {
52
+ userUuids . add ( uuidForName )
53
+ }
54
+ }
55
+ this . #users[ user ] . uuids = [ ...userUuids ]
56
+ delete this . #users[ user ] . names
57
+ }
58
+ for ( const name in uuids ) this . #removed. delete ( uuids [ name ] )
59
+ this . save ( )
60
+ return true
61
+ }
62
+
63
+ getUser ( id ) {
64
+ return this . #users[ id ] || { uuids : [ ] }
65
+ }
66
+
67
+ getAllByUUID ( ) {
68
+ const byUuid = { }
69
+ for ( const id in this . #users) {
70
+ for ( const uuid of this . #users[ id ] . uuids ) {
71
+ byUuid [ uuid ] = id
72
+ }
73
+ }
74
+ return byUuid
75
+ }
76
+
77
+ getBannedUUIDs ( ) {
78
+ const banned = new Set ( )
79
+ for ( const user of Object . values ( this . #users) ) {
80
+ if ( ! user . banned ) continue
81
+ for ( const uuid of user . uuids ) {
82
+ banned . add ( uuid )
83
+ }
84
+ }
85
+ return banned
86
+ }
87
+
88
+ getLinkedUser ( uuid ) {
89
+ for ( const id in this . #users) {
90
+ if ( this . #users[ id ] . uuids . includes ( uuid ) ) return { id, user : this . #users[ id ] }
91
+ }
92
+ }
93
+
94
+ linkUser ( id , uuid ) {
95
+ const user = this . getUser ( id )
96
+ user . uuids = [ ...new Set ( [ ...user . uuids , uuid ] ) ]
97
+ this . #users[ id ] = user
98
+ this . #removed. delete ( uuid )
99
+ this . save ( )
100
+ return user
101
+ }
102
+
103
+ unlinkUser ( id , uuid ) {
104
+ const user = this . getUser ( id )
105
+ const uuids = new Set ( user . uuids )
106
+ uuids . delete ( uuid )
107
+ user . uuids = [ ...uuids ]
108
+ if ( user . uuids . length ) {
109
+ this . #users[ id ] = user
110
+ } else {
111
+ delete this . #users[ id ]
112
+ }
113
+ this . #removed. add ( uuid )
114
+ this . save ( )
115
+ return user
116
+ }
117
+
118
+ removeUser ( id ) {
119
+ const user = this . #users[ id ]
120
+ delete this . #users[ id ]
121
+ for ( const uuid of user . uuids ) {
122
+ this . #removed. add ( uuid )
123
+ }
124
+ this . save ( )
125
+ return user
126
+ }
127
+
128
+ get removed ( ) {
129
+ return [ ...this . #removed]
130
+ }
131
+ }
0 commit comments