Commit 6c459522 authored by nanahira's avatar nanahira

refa Replay to ts

parent 302680f1
lzma = require 'lzma'
fs = require 'fs'
# Deck = require './Deck.js'
class replayHeader
@replayCompressedFlag = 0x1
@replayTagFlag = 0x2
@replayDecodedFlag = 0x4
constructor: ->
@id = 0
@version = 0
@flag = 0
@seed = 0
@dataSizeRaw = []
@hash = 0
@props = []
getDataSize: ->
@dataSizeRaw[0] + @dataSizeRaw[1] * 0x100 + @dataSizeRaw[2] * 0x10000 + @dataSizeRaw[3] * 0x1000000
getIsTag: ->
@flag & replayHeader.replayTagFlag > 0
getIsCompressed: ->
@flag & replayHeader.replayCompressedFlag > 0
getLzmaHeader: ->
bytes = [].concat(@props[0..4], @dataSizeRaw, [0, 0, 0, 0])
Buffer.from(bytes)
Object.defineProperty replayHeader.prototype, 'dataSize', get: @getDataSize
Object.defineProperty replayHeader.prototype, 'isTag', get: @getIsTag
Object.defineProperty replayHeader.prototype, 'isCompressed', get: @getIsCompressed
class ReplayReader
constructor: (buffer) ->
@pointer = 0
@buffer = buffer
readByte: ->
answer = @buffer.readUInt8(@pointer)
@pointer += 1
answer
readByteArray: (length) ->
answer = []
answer.push @readByte() for i in [1..length]
answer
readInt8: ->
answer = @buffer.readInt8(@pointer)
@pointer += 1
answer
readUInt8: ->
answer = @buffer.readUInt8(@pointer)
@pointer += 1
answer
readInt16: ->
answer = @buffer.readInt16LE @pointer
@pointer += 2
answer
readInt32: ->
answer = @buffer.readInt32LE @pointer
@pointer += 4
answer
readAll: ->
answer = @buffer.slice(@pointer)
# @pointer = 0
answer
readString: (length) ->
if @pointer + length > @buffer.length
return null
full = @buffer.slice(@pointer, @pointer + length).toString('utf-16le')
answer = full.split("\u0000")[0]
@pointer += length
answer
readRaw: (length) ->
if @pointer + length > @buffer.length
return null
answer = @buffer.slice(@pointer, @pointer + length)
@pointer += length
answer
class Replay
constructor: ->
@header = null
@hostName = ""
@clientName = ""
@startLp = 0
@startHand = 0
@drawCount = 0
@opt = 0
@hostDeck = null
@clientDeck = null
@tagHostName = null
@tagClientName = null
@tagHostDeck = null
@tagClientDeck = null
@responses = null
getDecks: ->
if @isTag
[@hostDeck, @clientDeck, @tagHostDeck, @tagClientDeck]
else
[@hostDeck, @clientDeck]
getIsTag: ->
@header == null ? false : @header.isTag
@fromFile: (filePath) ->
Replay.fromBuffer await fs.promises.readFile filePath
@fromBuffer: (buffer) ->
reader = new ReplayReader buffer
header = Replay.readHeader reader
restBuffer = reader.readAll()
lzmaBuffer = Buffer.concat [header.getLzmaHeader(), restBuffer]
if header.isCompressed
decompressed = restBuffer
else
decompressed = Buffer.from lzma.decompress lzmaBuffer
reader = new ReplayReader decompressed
replay = Replay.readReplay header, reader
replay
@readHeader: (reader) ->
header = new replayHeader()
header.id = reader.readInt32()
header.version = reader.readInt32()
header.flag = reader.readInt32()
header.seed = reader.readInt32()
header.dataSizeRaw = reader.readByteArray 4
header.hash = reader.readInt32()
header.props = reader.readByteArray 8
header
@readReplay: (header, reader) ->
replay = new Replay()
replay.header = header
replay.hostName = reader.readString(40)
replay.tagHostName = reader.readString(40) if header.isTag
replay.tagClientName = reader.readString(40) if header.isTag
replay.clientName = reader.readString(40)
replay.startLp = reader.readInt32()
replay.startHand = reader.readInt32()
replay.drawCount = reader.readInt32()
replay.opt = reader.readInt32()
replay.hostDeck = Replay.readDeck reader
replay.tagHostDeck = Replay.readDeck reader if header.isTag
replay.tagClientDeck = Replay.readDeck reader if header.isTag
replay.clientDeck = Replay.readDeck reader
replay.responses = Replay.readResponses reader
replay
@readDeck: (reader) ->
deck = {}
deck.main = Replay.readDeckPack reader
deck.ex = Replay.readDeckPack reader
deck
@readDeckPack: (reader) ->
length = reader.readInt32()
answer = []
answer.push reader.readInt32() for i in [1..length]
answer
@readResponses: (reader) ->
answer = []
while true
try
length = reader.readUInt8()
if length > 64
length = 64
single = reader.readRaw(length)
if !single
break
answer.push(single)
catch
break
answer
Object.defineProperty replayHeader.prototype, 'decks', get: @getDecks
Object.defineProperty replayHeader.prototype, 'isTag', get: @getIsTag
module.exports = Replay
// Generated by CoffeeScript 2.6.1 "use strict";
(function() { var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
var Replay, ReplayReader, fs, lzma, replayHeader; if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
lzma = require('lzma'); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
fs = require('fs'); }
Object.defineProperty(o, k2, desc);
replayHeader = (function() { }) : (function(o, m, k, k2) {
// Deck = require './Deck.js' if (k2 === undefined) k2 = k;
class replayHeader { o[k2] = m[k];
constructor() { }));
this.id = 0; var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
this.version = 0; Object.defineProperty(o, "default", { enumerable: true, value: v });
this.flag = 0; }) : function(o, v) {
this.seed = 0; o["default"] = v;
this.dataSizeRaw = []; });
this.hash = 0; var __importStar = (this && this.__importStar) || (function () {
this.props = []; var ownKeys = function(o) {
} ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
getDataSize() { for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return this.dataSizeRaw[0] + this.dataSizeRaw[1] * 0x100 + this.dataSizeRaw[2] * 0x10000 + this.dataSizeRaw[3] * 0x1000000; return ar;
} };
return ownKeys(o);
getIsTag() { };
return this.flag & replayHeader.replayTagFlag > 0; return function (mod) {
} if (mod && mod.__esModule) return mod;
var result = {};
getIsCompressed() { if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
return this.flag & replayHeader.replayCompressedFlag > 0; __setModuleDefault(result, mod);
} return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.Replay = exports.ReplayHeader = void 0;
const fs = __importStar(require("fs"));
const lzma = __importStar(require("lzma"));
/**
* Metadata stored at the beginning of every replay file.
*/
class ReplayHeader {
static REPLAY_COMPRESSED_FLAG = 0x1;
static REPLAY_TAG_FLAG = 0x2;
static REPLAY_DECODED_FLAG = 0x4;
static REPLAY_SINGLE_MODE = 0x8;
static REPLAY_UNIFORM = 0x10;
id = 0;
version = 0;
flag = 0;
seed = 0;
dataSizeRaw = [];
hash = 0;
props = [];
/** Decompressed size as little‑endian 32‑bit */
get dataSize() {
return (this.dataSizeRaw[0] +
this.dataSizeRaw[1] * 0x100 +
this.dataSizeRaw[2] * 0x10000 +
this.dataSizeRaw[3] * 0x1000000);
}
get isTag() {
return (this.flag & ReplayHeader.REPLAY_TAG_FLAG) !== 0;
}
get isCompressed() {
return (this.flag & ReplayHeader.REPLAY_COMPRESSED_FLAG) !== 0;
}
/** Compose a valid 13‑byte LZMA header for this replay */
getLzmaHeader() { getLzmaHeader() {
var bytes; const bytes = [
bytes = [].concat(this.props.slice(0, 5), this.dataSizeRaw, [0, 0, 0, 0]); ...this.props.slice(0, 5),
...this.dataSizeRaw,
0,
0,
0,
0,
];
return Buffer.from(bytes); return Buffer.from(bytes);
} }
}
}; exports.ReplayHeader = ReplayHeader;
/** Utility for reading little‑endian primitives from a Buffer */
replayHeader.replayCompressedFlag = 0x1; class ReplayReader {
buffer;
replayHeader.replayTagFlag = 0x2; pointer = 0;
replayHeader.replayDecodedFlag = 0x4;
Object.defineProperty(replayHeader.prototype, 'dataSize', {
get: replayHeader.getDataSize
});
Object.defineProperty(replayHeader.prototype, 'isTag', {
get: replayHeader.getIsTag
});
Object.defineProperty(replayHeader.prototype, 'isCompressed', {
get: replayHeader.getIsCompressed
});
return replayHeader;
}).call(this);
ReplayReader = class ReplayReader {
constructor(buffer) { constructor(buffer) {
this.pointer = 0;
this.buffer = buffer; this.buffer = buffer;
} }
advance(size, read) {
const value = read();
this.pointer += size;
return value;
}
readByte() { readByte() {
var answer; return this.advance(1, () => this.buffer.readUInt8(this.pointer));
answer = this.buffer.readUInt8(this.pointer);
this.pointer += 1;
return answer;
} }
readByteArray(length) { readByteArray(length) {
var answer, i, j, ref; const out = [];
answer = []; for (let i = 0; i < length; i++)
for (i = j = 1, ref = length; (1 <= ref ? j <= ref : j >= ref); i = 1 <= ref ? ++j : --j) { out.push(this.readByte());
answer.push(this.readByte()); return out;
}
return answer;
} }
readInt8() { readInt8() {
var answer; return this.advance(1, () => this.buffer.readInt8(this.pointer));
answer = this.buffer.readInt8(this.pointer);
this.pointer += 1;
return answer;
} }
readUInt8() { readUInt8() {
var answer; return this.advance(1, () => this.buffer.readUInt8(this.pointer));
answer = this.buffer.readUInt8(this.pointer);
this.pointer += 1;
return answer;
} }
readInt16() { readInt16() {
var answer; return this.advance(2, () => this.buffer.readInt16LE(this.pointer));
answer = this.buffer.readInt16LE(this.pointer);
this.pointer += 2;
return answer;
} }
readInt32() { readInt32() {
var answer; return this.advance(4, () => this.buffer.readInt32LE(this.pointer));
answer = this.buffer.readInt32LE(this.pointer);
this.pointer += 4;
return answer;
} }
readAll() { readAll() {
var answer; return this.buffer.slice(this.pointer);
answer = this.buffer.slice(this.pointer);
// @pointer = 0
return answer;
} }
readString(length) { readString(length) {
var answer, full; if (this.pointer + length > this.buffer.length)
if (this.pointer + length > this.buffer.length) {
return null; return null;
} const raw = this.buffer
full = this.buffer.slice(this.pointer, this.pointer + length).toString('utf-16le'); .slice(this.pointer, this.pointer + length)
answer = full.split("\u0000")[0]; .toString('utf16le');
this.pointer += length; this.pointer += length;
return answer; return raw.split('\u0000')[0];
} }
readRaw(length) { readRaw(length) {
var answer; if (this.pointer + length > this.buffer.length)
if (this.pointer + length > this.buffer.length) {
return null; return null;
} const buf = this.buffer.slice(this.pointer, this.pointer + length);
answer = this.buffer.slice(this.pointer, this.pointer + length);
this.pointer += length; this.pointer += length;
return answer; return buf;
} }
}
}; /** Utility for writing little‑endian primitives into a Buffer */
class ReplayWriter {
Replay = (function() { buffer;
class Replay { pointer = 0;
constructor() { constructor(buffer) {
this.header = null; this.buffer = buffer;
this.hostName = "";
this.clientName = "";
this.startLp = 0;
this.startHand = 0;
this.drawCount = 0;
this.opt = 0;
this.hostDeck = null;
this.clientDeck = null;
this.tagHostName = null;
this.tagClientName = null;
this.tagHostDeck = null;
this.tagClientDeck = null;
this.responses = null;
}
getDecks() {
if (this.isTag) {
return [this.hostDeck, this.clientDeck, this.tagHostDeck, this.tagClientDeck];
} else {
return [this.hostDeck, this.clientDeck];
}
}
getIsTag() {
var ref;
return (ref = this.header === null) != null ? ref : {
false: this.header.isTag
};
} }
advance(action, size) {
static async fromFile(filePath) { action();
return Replay.fromBuffer((await fs.promises.readFile(filePath))); this.pointer += size;
}
writeByte(val) {
this.advance(() => this.buffer.writeUInt8(val, this.pointer), 1);
}
writeByteArray(values) {
for (const v of values)
this.writeByte(v);
}
writeInt8(val) {
this.advance(() => this.buffer.writeInt8(val, this.pointer), 1);
}
writeUInt8(val) {
this.advance(() => this.buffer.writeUInt8(val, this.pointer), 1);
}
writeInt16(val) {
this.advance(() => this.buffer.writeInt16LE(val, this.pointer), 2);
}
writeInt32(val) {
this.advance(() => this.buffer.writeInt32LE(val, this.pointer), 4);
}
writeAll(buf) {
this.buffer = Buffer.concat([this.buffer, buf]);
}
writeString(val, length) {
const raw = Buffer.from(val ?? '', 'utf16le');
const bytes = [...raw];
if (length !== undefined) {
const padding = new Array(Math.max(length - bytes.length, 0)).fill(0);
this.writeByteArray([...bytes, ...padding]);
}
else {
this.writeByteArray(bytes);
}
}
}
class Replay {
header = null;
hostName = '';
clientName = '';
startLp = 0;
startHand = 0;
drawCount = 0;
opt = 0;
hostDeck = null;
clientDeck = null;
tagHostName = null;
tagClientName = null;
tagHostDeck = null;
tagClientDeck = null;
responses = [];
/** All deck objects in play order */
get decks() {
return this.isTag
? [
this.hostDeck,
this.clientDeck,
this.tagHostDeck,
this.tagClientDeck,
]
: [this.hostDeck, this.clientDeck];
}
get isTag() {
return this.header?.isTag ?? false;
}
/* ------------------ Static helpers ------------------ */
static fromFile(path) {
return Replay.fromBuffer(fs.readFileSync(path));
} }
static fromBuffer(buffer) { static fromBuffer(buffer) {
var decompressed, header, lzmaBuffer, reader, replay, restBuffer; const headerReader = new ReplayReader(buffer);
reader = new ReplayReader(buffer); const header = Replay.readHeader(headerReader);
header = Replay.readHeader(reader); const raw = headerReader.readAll();
restBuffer = reader.readAll(); const body = header.isCompressed
lzmaBuffer = Buffer.concat([header.getLzmaHeader(), restBuffer]); ? Replay.decompressBody(header, raw)
if (header.isCompressed) { : raw;
decompressed = restBuffer; const bodyReader = new ReplayReader(body);
} else { return Replay.readReplay(header, bodyReader);
decompressed = Buffer.from(lzma.decompress(lzmaBuffer)); }
} static decompressBody(header, raw) {
reader = new ReplayReader(decompressed); const lzmaBuffer = Buffer.concat([header.getLzmaHeader(), raw]);
replay = Replay.readReplay(header, reader); // lzma‑native provides synchronous helpers.
return replay; return Buffer.from(lzma.decompress(lzmaBuffer));
} }
static readHeader(reader) { static readHeader(reader) {
var header; const h = new ReplayHeader();
header = new replayHeader(); h.id = reader.readInt32();
header.id = reader.readInt32(); h.version = reader.readInt32();
header.version = reader.readInt32(); h.flag = reader.readInt32();
header.flag = reader.readInt32(); h.seed = reader.readInt32();
header.seed = reader.readInt32(); h.dataSizeRaw = reader.readByteArray(4);
header.dataSizeRaw = reader.readByteArray(4); h.hash = reader.readInt32();
header.hash = reader.readInt32(); h.props = reader.readByteArray(8);
header.props = reader.readByteArray(8); return h;
return header;
}
static readReplay(header, reader) {
var replay;
replay = new Replay();
replay.header = header;
replay.hostName = reader.readString(40);
if (header.isTag) {
replay.tagHostName = reader.readString(40);
} }
static readReplay(header, reader) {
const r = new Replay();
r.header = header;
r.hostName = reader.readString(40) ?? '';
if (header.isTag) { if (header.isTag) {
replay.tagClientName = reader.readString(40); r.tagHostName = reader.readString(40);
} r.tagClientName = reader.readString(40);
replay.clientName = reader.readString(40); }
replay.startLp = reader.readInt32(); r.clientName = reader.readString(40) ?? '';
replay.startHand = reader.readInt32(); r.startLp = reader.readInt32();
replay.drawCount = reader.readInt32(); r.startHand = reader.readInt32();
replay.opt = reader.readInt32(); r.drawCount = reader.readInt32();
replay.hostDeck = Replay.readDeck(reader); r.opt = reader.readInt32();
if (header.isTag) { r.hostDeck = Replay.readDeck(reader);
replay.tagHostDeck = Replay.readDeck(reader);
}
if (header.isTag) { if (header.isTag) {
replay.tagClientDeck = Replay.readDeck(reader); r.tagHostDeck = Replay.readDeck(reader);
r.tagClientDeck = Replay.readDeck(reader);
} }
replay.clientDeck = Replay.readDeck(reader); r.clientDeck = Replay.readDeck(reader);
replay.responses = Replay.readResponses(reader); r.responses = Replay.readResponses(reader);
return replay; return r;
} }
/* ------------------ Deck helpers ------------------ */
static readDeck(reader) { static readDeck(reader) {
var deck; return {
deck = {}; main: Replay.readDeckPack(reader),
deck.main = Replay.readDeckPack(reader); ex: Replay.readDeckPack(reader),
deck.ex = Replay.readDeckPack(reader); };
return deck;
} }
static readDeckPack(reader) { static readDeckPack(reader) {
var answer, i, j, length, ref; const length = reader.readInt32();
length = reader.readInt32(); const cards = [];
answer = []; for (let i = 0; i < length; i++)
for (i = j = 1, ref = length; (1 <= ref ? j <= ref : j >= ref); i = 1 <= ref ? ++j : --j) { cards.push(reader.readInt32());
answer.push(reader.readInt32()); return cards;
}
return answer;
} }
/* ------------------ Response helpers ------------------ */
static readResponses(reader) { static readResponses(reader) {
var answer, length, single; const out = [];
answer = [];
while (true) { while (true) {
try { try {
length = reader.readUInt8(); let length = reader.readUInt8();
if (length > 64) { if (length > 64)
length = 64; length = 64;
} const segment = reader.readRaw(length);
single = reader.readRaw(length); if (!segment)
if (!single) {
break; break;
out.push(segment);
} }
answer.push(single); catch {
} catch (error) {
break; break;
} }
} }
return answer; return out;
} }
/* ------------------ Writing ------------------ */
}; toBuffer() {
if (!this.header)
Object.defineProperty(replayHeader.prototype, 'decks', { throw new Error('Header not initialised');
get: Replay.getDecks const headerWriter = new ReplayWriter(Buffer.alloc(32));
}); this.writeHeader(headerWriter);
const deckSize = (d) => ((d?.main.length ?? 0) + (d?.ex.length ?? 0)) * 4 + 8;
Object.defineProperty(replayHeader.prototype, 'isTag', { const responseSize = this.responses.reduce((s, b) => s + b.length + 1, 0);
get: Replay.getIsTag let contentSize = 96 + deckSize(this.hostDeck) + deckSize(this.clientDeck) + responseSize;
}); if (this.header.isTag) {
contentSize +=
return Replay; deckSize(this.tagHostDeck) + deckSize(this.tagClientDeck) + 80;
}
}).call(this); const contentWriter = new ReplayWriter(Buffer.alloc(contentSize));
this.writeContent(contentWriter);
module.exports = Replay; let body = contentWriter.buffer;
if (this.header.isCompressed) {
}).call(this); body = Buffer.from(lzma.compress(body));
body = body.slice(13); // strip header like original implementation
}
return Buffer.concat([headerWriter.buffer, body]);
}
writeToFile(path) {
fs.writeFileSync(path, this.toBuffer());
}
writeHeader(w) {
w.writeInt32(this.header.id);
w.writeInt32(this.header.version);
w.writeInt32(this.header.flag);
w.writeInt32(this.header.seed);
w.writeByteArray(this.header.dataSizeRaw);
w.writeInt32(this.header.hash);
w.writeByteArray(this.header.props);
}
writeContent(w) {
w.writeString(this.hostName, 40);
if (this.header.isTag) {
w.writeString(this.tagHostName, 40);
w.writeString(this.tagClientName, 40);
}
w.writeString(this.clientName, 40);
w.writeInt32(this.startLp);
w.writeInt32(this.startHand);
w.writeInt32(this.drawCount);
w.writeInt32(this.opt);
Replay.writeDeck(w, this.hostDeck);
if (this.header.isTag) {
Replay.writeDeck(w, this.tagHostDeck);
Replay.writeDeck(w, this.tagClientDeck);
}
Replay.writeDeck(w, this.clientDeck);
Replay.writeResponses(w, this.responses);
}
static writeDeck(w, d) {
if (!d) {
w.writeInt32(0);
w.writeInt32(0);
return;
}
Replay.writeDeckPack(w, d.main);
Replay.writeDeckPack(w, d.ex);
}
static writeDeckPack(w, pack) {
w.writeInt32(pack.length);
for (const card of pack)
w.writeInt32(card);
}
static writeResponses(w, res) {
for (const buf of res) {
w.writeUInt8(buf.length);
w.writeByteArray(buf);
}
}
}
exports.Replay = Replay;
import * as fs from 'fs';
import * as lzma from 'lzma';
/** A minimal deck representation */
export interface DeckObject {
main: number[];
ex: number[];
}
/**
* Metadata stored at the beginning of every replay file.
*/
export class ReplayHeader {
static readonly REPLAY_COMPRESSED_FLAG = 0x1;
static readonly REPLAY_TAG_FLAG = 0x2;
static readonly REPLAY_DECODED_FLAG = 0x4;
static readonly REPLAY_SINGLE_MODE = 0x8;
static readonly REPLAY_UNIFORM = 0x10;
id = 0;
version = 0;
flag = 0;
seed = 0;
dataSizeRaw: number[] = [];
hash = 0;
props: number[] = [];
/** Decompressed size as little‑endian 32‑bit */
get dataSize(): number {
return (
this.dataSizeRaw[0] +
this.dataSizeRaw[1] * 0x100 +
this.dataSizeRaw[2] * 0x10000 +
this.dataSizeRaw[3] * 0x1000000
);
}
get isTag(): boolean {
return (this.flag & ReplayHeader.REPLAY_TAG_FLAG) !== 0;
}
get isCompressed(): boolean {
return (this.flag & ReplayHeader.REPLAY_COMPRESSED_FLAG) !== 0;
}
/** Compose a valid 13‑byte LZMA header for this replay */
getLzmaHeader(): Buffer {
const bytes = [
...this.props.slice(0, 5),
...this.dataSizeRaw,
0,
0,
0,
0,
];
return Buffer.from(bytes);
}
}
/** Utility for reading little‑endian primitives from a Buffer */
class ReplayReader {
private pointer = 0;
constructor(private readonly buffer: Buffer) {}
private advance<T>(size: number, read: () => T): T {
const value = read();
this.pointer += size;
return value;
}
readByte(): number {
return this.advance(1, () => this.buffer.readUInt8(this.pointer));
}
readByteArray(length: number): number[] {
const out: number[] = [];
for (let i = 0; i < length; i++) out.push(this.readByte());
return out;
}
readInt8(): number {
return this.advance(1, () => this.buffer.readInt8(this.pointer));
}
readUInt8(): number {
return this.advance(1, () => this.buffer.readUInt8(this.pointer));
}
readInt16(): number {
return this.advance(2, () => this.buffer.readInt16LE(this.pointer));
}
readInt32(): number {
return this.advance(4, () => this.buffer.readInt32LE(this.pointer));
}
readAll(): Buffer {
return this.buffer.slice(this.pointer);
}
readString(length: number): string | null {
if (this.pointer + length > this.buffer.length) return null;
const raw = this.buffer
.slice(this.pointer, this.pointer + length)
.toString('utf16le');
this.pointer += length;
return raw.split('\u0000')[0];
}
readRaw(length: number): Buffer | null {
if (this.pointer + length > this.buffer.length) return null;
const buf = this.buffer.slice(this.pointer, this.pointer + length);
this.pointer += length;
return buf;
}
}
/** Utility for writing little‑endian primitives into a Buffer */
class ReplayWriter {
private pointer = 0;
constructor(public buffer: Buffer) {}
private advance(action: () => void, size: number): void {
action();
this.pointer += size;
}
writeByte(val: number): void {
this.advance(() => this.buffer.writeUInt8(val, this.pointer), 1);
}
writeByteArray(values: Iterable<number>): void {
for (const v of values) this.writeByte(v);
}
writeInt8(val: number): void {
this.advance(() => this.buffer.writeInt8(val, this.pointer), 1);
}
writeUInt8(val: number): void {
this.advance(() => this.buffer.writeUInt8(val, this.pointer), 1);
}
writeInt16(val: number): void {
this.advance(() => this.buffer.writeInt16LE(val, this.pointer), 2);
}
writeInt32(val: number): void {
this.advance(() => this.buffer.writeInt32LE(val, this.pointer), 4);
}
writeAll(buf: Buffer): void {
this.buffer = Buffer.concat([this.buffer, buf]);
}
writeString(val: string | null, length?: number): void {
const raw = Buffer.from(val ?? '', 'utf16le');
const bytes = [...raw];
if (length !== undefined) {
const padding = new Array(Math.max(length - bytes.length, 0)).fill(0);
this.writeByteArray([...bytes, ...padding]);
} else {
this.writeByteArray(bytes);
}
}
}
export class Replay {
header: ReplayHeader | null = null;
hostName = '';
clientName = '';
startLp = 0;
startHand = 0;
drawCount = 0;
opt = 0;
hostDeck: DeckObject | null = null;
clientDeck: DeckObject | null = null;
tagHostName: string | null = null;
tagClientName: string | null = null;
tagHostDeck: DeckObject | null = null;
tagClientDeck: DeckObject | null = null;
responses: Buffer[] = [];
/** All deck objects in play order */
get decks(): DeckObject[] {
return this.isTag
? [
this.hostDeck!,
this.clientDeck!,
this.tagHostDeck!,
this.tagClientDeck!,
]
: [this.hostDeck!, this.clientDeck!];
}
get isTag(): boolean {
return this.header?.isTag ?? false;
}
/* ------------------ Static helpers ------------------ */
static fromFile(path: string): Replay {
return Replay.fromBuffer(fs.readFileSync(path));
}
static fromBuffer(buffer: Buffer): Replay {
const headerReader = new ReplayReader(buffer);
const header = Replay.readHeader(headerReader);
const raw = headerReader.readAll();
const body = header.isCompressed
? Replay.decompressBody(header, raw)
: raw;
const bodyReader = new ReplayReader(body);
return Replay.readReplay(header, bodyReader);
}
private static decompressBody(header: ReplayHeader, raw: Buffer): Buffer {
const lzmaBuffer = Buffer.concat([header.getLzmaHeader(), raw]);
// lzma‑native provides synchronous helpers.
return Buffer.from(lzma.decompress(lzmaBuffer));
}
private static readHeader(reader: ReplayReader): ReplayHeader {
const h = new ReplayHeader();
h.id = reader.readInt32();
h.version = reader.readInt32();
h.flag = reader.readInt32();
h.seed = reader.readInt32();
h.dataSizeRaw = reader.readByteArray(4);
h.hash = reader.readInt32();
h.props = reader.readByteArray(8);
return h;
}
private static readReplay(header: ReplayHeader, reader: ReplayReader): Replay {
const r = new Replay();
r.header = header;
r.hostName = reader.readString(40) ?? '';
if (header.isTag) {
r.tagHostName = reader.readString(40);
r.tagClientName = reader.readString(40);
}
r.clientName = reader.readString(40) ?? '';
r.startLp = reader.readInt32();
r.startHand = reader.readInt32();
r.drawCount = reader.readInt32();
r.opt = reader.readInt32();
r.hostDeck = Replay.readDeck(reader);
if (header.isTag) {
r.tagHostDeck = Replay.readDeck(reader);
r.tagClientDeck = Replay.readDeck(reader);
}
r.clientDeck = Replay.readDeck(reader);
r.responses = Replay.readResponses(reader);
return r;
}
/* ------------------ Deck helpers ------------------ */
private static readDeck(reader: ReplayReader): DeckObject {
return {
main: Replay.readDeckPack(reader),
ex: Replay.readDeckPack(reader),
};
}
private static readDeckPack(reader: ReplayReader): number[] {
const length = reader.readInt32();
const cards: number[] = [];
for (let i = 0; i < length; i++) cards.push(reader.readInt32());
return cards;
}
/* ------------------ Response helpers ------------------ */
private static readResponses(reader: ReplayReader): Buffer[] {
const out: Buffer[] = [];
while (true) {
try {
let length = reader.readUInt8();
if (length > 64) length = 64;
const segment = reader.readRaw(length);
if (!segment) break;
out.push(segment);
} catch {
break;
}
}
return out;
}
/* ------------------ Writing ------------------ */
toBuffer(): Buffer {
if (!this.header) throw new Error('Header not initialised');
const headerWriter = new ReplayWriter(Buffer.alloc(32));
this.writeHeader(headerWriter);
const deckSize = (d: DeckObject | null) =>
((d?.main.length ?? 0) + (d?.ex.length ?? 0)) * 4 + 8;
const responseSize = this.responses.reduce((s, b) => s + b.length + 1, 0);
let contentSize =
96 + deckSize(this.hostDeck) + deckSize(this.clientDeck) + responseSize;
if (this.header.isTag) {
contentSize +=
deckSize(this.tagHostDeck) + deckSize(this.tagClientDeck) + 80;
}
const contentWriter = new ReplayWriter(Buffer.alloc(contentSize));
this.writeContent(contentWriter);
let body = contentWriter.buffer;
if (this.header.isCompressed) {
body = Buffer.from(lzma.compress(body));
body = body.slice(13); // strip header like original implementation
}
return Buffer.concat([headerWriter.buffer, body]);
}
writeToFile(path: string): void {
fs.writeFileSync(path, this.toBuffer());
}
private writeHeader(w: ReplayWriter): void {
w.writeInt32(this.header!.id);
w.writeInt32(this.header!.version);
w.writeInt32(this.header!.flag);
w.writeInt32(this.header!.seed);
w.writeByteArray(this.header!.dataSizeRaw);
w.writeInt32(this.header!.hash);
w.writeByteArray(this.header!.props);
}
private writeContent(w: ReplayWriter): void {
w.writeString(this.hostName, 40);
if (this.header!.isTag) {
w.writeString(this.tagHostName, 40);
w.writeString(this.tagClientName, 40);
}
w.writeString(this.clientName, 40);
w.writeInt32(this.startLp);
w.writeInt32(this.startHand);
w.writeInt32(this.drawCount);
w.writeInt32(this.opt);
Replay.writeDeck(w, this.hostDeck);
if (this.header!.isTag) {
Replay.writeDeck(w, this.tagHostDeck);
Replay.writeDeck(w, this.tagClientDeck);
}
Replay.writeDeck(w, this.clientDeck);
Replay.writeResponses(w, this.responses);
}
private static writeDeck(w: ReplayWriter, d: DeckObject | null): void {
if (!d) {
w.writeInt32(0);
w.writeInt32(0);
return;
}
Replay.writeDeckPack(w, d.main);
Replay.writeDeckPack(w, d.ex);
}
private static writeDeckPack(w: ReplayWriter, pack: number[]): void {
w.writeInt32(pack.length);
for (const card of pack) w.writeInt32(card);
}
private static writeResponses(w: ReplayWriter, res: Buffer[]): void {
for (const buf of res) {
w.writeUInt8(buf.length);
w.writeByteArray(buf);
}
}
}
...@@ -290,4 +290,3 @@ class YGOProMessagesHelper { ...@@ -290,4 +290,3 @@ class YGOProMessagesHelper {
} }
} }
exports.YGOProMessagesHelper = YGOProMessagesHelper; exports.YGOProMessagesHelper = YGOProMessagesHelper;
//# sourceMappingURL=YGOProMessages.js.map
\ No newline at end of file
...@@ -57,4 +57,3 @@ class AthleticChecker { ...@@ -57,4 +57,3 @@ class AthleticChecker {
} }
} }
exports.AthleticChecker = AthleticChecker; exports.AthleticChecker = AthleticChecker;
//# sourceMappingURL=athletic-check.js.map
\ No newline at end of file
...@@ -67,6 +67,7 @@ class Challonge { ...@@ -67,6 +67,7 @@ class Challonge {
} }
} }
} }
// DELETE /v1/tournaments/${tournament_id}/participants/clear.json?api_key=xxx returns ANY
async clearParticipants() { async clearParticipants() {
try { try {
await axios_1.default.delete(`${this.config.challonge_url}/v1/tournaments/${this.config.tournament_id}/participants/clear.json`, { await axios_1.default.delete(`${this.config.challonge_url}/v1/tournaments/${this.config.tournament_id}/participants/clear.json`, {
...@@ -82,6 +83,7 @@ class Challonge { ...@@ -82,6 +83,7 @@ class Challonge {
return false; return false;
} }
} }
// POST /v1/tournaments/${tournament_id}/participants/bulk_add.json { api_key: string, participants: { name: string }[] } returns ANY
async uploadParticipants(participantNames) { async uploadParticipants(participantNames) {
try { try {
await axios_1.default.post(`${this.config.challonge_url}/v1/tournaments/${this.config.tournament_id}/participants/bulk_add.json`, { await axios_1.default.post(`${this.config.challonge_url}/v1/tournaments/${this.config.tournament_id}/participants/bulk_add.json`, {
...@@ -97,4 +99,3 @@ class Challonge { ...@@ -97,4 +99,3 @@ class Challonge {
} }
} }
exports.Challonge = Challonge; exports.Challonge = Challonge;
//# sourceMappingURL=challonge.js.map
\ No newline at end of file
"use strict"; "use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k; if (k2 === undefined) k2 = k;
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) { }) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k; if (k2 === undefined) k2 = k;
o[k2] = m[k]; o[k2] = m[k];
...@@ -11,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( ...@@ -11,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (
}) : function(o, v) { }) : function(o, v) {
o["default"] = v; o["default"] = v;
}); });
var __importStar = (this && this.__importStar) || function (mod) { var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod; if (mod && mod.__esModule) return mod;
var result = {}; var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod); __setModuleDefault(result, mod);
return result; return result;
}; };
})();
var __importDefault = (this && this.__importDefault) || function (mod) { var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
...@@ -582,4 +596,3 @@ class DataManager { ...@@ -582,4 +596,3 @@ class DataManager {
} }
} }
exports.DataManager = DataManager; exports.DataManager = DataManager;
//# sourceMappingURL=DataManager.js.map
\ No newline at end of file
...@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { ...@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod }; return (mod && mod.__esModule) ? mod : { "default": mod };
}; };
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeDeck = exports.encodeDeck = void 0; exports.encodeDeck = encodeDeck;
exports.decodeDeck = decodeDeck;
const assert_1 = __importDefault(require("assert")); const assert_1 = __importDefault(require("assert"));
function encodeDeck(deck) { function encodeDeck(deck) {
let pointer = 0; let pointer = 0;
...@@ -20,7 +21,6 @@ function encodeDeck(deck) { ...@@ -20,7 +21,6 @@ function encodeDeck(deck) {
(0, assert_1.default)(pointer === bufferSize, `Invalid buffer size. Expected: ${bufferSize}. Got: ${pointer}`); (0, assert_1.default)(pointer === bufferSize, `Invalid buffer size. Expected: ${bufferSize}. Got: ${pointer}`);
return buffer; return buffer;
} }
exports.encodeDeck = encodeDeck;
function decodeDeck(buffer) { function decodeDeck(buffer) {
let pointer = 0; let pointer = 0;
const mainLength = buffer.readInt32LE(pointer); const mainLength = buffer.readInt32LE(pointer);
...@@ -41,5 +41,3 @@ function decodeDeck(buffer) { ...@@ -41,5 +41,3 @@ function decodeDeck(buffer) {
} }
return { main, side }; return { main, side };
} }
exports.decodeDeck = decodeDeck;
//# sourceMappingURL=DeckEncoder.js.map
\ No newline at end of file
...@@ -17,6 +17,7 @@ let Ban = class Ban extends CreateAndUpdateTimeBase_1.CreateAndUpdateTimeBase { ...@@ -17,6 +17,7 @@ let Ban = class Ban extends CreateAndUpdateTimeBase_1.CreateAndUpdateTimeBase {
ip; ip;
name; name;
}; };
exports.Ban = Ban;
__decorate([ __decorate([
(0, typeorm_1.PrimaryGeneratedColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }), (0, typeorm_1.PrimaryGeneratedColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }),
__metadata("design:type", Number) __metadata("design:type", Number)
...@@ -31,9 +32,7 @@ __decorate([ ...@@ -31,9 +32,7 @@ __decorate([
(0, typeorm_1.Column)({ type: "varchar", length: 20, nullable: true }), (0, typeorm_1.Column)({ type: "varchar", length: 20, nullable: true }),
__metadata("design:type", String) __metadata("design:type", String)
], Ban.prototype, "name", void 0); ], Ban.prototype, "name", void 0);
Ban = __decorate([ exports.Ban = Ban = __decorate([
(0, typeorm_1.Entity)(), (0, typeorm_1.Entity)(),
(0, typeorm_1.Unique)(["ip", "name"]) (0, typeorm_1.Unique)(["ip", "name"])
], Ban); ], Ban);
exports.Ban = Ban;
//# sourceMappingURL=Ban.js.map
\ No newline at end of file
...@@ -17,6 +17,7 @@ class BasePlayer extends CreateAndUpdateTimeBase_1.CreateAndUpdateTimeBase { ...@@ -17,6 +17,7 @@ class BasePlayer extends CreateAndUpdateTimeBase_1.CreateAndUpdateTimeBase {
name; name;
pos; pos;
} }
exports.BasePlayer = BasePlayer;
__decorate([ __decorate([
(0, typeorm_1.PrimaryGeneratedColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }), (0, typeorm_1.PrimaryGeneratedColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }),
__metadata("design:type", Number) __metadata("design:type", Number)
...@@ -29,5 +30,3 @@ __decorate([ ...@@ -29,5 +30,3 @@ __decorate([
(0, typeorm_1.Column)({ type: "tinyint" }), (0, typeorm_1.Column)({ type: "tinyint" }),
__metadata("design:type", Number) __metadata("design:type", Number)
], BasePlayer.prototype, "pos", void 0); ], BasePlayer.prototype, "pos", void 0);
exports.BasePlayer = BasePlayer;
//# sourceMappingURL=BasePlayer.js.map
\ No newline at end of file
...@@ -41,6 +41,7 @@ let CloudReplay = class CloudReplay extends CreateAndUpdateTimeBase_1.CreateAndU ...@@ -41,6 +41,7 @@ let CloudReplay = class CloudReplay extends CreateAndUpdateTimeBase_1.CreateAndU
return `R#${this.id} ${this.getPlayerNamesString()} ${this.getDateString()}`; return `R#${this.id} ${this.getPlayerNamesString()} ${this.getDateString()}`;
} }
}; };
exports.CloudReplay = CloudReplay;
__decorate([ __decorate([
(0, typeorm_1.PrimaryColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }), (0, typeorm_1.PrimaryColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }),
__metadata("design:type", Number) __metadata("design:type", Number)
...@@ -58,12 +59,10 @@ __decorate([ ...@@ -58,12 +59,10 @@ __decorate([
(0, typeorm_1.OneToMany)(() => CloudReplayPlayer_1.CloudReplayPlayer, player => player.cloudReplay), (0, typeorm_1.OneToMany)(() => CloudReplayPlayer_1.CloudReplayPlayer, player => player.cloudReplay),
__metadata("design:type", Array) __metadata("design:type", Array)
], CloudReplay.prototype, "players", void 0); ], CloudReplay.prototype, "players", void 0);
CloudReplay = __decorate([ exports.CloudReplay = CloudReplay = __decorate([
(0, typeorm_1.Entity)({ (0, typeorm_1.Entity)({
orderBy: { orderBy: {
date: "DESC" date: "DESC"
} }
}) })
], CloudReplay); ], CloudReplay);
exports.CloudReplay = CloudReplay;
//# sourceMappingURL=CloudReplay.js.map
\ No newline at end of file
...@@ -25,6 +25,7 @@ let CloudReplayPlayer = CloudReplayPlayer_1 = class CloudReplayPlayer extends Ba ...@@ -25,6 +25,7 @@ let CloudReplayPlayer = CloudReplayPlayer_1 = class CloudReplayPlayer extends Ba
return p; return p;
} }
}; };
exports.CloudReplayPlayer = CloudReplayPlayer;
__decorate([ __decorate([
(0, typeorm_1.Index)(), (0, typeorm_1.Index)(),
(0, typeorm_1.Column)({ type: "varchar", length: 128 }), (0, typeorm_1.Column)({ type: "varchar", length: 128 }),
...@@ -34,8 +35,6 @@ __decorate([ ...@@ -34,8 +35,6 @@ __decorate([
(0, typeorm_1.ManyToOne)(() => CloudReplay_1.CloudReplay, replay => replay.players), (0, typeorm_1.ManyToOne)(() => CloudReplay_1.CloudReplay, replay => replay.players),
__metadata("design:type", CloudReplay_1.CloudReplay) __metadata("design:type", CloudReplay_1.CloudReplay)
], CloudReplayPlayer.prototype, "cloudReplay", void 0); ], CloudReplayPlayer.prototype, "cloudReplay", void 0);
CloudReplayPlayer = CloudReplayPlayer_1 = __decorate([ exports.CloudReplayPlayer = CloudReplayPlayer = CloudReplayPlayer_1 = __decorate([
(0, typeorm_1.Entity)() (0, typeorm_1.Entity)()
], CloudReplayPlayer); ], CloudReplayPlayer);
exports.CloudReplayPlayer = CloudReplayPlayer;
//# sourceMappingURL=CloudReplayPlayer.js.map
\ No newline at end of file
...@@ -15,6 +15,7 @@ class CreateAndUpdateTimeBase { ...@@ -15,6 +15,7 @@ class CreateAndUpdateTimeBase {
createTime; createTime;
updateTime; updateTime;
} }
exports.CreateAndUpdateTimeBase = CreateAndUpdateTimeBase;
__decorate([ __decorate([
(0, typeorm_1.CreateDateColumn)(), (0, typeorm_1.CreateDateColumn)(),
__metadata("design:type", Date) __metadata("design:type", Date)
...@@ -23,5 +24,3 @@ __decorate([ ...@@ -23,5 +24,3 @@ __decorate([
(0, typeorm_1.UpdateDateColumn)(), (0, typeorm_1.UpdateDateColumn)(),
__metadata("design:type", Date) __metadata("design:type", Date)
], CreateAndUpdateTimeBase.prototype, "updateTime", void 0); ], CreateAndUpdateTimeBase.prototype, "updateTime", void 0);
exports.CreateAndUpdateTimeBase = CreateAndUpdateTimeBase;
//# sourceMappingURL=CreateAndUpdateTimeBase.js.map
\ No newline at end of file
...@@ -55,6 +55,7 @@ let DuelLog = class DuelLog extends CreateAndUpdateTimeBase_1.CreateAndUpdateTim ...@@ -55,6 +55,7 @@ let DuelLog = class DuelLog extends CreateAndUpdateTimeBase_1.CreateAndUpdateTim
return data; return data;
} }
}; };
exports.DuelLog = DuelLog;
__decorate([ __decorate([
(0, typeorm_1.PrimaryGeneratedColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }), (0, typeorm_1.PrimaryGeneratedColumn)({ unsigned: true, type: global.PrimaryKeyType || 'bigint' }),
__metadata("design:type", Number) __metadata("design:type", Number)
...@@ -94,12 +95,10 @@ __decorate([ ...@@ -94,12 +95,10 @@ __decorate([
(0, typeorm_1.OneToMany)(() => DuelLogPlayer_1.DuelLogPlayer, player => player.duelLog), (0, typeorm_1.OneToMany)(() => DuelLogPlayer_1.DuelLogPlayer, player => player.duelLog),
__metadata("design:type", Array) __metadata("design:type", Array)
], DuelLog.prototype, "players", void 0); ], DuelLog.prototype, "players", void 0);
DuelLog = __decorate([ exports.DuelLog = DuelLog = __decorate([
(0, typeorm_1.Entity)({ (0, typeorm_1.Entity)({
orderBy: { orderBy: {
id: "DESC" id: "DESC"
} }
}) })
], DuelLog); ], DuelLog);
exports.DuelLog = DuelLog;
//# sourceMappingURL=DuelLog.js.map
\ No newline at end of file
...@@ -62,6 +62,7 @@ let DuelLogPlayer = DuelLogPlayer_1 = class DuelLogPlayer extends BasePlayer_1.B ...@@ -62,6 +62,7 @@ let DuelLogPlayer = DuelLogPlayer_1 = class DuelLogPlayer extends BasePlayer_1.B
return p; return p;
} }
}; };
exports.DuelLogPlayer = DuelLogPlayer;
__decorate([ __decorate([
(0, typeorm_1.Index)(), (0, typeorm_1.Index)(),
(0, typeorm_1.Column)({ type: "varchar", length: 20 }), (0, typeorm_1.Column)({ type: "varchar", length: 20 }),
...@@ -104,8 +105,6 @@ __decorate([ ...@@ -104,8 +105,6 @@ __decorate([
(0, typeorm_1.ManyToOne)(() => DuelLog_1.DuelLog, duelLog => duelLog.players), (0, typeorm_1.ManyToOne)(() => DuelLog_1.DuelLog, duelLog => duelLog.players),
__metadata("design:type", DuelLog_1.DuelLog) __metadata("design:type", DuelLog_1.DuelLog)
], DuelLogPlayer.prototype, "duelLog", void 0); ], DuelLogPlayer.prototype, "duelLog", void 0);
DuelLogPlayer = DuelLogPlayer_1 = __decorate([ exports.DuelLogPlayer = DuelLogPlayer = DuelLogPlayer_1 = __decorate([
(0, typeorm_1.Entity)() (0, typeorm_1.Entity)()
], DuelLogPlayer); ], DuelLogPlayer);
exports.DuelLogPlayer = DuelLogPlayer;
//# sourceMappingURL=DuelLogPlayer.js.map
\ No newline at end of file
...@@ -25,6 +25,7 @@ let RandomDuelBan = class RandomDuelBan extends CreateAndUpdateTimeBase_1.Create ...@@ -25,6 +25,7 @@ let RandomDuelBan = class RandomDuelBan extends CreateAndUpdateTimeBase_1.Create
return this.needTip > 0 ? true : false; return this.needTip > 0 ? true : false;
} }
}; };
exports.RandomDuelBan = RandomDuelBan;
__decorate([ __decorate([
(0, typeorm_1.PrimaryColumn)({ type: "varchar", length: 64 }), (0, typeorm_1.PrimaryColumn)({ type: "varchar", length: 64 }),
__metadata("design:type", String) __metadata("design:type", String)
...@@ -45,8 +46,6 @@ __decorate([ ...@@ -45,8 +46,6 @@ __decorate([
(0, typeorm_1.Column)({ type: "tinyint", unsigned: true }), (0, typeorm_1.Column)({ type: "tinyint", unsigned: true }),
__metadata("design:type", Number) __metadata("design:type", Number)
], RandomDuelBan.prototype, "needTip", void 0); ], RandomDuelBan.prototype, "needTip", void 0);
RandomDuelBan = __decorate([ exports.RandomDuelBan = RandomDuelBan = __decorate([
(0, typeorm_1.Entity)() (0, typeorm_1.Entity)()
], RandomDuelBan); ], RandomDuelBan);
exports.RandomDuelBan = RandomDuelBan;
//# sourceMappingURL=RandomDuelBan.js.map
\ No newline at end of file
...@@ -47,6 +47,7 @@ let RandomDuelScore = class RandomDuelScore extends CreateAndUpdateTimeBase_1.Cr ...@@ -47,6 +47,7 @@ let RandomDuelScore = class RandomDuelScore extends CreateAndUpdateTimeBase_1.Cr
} }
} }
}; };
exports.RandomDuelScore = RandomDuelScore;
__decorate([ __decorate([
(0, typeorm_1.PrimaryColumn)({ type: "varchar", length: 20 }), (0, typeorm_1.PrimaryColumn)({ type: "varchar", length: 20 }),
__metadata("design:type", String) __metadata("design:type", String)
...@@ -70,8 +71,6 @@ __decorate([ ...@@ -70,8 +71,6 @@ __decorate([
(0, typeorm_1.Column)("int", { unsigned: true, default: 0 }), (0, typeorm_1.Column)("int", { unsigned: true, default: 0 }),
__metadata("design:type", Number) __metadata("design:type", Number)
], RandomDuelScore.prototype, "winCombo", void 0); ], RandomDuelScore.prototype, "winCombo", void 0);
RandomDuelScore = __decorate([ exports.RandomDuelScore = RandomDuelScore = __decorate([
(0, typeorm_1.Entity)() (0, typeorm_1.Entity)()
], RandomDuelScore); ], RandomDuelScore);
exports.RandomDuelScore = RandomDuelScore;
//# sourceMappingURL=RandomDuelScore.js.map
\ No newline at end of file
...@@ -16,6 +16,7 @@ let User = class User extends CreateAndUpdateTimeBase_1.CreateAndUpdateTimeBase ...@@ -16,6 +16,7 @@ let User = class User extends CreateAndUpdateTimeBase_1.CreateAndUpdateTimeBase
key; key;
chatColor; chatColor;
}; };
exports.User = User;
__decorate([ __decorate([
(0, typeorm_1.PrimaryColumn)({ type: "varchar", length: 128 }), (0, typeorm_1.PrimaryColumn)({ type: "varchar", length: 128 }),
__metadata("design:type", String) __metadata("design:type", String)
...@@ -24,8 +25,6 @@ __decorate([ ...@@ -24,8 +25,6 @@ __decorate([
(0, typeorm_1.Column)("varchar", { length: 16, nullable: true }), (0, typeorm_1.Column)("varchar", { length: 16, nullable: true }),
__metadata("design:type", String) __metadata("design:type", String)
], User.prototype, "chatColor", void 0); ], User.prototype, "chatColor", void 0);
User = __decorate([ exports.User = User = __decorate([
(0, typeorm_1.Entity)() (0, typeorm_1.Entity)()
], User); ], User);
exports.User = User;
//# sourceMappingURL=User.js.map
\ No newline at end of file
...@@ -37,11 +37,12 @@ ...@@ -37,11 +37,12 @@
"devDependencies": { "devDependencies": {
"@types/bunyan": "^1.8.8", "@types/bunyan": "^1.8.8",
"@types/ip6addr": "^0.2.3", "@types/ip6addr": "^0.2.3",
"@types/node": "^17.0.19", "@types/lzma": "^2.3.0",
"@types/node": "^16.18.126",
"@types/underscore": "^1.11.4", "@types/underscore": "^1.11.4",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"coffeescript": "^2.6.1", "coffeescript": "^2.7.0",
"typescript": "^4.5.5" "typescript": "^5.8.3"
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
...@@ -87,11 +88,22 @@ ...@@ -87,11 +88,22 @@
"integrity": "sha512-oe7hzc+P9DU6+gql8+bLKuUf4WL4aakyCSXZMZq2cjhhGK75qYwH1zJ4s94XOlnb4cAhrGKwnbrmMBaqDK8+Ww==", "integrity": "sha512-oe7hzc+P9DU6+gql8+bLKuUf4WL4aakyCSXZMZq2cjhhGK75qYwH1zJ4s94XOlnb4cAhrGKwnbrmMBaqDK8+Ww==",
"dev": true "dev": true
}, },
"node_modules/@types/lzma": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@types/lzma/-/lzma-2.3.0.tgz",
"integrity": "sha512-z7TknP6ts5GPnN7P2bkZC1B/tMpoMJXG3UnPY1XDrwBq1OJQ2EpHtEypFwq5Q0A5iS37+oc+MT/o/B7x5lgl8Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "17.0.19", "version": "16.18.126",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.19.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz",
"integrity": "sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==", "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==",
"dev": true "dev": true,
"license": "MIT"
}, },
"node_modules/@types/underscore": { "node_modules/@types/underscore": {
"version": "1.11.4", "version": "1.11.4",
...@@ -604,10 +616,11 @@ ...@@ -604,10 +616,11 @@
} }
}, },
"node_modules/coffeescript": { "node_modules/coffeescript": {
"version": "2.6.1", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.6.1.tgz", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz",
"integrity": "sha512-GG5nkF93qII8HmHqnnibkgpp/SV7PSnSPiWsbinwya7nNOe95aE/x2xrKZJFks8Qpko3TNrC+/LahaKgrz5YCg==", "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==",
"dev": true, "dev": true,
"license": "MIT",
"bin": { "bin": {
"cake": "bin/cake", "cake": "bin/cake",
"coffee": "bin/coffee" "coffee": "bin/coffee"
...@@ -2682,16 +2695,17 @@ ...@@ -2682,16 +2695,17 @@
} }
}, },
"node_modules/typescript": { "node_modules/typescript": {
"version": "4.5.5", "version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true, "dev": true,
"license": "Apache-2.0",
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"
}, },
"engines": { "engines": {
"node": ">=4.2.0" "node": ">=14.17"
} }
}, },
"node_modules/underscore": { "node_modules/underscore": {
...@@ -3154,10 +3168,19 @@ ...@@ -3154,10 +3168,19 @@
"integrity": "sha512-oe7hzc+P9DU6+gql8+bLKuUf4WL4aakyCSXZMZq2cjhhGK75qYwH1zJ4s94XOlnb4cAhrGKwnbrmMBaqDK8+Ww==", "integrity": "sha512-oe7hzc+P9DU6+gql8+bLKuUf4WL4aakyCSXZMZq2cjhhGK75qYwH1zJ4s94XOlnb4cAhrGKwnbrmMBaqDK8+Ww==",
"dev": true "dev": true
}, },
"@types/lzma": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/@types/lzma/-/lzma-2.3.0.tgz",
"integrity": "sha512-z7TknP6ts5GPnN7P2bkZC1B/tMpoMJXG3UnPY1XDrwBq1OJQ2EpHtEypFwq5Q0A5iS37+oc+MT/o/B7x5lgl8Q==",
"dev": true,
"requires": {
"@types/node": "*"
}
},
"@types/node": { "@types/node": {
"version": "17.0.19", "version": "16.18.126",
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.19.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz",
"integrity": "sha512-PfeQhvcMR4cPFVuYfBN4ifG7p9c+Dlh3yUZR6k+5yQK7wX3gDgVxBly4/WkBRs9x4dmcy1TVl08SY67wwtEvmA==", "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==",
"dev": true "dev": true
}, },
"@types/underscore": { "@types/underscore": {
...@@ -3547,9 +3570,9 @@ ...@@ -3547,9 +3570,9 @@
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
}, },
"coffeescript": { "coffeescript": {
"version": "2.6.1", "version": "2.7.0",
"resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.6.1.tgz", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.7.0.tgz",
"integrity": "sha512-GG5nkF93qII8HmHqnnibkgpp/SV7PSnSPiWsbinwya7nNOe95aE/x2xrKZJFks8Qpko3TNrC+/LahaKgrz5YCg==", "integrity": "sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==",
"dev": true "dev": true
}, },
"color-convert": { "color-convert": {
...@@ -5169,9 +5192,9 @@ ...@@ -5169,9 +5192,9 @@
} }
}, },
"typescript": { "typescript": {
"version": "4.5.5", "version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true "dev": true
}, },
"underscore": { "underscore": {
......
...@@ -48,10 +48,11 @@ ...@@ -48,10 +48,11 @@
"devDependencies": { "devDependencies": {
"@types/bunyan": "^1.8.8", "@types/bunyan": "^1.8.8",
"@types/ip6addr": "^0.2.3", "@types/ip6addr": "^0.2.3",
"@types/node": "^17.0.19", "@types/lzma": "^2.3.0",
"@types/node": "^16.18.126",
"@types/underscore": "^1.11.4", "@types/underscore": "^1.11.4",
"@types/ws": "^8.5.3", "@types/ws": "^8.5.3",
"coffeescript": "^2.6.1", "coffeescript": "^2.7.0",
"typescript": "^4.5.5" "typescript": "^5.8.3"
} }
} }
// Generated by CoffeeScript 2.6.1 // Generated by CoffeeScript 2.7.0
(function() { (function() {
var WebSocketServer, _delete, broadcast, clients, create, init, room_data, server, settings, start, update, url; var WebSocketServer, _delete, broadcast, clients, create, init, room_data, server, settings, start, update, url;
......
...@@ -5,8 +5,7 @@ ...@@ -5,8 +5,7 @@
"esModuleInterop": true, "esModuleInterop": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"emitDecoratorMetadata": true, "emitDecoratorMetadata": true,
"experimentalDecorators": true, "experimentalDecorators": true
"sourceMap": true
}, },
"compileOnSave": true, "compileOnSave": true,
"allowJs": true, "allowJs": true,
......
// Generated by CoffeeScript 2.6.1 // Generated by CoffeeScript 2.7.0
(function() { (function() {
/* /*
Main script of new dashboard account system. Main script of new dashboard account system.
......
...@@ -439,7 +439,7 @@ init = () -> ...@@ -439,7 +439,7 @@ init = () ->
long_resolve_cards = global.long_resolve_cards = await loadJSONAsync('./data/long_resolve_cards.json') long_resolve_cards = global.long_resolve_cards = await loadJSONAsync('./data/long_resolve_cards.json')
if settings.modules.tournament_mode.enable_recover if settings.modules.tournament_mode.enable_recover
ReplayParser = global.ReplayParser = require "./Replay.js" ReplayParser = global.ReplayParser = (require "./Replay.js").Replay
if settings.modules.athletic_check.enabled if settings.modules.athletic_check.enabled
AthleticChecker = require("./athletic-check.js").AthleticChecker AthleticChecker = require("./athletic-check.js").AthleticChecker
......
// Generated by CoffeeScript 2.6.1 // Generated by CoffeeScript 2.7.0
(function() { (function() {
// 标准库 // 标准库
var CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_replays_and_kick, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, moment_long_ago_string, moment_now, moment_now_string, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib; var CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, CLIENT_send_replays_and_kick, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, log, long_resolve_cards, memory_usage, merge, moment, moment_long_ago_string, moment_now, moment_now_string, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
......
// Generated by CoffeeScript 2.6.1 // Generated by CoffeeScript 2.7.0
(function() { (function() {
var Struct, YGOProMessagesHelper, _, loadJSON, translateHandler; var Struct, YGOProMessagesHelper, _, loadJSON, translateHandler;
......
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