|
1 | 1 | const fs = require("fs");
|
| 2 | +const mysql = require("mysql") |
2 | 3 |
|
3 | 4 | class ServerSettings { // TODO: switch to better db system
|
4 | 5 | id;
|
@@ -36,7 +37,7 @@ class ServerSettings { // TODO: switch to better db system
|
36 | 37 | }
|
37 | 38 | }
|
38 | 39 | checkDefaults(d) {
|
39 |
| - for (key in d) { |
| 40 | + for (let key in d) { |
40 | 41 | if (!this.data[key]) this.data[key] = d[key];
|
41 | 42 | }
|
42 | 43 | }
|
@@ -155,4 +156,103 @@ class SettingsManager {
|
155 | 156 | }
|
156 | 157 | }
|
157 | 158 |
|
158 |
| -module.exports = { SettingsManager, ServerSettings }; |
| 159 | +class RemoteSettingsManager { // mysql based manager |
| 160 | + guilds = new Map(); |
| 161 | + descriptions = {}; |
| 162 | + defaults = {}; |
| 163 | + |
| 164 | + serverConfig = null; |
| 165 | + |
| 166 | + db = null; |
| 167 | + |
| 168 | + constructor(config, defaultsPath) { |
| 169 | + this.db = mysql.createPool({ |
| 170 | + connectionLimit : 15, |
| 171 | + ...config |
| 172 | + }); |
| 173 | + |
| 174 | + this.loadDefaultsSync(defaultsPath); |
| 175 | + |
| 176 | + this.load(); |
| 177 | + |
| 178 | + return this; |
| 179 | + } |
| 180 | + |
| 181 | + query(query) { |
| 182 | + return new Promise(res => { |
| 183 | + this.db.query(query, (error, results, fields) => { res({ error, results, fields })}); |
| 184 | + }); |
| 185 | + } |
| 186 | + |
| 187 | + async load() { |
| 188 | + const res = await this.query("SELECT * FROM settings"); |
| 189 | + if (res.error) { |
| 190 | + console.error("settings init error; ", res.error); |
| 191 | + console.error("retrying in 2 seconds"); |
| 192 | + return setTimeout(() => { |
| 193 | + this.load(); |
| 194 | + }, 2000); |
| 195 | + } |
| 196 | + |
| 197 | + const results = res.results; |
| 198 | + results.forEach((r) => { |
| 199 | + let server = new ServerSettings(r.id, this); |
| 200 | + server.deserialize(JSON.parse(r.data)); |
| 201 | + server.checkDefaults(this.defaults); |
| 202 | + this.guilds.set(server.id, server); |
| 203 | + }); |
| 204 | + } |
| 205 | + async remoteUpdate(server, key) { |
| 206 | + const r = await this.query("UPDATE settings SET 'data' = JSON_SET('data', $." + key + ", '" + server.data[key] + "')") |
| 207 | + if (r.error) console.error("settings update error; ", r.error); |
| 208 | + } |
| 209 | + async remoteSave(server) { |
| 210 | + const r = await this.query("UPDATE settings SET 'data' = '" + JSON.stringify(server.data) + "' WHERE id='" + server.id + "'"); |
| 211 | + if (r.error) console.error("settings server save error; ", r.error); |
| 212 | + } |
| 213 | + |
| 214 | + loadDefaultsSync(filePath) { |
| 215 | + const d = fs.readFileSync(filePath, "utf8"); |
| 216 | + let parsed = JSON.parse(d); |
| 217 | + this.descriptions = parsed.descriptions; |
| 218 | + this.defaults = parsed.values; |
| 219 | + } |
| 220 | + |
| 221 | + saveAsync() { |
| 222 | + return new Promise(async (res) => { |
| 223 | + const p = []; // promises |
| 224 | + this.guilds.forEach((val, _k) => { |
| 225 | + p.push(this.remoteSave(val)); |
| 226 | + }); |
| 227 | + |
| 228 | + await Promise.all(p); |
| 229 | + res(); |
| 230 | + }); |
| 231 | + } |
| 232 | + async create(id, server) { |
| 233 | + const r = await this.query("INSERT INTO settings (id, data) VALUES ('" + id + "', '" + JSON.stringify(server.data) + "')"); |
| 234 | + if (r.error) console.error("settings create server error; ", r.error); |
| 235 | + } |
| 236 | + |
| 237 | + update(server, key) { |
| 238 | + if (!this.guilds.has(server.id)) { |
| 239 | + this.guilds.set(server.id, server); |
| 240 | + this.create(server.id, server); |
| 241 | + } |
| 242 | + const s = this.guilds.get(server.id); |
| 243 | + s.data[key] = server.data[key]; |
| 244 | + this.remoteUpdate(server, key); |
| 245 | + } |
| 246 | + isOption(key) { |
| 247 | + return key in this.defaults; |
| 248 | + } |
| 249 | + |
| 250 | + hasServer(id) { |
| 251 | + return this.guilds.has(id); |
| 252 | + } |
| 253 | + getServer(id) { |
| 254 | + return (!this.guilds.has(id)) ? new ServerSettings(id, this) : this.guilds.get(id); |
| 255 | + } |
| 256 | +} |
| 257 | + |
| 258 | +module.exports = { SettingsManager, RemoteSettingsManager, ServerSettings }; |
0 commit comments