Commit ffe6f9a1 authored by nanahira's avatar nanahira

Merge branch 'msg-encode' of ../srvpro into develop

parents 8c03717a ab9e3c3d
Pipeline #42908 passed with stages
in 7 minutes and 46 seconds
......@@ -9,6 +9,7 @@ const load_constants_1 = __importDefault(require("./load-constants"));
const ygopro_msg_encode_1 = require("ygopro-msg-encode");
const ygopro_msg_struct_compat_1 = require("./ygopro-msg-struct-compat");
const proto_structs_json_1 = __importDefault(require("./data/proto_structs.json"));
const utility_1 = require("./utility");
class Handler {
constructor(handler, synchronous) {
this.handler = handler;
......@@ -38,15 +39,7 @@ class LegacyStructInst {
return;
const inst = (0, ygopro_msg_struct_compat_1.applyYGOProMsgStructCompat)(new this.cls().fromPayload(this.buffer));
inst[field] = value;
const parsed = Buffer.from(inst.toPayload());
if (parsed.length >= this.buffer.length) {
// slice it down
parsed.copy(this.buffer, 0, 0, this.buffer.length);
}
else {
// copy a small part only
parsed.copy(this.buffer, 0, 0, parsed.length);
}
(0, utility_1.overwriteBuffer)(this.buffer, inst.toPayload());
}
}
exports.LegacyStructInst = LegacyStructInst;
......
......@@ -4,6 +4,7 @@ import net from "net";
import { YGOProCtos, YGOProCtosBase, YGOProStoc, YGOProStocBase } from "ygopro-msg-encode";
import { applyYGOProMsgStructCompat, fromPartialCompat } from "./ygopro-msg-struct-compat";
import legacyProtoStructs from "./data/proto_structs.json";
import { overwriteBuffer } from "./utility";
class Handler {
......@@ -82,14 +83,7 @@ export class LegacyStructInst {
if (!this.buffer || !this.cls) return;
const inst = applyYGOProMsgStructCompat(new this.cls().fromPayload(this.buffer));
inst[field] = value;
const parsed = Buffer.from(inst.toPayload());
if (parsed.length >= this.buffer.length) {
// slice it down
parsed.copy(this.buffer, 0, 0, this.buffer.length);
} else {
// copy a small part only
parsed.copy(this.buffer, 0, 0, parsed.length);
}
overwriteBuffer(this.buffer, inst.toPayload());
}
}
......
This diff is collapsed.
......@@ -12,7 +12,6 @@
"author": "zh99998 <zh99998@gmail.com>, mercury233 <me@mercury233.me>, Nanahira <78877@qq.com>",
"dependencies": {
"aragami": "^1.2.5",
"async": "^3.2.0",
"axios": "^0.19.2",
"bunyan": "^1.8.14",
"deepmerge": "^4.2.2",
......@@ -27,8 +26,6 @@
"mysql": "^2.18.1",
"node-os-utils": "^1.3.2",
"p-queue": "^6.6.2",
"pg": "^6.4.2",
"q": "^1.5.1",
"querystring": "^0.2.0",
"reflect-metadata": "^0.1.13",
"request": "^2.88.2",
......@@ -38,7 +35,7 @@
"underscore.string": "^3.3.6",
"ws": "^8.9.0",
"ygopro-deck-encode": "^1.0.15",
"ygopro-msg-encode": "^1.1.5",
"ygopro-msg-encode": "^1.1.6",
"ygopro-yrp-encode": "^1.0.1"
},
"license": "AGPL-3.0",
......@@ -51,7 +48,6 @@
"webhook": "node ygopro-webhook.js"
},
"devDependencies": {
"@types/async": "^3.2.25",
"@types/bunyan": "^1.8.8",
"@types/formidable": "^3.4.6",
"@types/ip6addr": "^0.2.3",
......
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.overwriteBuffer = void 0;
exports.retry = retry;
async function retry(fn, count, delayFn = (attempt) => Math.pow(2, attempt) * 100) {
let lastError;
......@@ -18,3 +19,13 @@ async function retry(fn, count, delayFn = (attempt) => Math.pow(2, attempt) * 10
// 如果全部尝试失败,抛出最后一个错误
throw lastError;
}
const overwriteBuffer = (buf, _input) => {
const input = Buffer.isBuffer(_input) ? _input : Buffer.from(_input);
if (input.length >= buf.length) {
input.copy(buf, 0, 0, buf.length);
}
else {
input.copy(buf, 0, 0, input.length);
}
};
exports.overwriteBuffer = overwriteBuffer;
......@@ -20,3 +20,13 @@ export async function retry<T>(
// 如果全部尝试失败,抛出最后一个错误
throw lastError;
}
export const overwriteBuffer = (buf: Buffer, _input: Buffer | Uint8Array) => {
const input = Buffer.isBuffer(_input) ? _input : Buffer.from(_input);
if (input.length >= buf.length) {
input.copy(buf, 0, 0, buf.length);
} else {
input.copy(buf, 0, 0, input.length);
}
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -51,7 +51,6 @@ const axios_1 = __importDefault(require("axios"));
const formidable = __importStar(require("formidable"));
const load_json_file_1 = require("load-json-file");
const challonge_1 = require("./challonge");
const asyncLib = __importStar(require("async"));
const ygopro_deck_encode_1 = __importDefault(require("ygopro-deck-encode"));
const auth = __importStar(require("./ygopro-auth"));
const underscore_1 = __importDefault(require("underscore"));
......@@ -114,27 +113,21 @@ const readDeck = async function (deck_name, deck_full_path) {
return deck;
};
//读取指定文件夹中所有卡组
const getDecks = function (callback) {
const decks = [];
asyncLib.auto({
readDir: (done) => {
fs.readdir(config.deck_path, done);
},
handleDecks: [
"readDir",
(results, done) => {
const decks_list = results.readDir;
asyncLib.each(decks_list, async (deck_name) => {
if (deck_name.endsWith(".ydk")) {
const deck = await readDeck(deck_name, config.deck_path + deck_name);
decks.push(deck);
}
}, done);
},
],
}, (err) => {
callback(err, decks);
});
const getDecks = async function (callback) {
try {
const decks = [];
const decks_list = await fs.promises.readdir(config.deck_path);
for (const deck_name of decks_list) {
if (deck_name.endsWith(".ydk")) {
const deck = await readDeck(deck_name, config.deck_path + deck_name);
decks.push(deck);
}
}
callback(null, decks);
}
catch (err) {
callback(err, []);
}
};
const delDeck = function (deck_name, callback) {
if (deck_name.startsWith("../") || deck_name.match(/\/\.\.\//)) {
......@@ -143,19 +136,19 @@ const delDeck = function (deck_name, callback) {
}
fs.unlink(config.deck_path + deck_name, callback);
};
const clearDecks = function (callback) {
asyncLib.auto({
deckList: (done) => {
fs.readdir(config.deck_path, done);
},
removeAll: [
"deckList",
(results, done) => {
const decks_list = results.deckList;
asyncLib.each(decks_list, delDeck, done);
},
],
}, callback);
const clearDecks = async function (callback) {
try {
const decks_list = await fs.promises.readdir(config.deck_path);
for (const deck_name of decks_list) {
await new Promise((resolve, reject) => {
delDeck(deck_name, (err) => (err ? reject(err) : resolve()));
});
}
callback(null);
}
catch (err) {
callback(err);
}
};
const UploadToChallonge = async function () {
if (!challonge_config.enabled) {
......@@ -194,34 +187,38 @@ const UploadToChallonge = async function () {
}
return true;
};
const receiveDecks = function (files, callback) {
const result = [];
asyncLib.eachSeries(files, async (file) => {
if (file.name.endsWith(".ydk")) {
const deck = await readDeck(file.name, file.path);
if (deck.main.length >= 40) {
fs.createReadStream(file.path).pipe(fs.createWriteStream(config.deck_path + file.name));
result.push({
file: file.name,
status: "OK",
});
const receiveDecks = async function (files, callback) {
try {
const result = [];
for (const file of files) {
if (file.name.endsWith(".ydk")) {
const deck = await readDeck(file.name, file.path);
if (deck.main.length >= 40) {
fs.createReadStream(file.path).pipe(fs.createWriteStream(config.deck_path + file.name));
result.push({
file: file.name,
status: "OK",
});
}
else {
result.push({
file: file.name,
status: "卡组不合格",
});
}
}
else {
result.push({
file: file.name,
status: "卡组不合格",
status: "不是卡组文件",
});
}
}
else {
result.push({
file: file.name,
status: "不是卡组文件",
});
}
}, (err) => {
callback(err, result);
});
callback(null, result);
}
catch (err) {
callback(err, []);
}
};
//建立一个http服务器,接收API操作
async function requestListener(req, res) {
......
......@@ -15,7 +15,6 @@ import * as formidable from "formidable";
import { sync as loadJSON } from "load-json-file";
import defaultConfig from "./data/default_config.json";
import { Challonge } from "./challonge";
import * as asyncLib from "async";
import YGOProDeckEncode from "ygopro-deck-encode";
import * as auth from "./ygopro-auth";
import _ from "underscore";
......@@ -82,34 +81,20 @@ const readDeck = async function (deck_name: string, deck_full_path: string) {
};
//读取指定文件夹中所有卡组
const getDecks = function (callback: (err: Error | null, decks: any[]) => void) {
const decks: any[] = [];
asyncLib.auto(
{
readDir: (done: (err: NodeJS.ErrnoException | null, files?: string[]) => void) => {
fs.readdir(config.deck_path, done);
},
handleDecks: [
"readDir",
(results: any, done: (err?: Error | null) => void) => {
const decks_list = results.readDir as string[];
asyncLib.each(
decks_list,
async (deck_name: string) => {
if (deck_name.endsWith(".ydk")) {
const deck = await readDeck(deck_name, config.deck_path + deck_name);
decks.push(deck);
}
},
done
);
},
],
},
(err: Error | null) => {
callback(err, decks);
const getDecks = async function (callback: (err: Error | null, decks: any[]) => void) {
try {
const decks: any[] = [];
const decks_list = await fs.promises.readdir(config.deck_path);
for (const deck_name of decks_list) {
if (deck_name.endsWith(".ydk")) {
const deck = await readDeck(deck_name, config.deck_path + deck_name);
decks.push(deck);
}
}
);
callback(null, decks);
} catch (err) {
callback(err as Error, []);
}
};
const delDeck = function (deck_name: string, callback: (err?: NodeJS.ErrnoException | null) => void) {
......@@ -120,22 +105,18 @@ const delDeck = function (deck_name: string, callback: (err?: NodeJS.ErrnoExcept
fs.unlink(config.deck_path + deck_name, callback);
};
const clearDecks = function (callback: (err?: Error | null) => void) {
asyncLib.auto(
{
deckList: (done: (err: NodeJS.ErrnoException | null, files?: string[]) => void) => {
fs.readdir(config.deck_path, done);
},
removeAll: [
"deckList",
(results: any, done: (err?: Error | null) => void) => {
const decks_list = results.deckList as string[];
asyncLib.each(decks_list, delDeck as any, done);
},
],
},
callback
);
const clearDecks = async function (callback: (err?: Error | null) => void) {
try {
const decks_list = await fs.promises.readdir(config.deck_path);
for (const deck_name of decks_list) {
await new Promise<void>((resolve, reject) => {
delDeck(deck_name, (err) => (err ? reject(err) : resolve()));
});
}
callback(null);
} catch (err) {
callback(err as Error);
}
};
const UploadToChallonge = async function () {
......@@ -179,14 +160,13 @@ const UploadToChallonge = async function () {
return true;
};
const receiveDecks = function (
const receiveDecks = async function (
files: any,
callback: (err: Error | null, result: Array<{ file: string; status: string }>) => void
) {
const result: Array<{ file: string; status: string }> = [];
asyncLib.eachSeries(
files,
async (file: any) => {
try {
const result: Array<{ file: string; status: string }> = [];
for (const file of files) {
if (file.name.endsWith(".ydk")) {
const deck = await readDeck(file.name, file.path);
if (deck.main.length >= 40) {
......@@ -207,11 +187,11 @@ const receiveDecks = function (
status: "不是卡组文件",
});
}
},
(err: Error | null) => {
callback(err, result);
}
);
callback(null, result);
} catch (err) {
callback(err as Error, []);
}
};
//建立一个http服务器,接收API操作
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment