summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--server/frob/accreg.ts10
-rw-r--r--server/frob/char.ts46
-rw-r--r--server/frob/index.ts25
-rw-r--r--server/frob/itemdb.ts2
-rw-r--r--server/frob/login.ts10
-rw-r--r--server/frob/party.ts10
-rw-r--r--server/frob/sql.ts26
-rw-r--r--server/frob/storage.ts38
8 files changed, 100 insertions, 67 deletions
diff --git a/server/frob/accreg.ts b/server/frob/accreg.ts
index d951d77..3e0fb19 100644
--- a/server/frob/accreg.ts
+++ b/server/frob/accreg.ts
@@ -1,3 +1,5 @@
+import { SQLHandler } from "./sql.ts";
+
class AccregParser {
private reg_line =
"^" +
@@ -7,7 +9,7 @@ class AccregParser {
private vars_line = "(?<var_name>[^,]+),(?<value>[-0-9]+) ";
private reg_regex: RegExp;
private reg_regex_vars: RegExp;
- private encoder;
+ private encoder: TextEncoder;
constructor () {
this.reg_regex = new RegExp(this.reg_line);
@@ -51,7 +53,7 @@ class AccregParser {
while (true) {
const nread = await Deno.read(file.rid, buf);
- if (nread === Deno.EOF) {
+ if (nread === null) {
break;
}
@@ -82,9 +84,9 @@ class AccregParser {
}
class AccregSQL {
- private sql;
+ private sql: SQLHandler;
- constructor (sql) {
+ constructor (sql: SQLHandler) {
this.sql = sql;
}
diff --git a/server/frob/char.ts b/server/frob/char.ts
index dfb6837..2d9fb0e 100644
--- a/server/frob/char.ts
+++ b/server/frob/char.ts
@@ -1,3 +1,5 @@
+import { SQLHandler } from "./sql.ts";
+
class CharParser {
private char_line =
"^" +
@@ -28,7 +30,7 @@ class CharParser {
private char_regex_items: RegExp;
private char_regex_skills: RegExp;
private char_regex_vars: RegExp;
- private encoder;
+ private encoder: TextEncoder;
constructor () {
this.char_regex = new RegExp(this.char_line);
@@ -84,7 +86,7 @@ class CharParser {
groups.variables2 = variables;
- Deno.write(Deno.stdout.rid, this.encoder.encode(`\r⌛ processing char ${groups.char_id}...`));
+ Deno.write(Deno.stdout.rid, this.encoder.encode(`\r \r⌛ processing char ${groups.char_id}...`));
return groups;
}
@@ -98,7 +100,7 @@ class CharParser {
while (true) {
const nread = await Deno.read(file.rid, buf);
- if (nread === Deno.EOF) {
+ if (nread === null) {
break;
}
@@ -121,21 +123,28 @@ class CharParser {
}
class CharWriter {
- private file;
+ private file?: Deno.File;
private highest: number = 0;
- private encoder;
+ private encoder: TextEncoder;
constructor () {
+ this.encoder = new TextEncoder();
+ }
+
+ async init () {
try {
- Deno.removeSync("world/save/athena.txt.tmp");
+ await Deno.remove("world/save/athena.txt.tmp");
} catch {
// ignore this
}
- this.file = Deno.openSync("world/save/athena.txt.tmp", "a+");
- this.encoder = new TextEncoder();
+ this.file = await Deno.open("world/save/athena.txt.tmp", {append: true, create: true});
}
async write (char: any) {
+ if (!this.file) {
+ return;
+ }
+
let line =
`${char.char_id}\t` +
`${char.account_id},${char.char_num}\t` +
@@ -170,25 +179,26 @@ class CharWriter {
}
}
- async finalize(dry_run: boolean = false) {
+ async finalize () {
console.info("\rappending %newid%... ");
+
+ if (!this.file) {
+ return;
+ }
+
await Deno.write(this.file.rid, this.encoder.encode(`${this.highest + 1}\t%newid%\n`));
this.file.close();
- if (dry_run) {
- Deno.removeSync("world/save/athena.txt.tmp");
- } else {
- console.info("overwriting athena.txt...");
- await Deno.rename("world/save/athena.txt", "world/save/athena.txt_pre-frob");
- await Deno.rename("world/save/athena.txt.tmp", "world/save/athena.txt");
- }
+ console.info("overwriting athena.txt...");
+ await Deno.rename("world/save/athena.txt", "world/save/athena.txt_pre-frob");
+ await Deno.rename("world/save/athena.txt.tmp", "world/save/athena.txt");
}
}
class CharSQL {
- private sql;
+ private sql: SQLHandler;
- constructor (sql) {
+ constructor (sql: SQLHandler) {
this.sql = sql;
}
diff --git a/server/frob/index.ts b/server/frob/index.ts
index fc3ac09..df06975 100644
--- a/server/frob/index.ts
+++ b/server/frob/index.ts
@@ -91,7 +91,7 @@ const flags = {
}
// flag parsing
- for (let opt of args) {
+ for (const opt of args.slice()) {
if (opt.startsWith("--")) {
switch (opt.slice(2)) {
case "dry":
@@ -101,18 +101,18 @@ const flags = {
case "dump":
case "sql":
flags.sql = true;
+ break;
case "clean":
case "clean-only":
- args.length = 0;
break;
default:
throw new SyntaxError(`unknown flag: ${opt}`);
}
args.shift();
+ } else {
+ break; // no more flags
}
-
- break; // no more flags
}
// item parsing
@@ -163,6 +163,10 @@ const flags = {
}
}
+ if (!flags.dry_run) {
+ char_writer.init();
+ }
+
// inventory:
for await (let char of char_parser.readDB()) {
let items_filtered = []; // this is not a Set because some items don't stack
@@ -196,7 +200,7 @@ const flags = {
await char_SQL.write(char);
}
- await char_writer.finalize(!!flags.dry_run);
+ await char_writer.finalize();
// char-server-bound account variables
if (flags.sql) {
@@ -212,6 +216,10 @@ const flags = {
}
}
+ if (!flags.dry_run) {
+ storage_writer.init();
+ }
+
// storage:
for await (let storage of storage_parser.readDB()) {
let items_filtered = []; // this is not a Set because some items don't stack
@@ -252,14 +260,17 @@ const flags = {
if (storage.storage_amount >= 1) {
await storage_writer.write(storage);
- await storage_SQL.write(storage);
+
+ if (flags.sql) {
+ await storage_SQL.write(storage);
+ }
} else {
console.log(`storage of account ${storage.account_id} is now empty: removing it from the storage db`);
stats.storage.wiped++;
}
}
- await storage_writer.finalize(!!flags.dry_run);
+ await storage_writer.finalize();
await sql.close();
console.info("\r \n=== all done ===");
diff --git a/server/frob/itemdb.ts b/server/frob/itemdb.ts
index 5ff943d..721965a 100644
--- a/server/frob/itemdb.ts
+++ b/server/frob/itemdb.ts
@@ -26,7 +26,7 @@ class ItemDB {
this.item_regex = new RegExp(this.item_line);
}
- private parseLine (line) {
+ private parseLine (line: string) {
const match = this.item_regex.exec(line);
if (!(match instanceof Object) || !Reflect.has(match, "groups")) {
diff --git a/server/frob/login.ts b/server/frob/login.ts
index fa130cc..ccf6d37 100644
--- a/server/frob/login.ts
+++ b/server/frob/login.ts
@@ -1,3 +1,5 @@
+import { SQLHandler } from "./sql.ts";
+
class LoginParser {
private login_line =
"^" +
@@ -16,7 +18,7 @@ class LoginParser {
"(?<ban_until_time>[0-9]+)\t" +
"$";
private login_regex: RegExp;
- private encoder;
+ private encoder: TextEncoder;
constructor () {
this.login_regex = new RegExp(this.login_line);
@@ -79,7 +81,7 @@ class LoginParser {
while (true) {
const nread = await Deno.read(file.rid, buf);
- if (nread === Deno.EOF) {
+ if (nread === null) {
break;
}
@@ -114,9 +116,9 @@ class LoginParser {
}
class LoginSQL {
- private sql;
+ private sql: SQLHandler;
- constructor (sql) {
+ constructor (sql: SQLHandler) {
this.sql = sql;
}
diff --git a/server/frob/party.ts b/server/frob/party.ts
index cdc0580..a15336b 100644
--- a/server/frob/party.ts
+++ b/server/frob/party.ts
@@ -1,3 +1,5 @@
+import { SQLHandler } from "./sql.ts";
+
class PartyParser {
private party_line =
"^" +
@@ -9,7 +11,7 @@ class PartyParser {
private member_line = "(?<account_id>[0-9]+),(?<leader>[01])\t(?<char_name>[^\t]+)\t";
private party_regex: RegExp;
private party_regex_members: RegExp;
- private encoder;
+ private encoder: TextEncoder;
constructor () {
this.party_regex = new RegExp(this.party_line);
@@ -65,7 +67,7 @@ class PartyParser {
while (true) {
const nread = await Deno.read(file.rid, buf);
- if (nread === Deno.EOF) {
+ if (nread === null) {
break;
}
@@ -96,9 +98,9 @@ class PartyParser {
}
class PartySQL {
- private sql;
+ private sql: SQLHandler;
- constructor (sql) {
+ constructor (sql: SQLHandler) {
this.sql = sql;
}
diff --git a/server/frob/sql.ts b/server/frob/sql.ts
index 60c4bbe..a7ab414 100644
--- a/server/frob/sql.ts
+++ b/server/frob/sql.ts
@@ -1,11 +1,11 @@
-import { Client } from "https://deno.land/x/mysql/mod.ts";
+import { Client, Connection } from "https://deno.land/x/mysql/mod.ts";
class SQLHandler {
- private client;
- private hostname;
- private username;
- private password;
- private backslash;
+ private client: Client;
+ private hostname: string;
+ private username: string;
+ private password: string;
+ private backslash: RegExp;
constructor (hostname: string = "127.0.0.1", username: string = "evol", password: string = "evol") {
this.client = new Client();
@@ -154,21 +154,21 @@ class SQLHandler {
`); // some old parties have weird names
}
- escape (str) {
+ escape (str: string) {
// for some reason the deno sql module doesn't escape backslashes
return str.replace(this.backslash, "\\\\");
}
- async transaction (fn) {
- return await this.client.transaction(fn);
+ async transaction (processor: (c: Connection) => Promise<any>) {
+ return await this.client.transaction(processor);
}
- async query (...args) {
- return await this.client.query(...args);
+ async query (sql: string, params?: any[]) {
+ return await this.client.query(sql, params);
}
- async do (...args) {
- return await this.client.execute(...args);
+ async do (sql: string, params?: any[]) {
+ return await this.client.execute(sql, params);
}
diff --git a/server/frob/storage.ts b/server/frob/storage.ts
index 04559d6..ab44ba1 100644
--- a/server/frob/storage.ts
+++ b/server/frob/storage.ts
@@ -1,3 +1,5 @@
+import { SQLHandler } from "./sql.ts";
+
class StorageParser {
private storage_line =
"^" +
@@ -6,7 +8,7 @@ class StorageParser {
private storage_items_line = "[0-9]+,(?<nameid>[0-9]+),(?<amount>[0-9]+),(?<equip>[0-9]+),[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+,[0-9]+ ";
private storage_regex: RegExp;
private storage_regex_items: RegExp;
- private encoder;
+ private encoder: TextEncoder;
constructor () {
this.storage_regex = new RegExp(this.storage_line);
@@ -36,7 +38,7 @@ class StorageParser {
groups.items = items;
- Deno.write(Deno.stdout.rid, this.encoder.encode(`\r⌛ processing storage of account ${groups.account_id}... `));
+ Deno.write(Deno.stdout.rid, this.encoder.encode(`\r \r⌛ processing storage of account ${groups.account_id}...`));
return groups;
}
@@ -50,7 +52,7 @@ class StorageParser {
while (true) {
const nread = await Deno.read(file.rid, buf);
- if (nread === Deno.EOF) {
+ if (nread === null) {
break;
}
@@ -81,20 +83,27 @@ class StorageParser {
}
class StorageWriter {
- private file;
- private encoder;
+ private file?: Deno.File;
+ private encoder: TextEncoder;
constructor () {
+ this.encoder = new TextEncoder();
+ }
+
+ async init () {
try {
- Deno.removeSync("world/save/storage.txt.tmp");
+ await Deno.remove("world/save/storage.txt.tmp");
} catch {
// ignore this
}
- this.file = Deno.openSync("world/save/storage.txt.tmp", "a+");
- this.encoder = new TextEncoder();
+ this.file = await Deno.open("world/save/storage.txt.tmp", {append: true, create: true});
}
async write (storage: any) {
+ if (!this.file) {
+ return;
+ }
+
let line = `${storage.account_id},${storage.storage_amount}\t`;
for (const item of storage.items) {
@@ -107,12 +116,9 @@ class StorageWriter {
await Deno.write(this.file.rid, this.encoder.encode(line));
}
- async finalize(dry_run: boolean = false) {
- this.file.close();
-
- if (dry_run) {
- Deno.removeSync("world/save/storage.txt.tmp");
- } else {
+ async finalize () {
+ if (this.file) {
+ this.file.close();
console.info("\roverwriting storage.txt... ");
await Deno.rename("world/save/storage.txt", "world/save/storage.txt_pre-frob");
await Deno.rename("world/save/storage.txt.tmp", "world/save/storage.txt");
@@ -121,9 +127,9 @@ class StorageWriter {
}
class StorageSQL {
- private sql;
+ private sql: SQLHandler;
- constructor (sql) {
+ constructor (sql: SQLHandler) {
this.sql = sql;
}