Commit 6bf0003b authored by nanahira's avatar nanahira

vip info

parent 56f15b58
...@@ -335,6 +335,10 @@ class DataManager { ...@@ -335,6 +335,10 @@ class DataManager {
user.chatColor = color; user.chatColor = color;
return await this.saveUser(user); return await this.saveUser(user);
} }
async isUserVip(key) {
const user = await this.getUser(key);
return user ? user.isVip() : false;
}
async getUserDialogueText(key, cardCode) { async getUserDialogueText(key, cardCode) {
try { try {
const dialogue = await this.db.getRepository(UserDialog_1.UserDialog) const dialogue = await this.db.getRepository(UserDialog_1.UserDialog)
...@@ -395,6 +399,20 @@ class DataManager { ...@@ -395,6 +399,20 @@ class DataManager {
} }
}); });
} }
async removeUserDialogues(key, cardCode) {
try {
await this.db.createQueryBuilder()
.delete()
.from(UserDialog_1.UserDialog)
.where("cardCode = :cardCode and userKey = :key", { cardCode, key })
.execute();
return true;
}
catch (e) {
this.log.warn(`Failed to remove dialogue: ${e.toString()}`);
return false;
}
}
async migrateChatColors(data) { async migrateChatColors(data) {
await this.transaction(async (mdb) => { await this.transaction(async (mdb) => {
try { try {
...@@ -443,9 +461,11 @@ class DataManager { ...@@ -443,9 +461,11 @@ class DataManager {
}); });
try { try {
await this.db.manager.save(vipKeys); await this.db.manager.save(vipKeys);
return true;
} }
catch (e) { catch (e) {
this.log.warn(`Failed to generate keys of keyType ${keyType}: ${e.toString()}`); this.log.warn(`Failed to generate keys of keyType ${keyType}: ${e.toString()}`);
return false;
} }
} }
async useVipKey(userKey, vipKeyText) { async useVipKey(userKey, vipKeyText) {
......
...@@ -359,6 +359,10 @@ export class DataManager { ...@@ -359,6 +359,10 @@ export class DataManager {
user.chatColor = color; user.chatColor = color;
return await this.saveUser(user); return await this.saveUser(user);
} }
async isUserVip(key: string) {
const user = await this.getUser(key);
return user ? user.isVip() : false;
}
async getUserDialogueText(key: string, cardCode: number) { async getUserDialogueText(key: string, cardCode: number) {
try { try {
const dialogue = await this.db.getRepository(UserDialog) const dialogue = await this.db.getRepository(UserDialog)
...@@ -418,6 +422,21 @@ export class DataManager { ...@@ -418,6 +422,21 @@ export class DataManager {
} }
async removeUserDialogues(key: string, cardCode: number) {
try {
await this.db.createQueryBuilder()
.delete()
.from(UserDialog)
.where("cardCode = :cardCode and userKey = :key", {cardCode, key})
.execute();
return true;
} catch (e) {
this.log.warn(`Failed to remove dialogue: ${e.toString()}`);
return false;
}
}
async migrateChatColors(data: any) { async migrateChatColors(data: any) {
await this.transaction(async (mdb) => { await this.transaction(async (mdb) => {
try { try {
...@@ -467,8 +486,10 @@ export class DataManager { ...@@ -467,8 +486,10 @@ export class DataManager {
}); });
try { try {
await this.db.manager.save(vipKeys); await this.db.manager.save(vipKeys);
return true;
} catch (e) { } catch (e) {
this.log.warn(`Failed to generate keys of keyType ${keyType}: ${e.toString()}`); this.log.warn(`Failed to generate keys of keyType ${keyType}: ${e.toString()}`);
return false;
} }
} }
......
...@@ -11,25 +11,28 @@ var __metadata = (this && this.__metadata) || function (k, v) { ...@@ -11,25 +11,28 @@ var __metadata = (this && this.__metadata) || function (k, v) {
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.Ban = void 0; exports.Ban = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
let Ban = class Ban { let Ban = /** @class */ (() => {
}; let Ban = class Ban {
__decorate([ };
typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }), __decorate([
__metadata("design:type", Number) typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }),
], Ban.prototype, "id", void 0); __metadata("design:type", Number)
__decorate([ ], Ban.prototype, "id", void 0);
typeorm_1.Index(), __decorate([
typeorm_1.Column({ type: "varchar", length: 64, nullable: true }), typeorm_1.Index(),
__metadata("design:type", String) typeorm_1.Column({ type: "varchar", length: 64, nullable: true }),
], Ban.prototype, "ip", void 0); __metadata("design:type", String)
__decorate([ ], Ban.prototype, "ip", void 0);
typeorm_1.Index(), __decorate([
typeorm_1.Column({ type: "varchar", length: 20, nullable: true }), typeorm_1.Index(),
__metadata("design:type", String) typeorm_1.Column({ type: "varchar", length: 20, nullable: true }),
], Ban.prototype, "name", void 0); __metadata("design:type", String)
Ban = __decorate([ ], Ban.prototype, "name", void 0);
typeorm_1.Entity(), Ban = __decorate([
typeorm_1.Unique(["ip", "name"]) typeorm_1.Entity(),
], Ban); typeorm_1.Unique(["ip", "name"])
], Ban);
return Ban;
})();
exports.Ban = Ban; exports.Ban = Ban;
//# sourceMappingURL=Ban.js.map //# sourceMappingURL=Ban.js.map
\ No newline at end of file
...@@ -11,19 +11,22 @@ var __metadata = (this && this.__metadata) || function (k, v) { ...@@ -11,19 +11,22 @@ var __metadata = (this && this.__metadata) || function (k, v) {
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.BasePlayer = void 0; exports.BasePlayer = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
class BasePlayer { let BasePlayer = /** @class */ (() => {
} class BasePlayer {
__decorate([ }
typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }), __decorate([
__metadata("design:type", Number) typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }),
], BasePlayer.prototype, "id", void 0); __metadata("design:type", Number)
__decorate([ ], BasePlayer.prototype, "id", void 0);
typeorm_1.Column({ type: "varchar", length: 20 }), __decorate([
__metadata("design:type", String) typeorm_1.Column({ type: "varchar", length: 20 }),
], BasePlayer.prototype, "name", void 0); __metadata("design:type", String)
__decorate([ ], BasePlayer.prototype, "name", void 0);
typeorm_1.Column({ type: "tinyint" }), __decorate([
__metadata("design:type", Number) typeorm_1.Column({ type: "tinyint" }),
], BasePlayer.prototype, "pos", void 0); __metadata("design:type", Number)
], BasePlayer.prototype, "pos", void 0);
return BasePlayer;
})();
exports.BasePlayer = BasePlayer; exports.BasePlayer = BasePlayer;
//# sourceMappingURL=BasePlayer.js.map //# sourceMappingURL=BasePlayer.js.map
\ No newline at end of file
...@@ -17,43 +17,46 @@ const typeorm_1 = require("typeorm"); ...@@ -17,43 +17,46 @@ const typeorm_1 = require("typeorm");
const CloudReplayPlayer_1 = require("./CloudReplayPlayer"); const CloudReplayPlayer_1 = require("./CloudReplayPlayer");
const underscore_1 = __importDefault(require("underscore")); const underscore_1 = __importDefault(require("underscore"));
const moment_1 = __importDefault(require("moment")); const moment_1 = __importDefault(require("moment"));
let CloudReplay = class CloudReplay { let CloudReplay = /** @class */ (() => {
fromBuffer(buffer) { let CloudReplay = class CloudReplay {
this.data = buffer.toString("base64"); fromBuffer(buffer) {
} this.data = buffer.toString("base64");
toBuffer() { }
return Buffer.from(this.data, "base64"); toBuffer() {
} return Buffer.from(this.data, "base64");
getDateString() { }
return moment_1.default(this.date).format('YYYY-MM-DD HH:mm:ss'); getDateString() {
} return moment_1.default(this.date).format('YYYY-MM-DD HH:mm:ss');
getPlayerNamesString() { }
const playerInfos = underscore_1.default.clone(this.players); getPlayerNamesString() {
playerInfos.sort((p1, p2) => p1.pos - p2.pos); const playerInfos = underscore_1.default.clone(this.players);
return playerInfos[0].name + (playerInfos[2] ? "+" + playerInfos[2].name : "") + " VS " + (playerInfos[1] ? playerInfos[1].name : "AI") + (playerInfos[3] ? "+" + playerInfos[3].name : ""); playerInfos.sort((p1, p2) => p1.pos - p2.pos);
} return playerInfos[0].name + (playerInfos[2] ? "+" + playerInfos[2].name : "") + " VS " + (playerInfos[1] ? playerInfos[1].name : "AI") + (playerInfos[3] ? "+" + playerInfos[3].name : "");
getDisplayString() { }
return `R#${this.id} ${this.getPlayerNamesString()} ${this.getDateString()}`; getDisplayString() {
} return `R#${this.id} ${this.getPlayerNamesString()} ${this.getDateString()}`;
}; }
__decorate([ };
typeorm_1.PrimaryColumn({ unsigned: true, type: "bigint" }), __decorate([
__metadata("design:type", Number) typeorm_1.PrimaryColumn({ unsigned: true, type: "bigint" }),
], CloudReplay.prototype, "id", void 0); __metadata("design:type", Number)
__decorate([ ], CloudReplay.prototype, "id", void 0);
typeorm_1.Column({ type: "text" }), __decorate([
__metadata("design:type", String) typeorm_1.Column({ type: "text" }),
], CloudReplay.prototype, "data", void 0); __metadata("design:type", String)
__decorate([ ], CloudReplay.prototype, "data", void 0);
typeorm_1.Column({ type: "datetime" }), __decorate([
__metadata("design:type", Date) typeorm_1.Column({ type: "datetime" }),
], CloudReplay.prototype, "date", void 0); __metadata("design:type", Date)
__decorate([ ], CloudReplay.prototype, "date", void 0);
typeorm_1.OneToMany(() => CloudReplayPlayer_1.CloudReplayPlayer, player => player.cloudReplay), __decorate([
__metadata("design:type", Array) typeorm_1.OneToMany(() => CloudReplayPlayer_1.CloudReplayPlayer, player => player.cloudReplay),
], CloudReplay.prototype, "players", void 0); __metadata("design:type", Array)
CloudReplay = __decorate([ ], CloudReplay.prototype, "players", void 0);
typeorm_1.Entity() CloudReplay = __decorate([
], CloudReplay); typeorm_1.Entity()
], CloudReplay);
return CloudReplay;
})();
exports.CloudReplay = CloudReplay; exports.CloudReplay = CloudReplay;
//# sourceMappingURL=CloudReplay.js.map //# sourceMappingURL=CloudReplay.js.map
\ No newline at end of file
...@@ -8,32 +8,35 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, ...@@ -8,32 +8,35 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
var __metadata = (this && this.__metadata) || function (k, v) { var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
}; };
var CloudReplayPlayer_1;
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.CloudReplayPlayer = void 0; exports.CloudReplayPlayer = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
const CloudReplay_1 = require("./CloudReplay"); const CloudReplay_1 = require("./CloudReplay");
const BasePlayer_1 = require("./BasePlayer"); const BasePlayer_1 = require("./BasePlayer");
let CloudReplayPlayer = CloudReplayPlayer_1 = class CloudReplayPlayer extends BasePlayer_1.BasePlayer { let CloudReplayPlayer = /** @class */ (() => {
static fromPlayerInfo(info) { var CloudReplayPlayer_1;
const p = new CloudReplayPlayer_1(); let CloudReplayPlayer = CloudReplayPlayer_1 = class CloudReplayPlayer extends BasePlayer_1.BasePlayer {
p.key = info.key; static fromPlayerInfo(info) {
p.name = info.name; const p = new CloudReplayPlayer_1();
p.pos = info.pos; p.key = info.key;
return p; p.name = info.name;
} p.pos = info.pos;
}; return p;
__decorate([ }
typeorm_1.Index(), };
typeorm_1.Column({ type: "varchar", length: 40 }), __decorate([
__metadata("design:type", String) typeorm_1.Index(),
], CloudReplayPlayer.prototype, "key", void 0); typeorm_1.Column({ type: "varchar", length: 40 }),
__decorate([ __metadata("design:type", String)
typeorm_1.ManyToOne(() => CloudReplay_1.CloudReplay, replay => replay.players), ], CloudReplayPlayer.prototype, "key", void 0);
__metadata("design:type", CloudReplay_1.CloudReplay) __decorate([
], CloudReplayPlayer.prototype, "cloudReplay", void 0); typeorm_1.ManyToOne(() => CloudReplay_1.CloudReplay, replay => replay.players),
CloudReplayPlayer = CloudReplayPlayer_1 = __decorate([ __metadata("design:type", CloudReplay_1.CloudReplay)
typeorm_1.Entity() ], CloudReplayPlayer.prototype, "cloudReplay", void 0);
], CloudReplayPlayer); CloudReplayPlayer = CloudReplayPlayer_1 = __decorate([
typeorm_1.Entity()
], CloudReplayPlayer);
return CloudReplayPlayer;
})();
exports.CloudReplayPlayer = CloudReplayPlayer; exports.CloudReplayPlayer = CloudReplayPlayer;
//# sourceMappingURL=CloudReplayPlayer.js.map //# sourceMappingURL=CloudReplayPlayer.js.map
\ No newline at end of file
...@@ -17,73 +17,76 @@ const typeorm_1 = require("typeorm"); ...@@ -17,73 +17,76 @@ const typeorm_1 = require("typeorm");
const DuelLogPlayer_1 = require("./DuelLogPlayer"); const DuelLogPlayer_1 = require("./DuelLogPlayer");
const moment_1 = __importDefault(require("moment")); const moment_1 = __importDefault(require("moment"));
const underscore_1 = __importDefault(require("underscore")); const underscore_1 = __importDefault(require("underscore"));
let DuelLog = class DuelLog { let DuelLog = /** @class */ (() => {
getViewString() { let DuelLog = class DuelLog {
const viewPlayers = underscore_1.default.clone(this.players); getViewString() {
viewPlayers.sort((p1, p2) => p1.pos - p2.pos); const viewPlayers = underscore_1.default.clone(this.players);
const playerString = viewPlayers[0].realName.split("$")[0] + (viewPlayers[2] ? "+" + viewPlayers[2].realName.split("$")[0] : "") + " VS " + (viewPlayers[1] ? viewPlayers[1].realName.split("$")[0] : "AI") + (viewPlayers[3] ? "+" + viewPlayers[3].realName.split("$")[0] : ""); viewPlayers.sort((p1, p2) => p1.pos - p2.pos);
return `<${this.id}> ${playerString} ${moment_1.default(this.time).format("YYYY-MM-DD HH-mm-ss")}`; const playerString = viewPlayers[0].realName.split("$")[0] + (viewPlayers[2] ? "+" + viewPlayers[2].realName.split("$")[0] : "") + " VS " + (viewPlayers[1] ? viewPlayers[1].realName.split("$")[0] : "AI") + (viewPlayers[3] ? "+" + viewPlayers[3].realName.split("$")[0] : "");
} return `<${this.id}> ${playerString} ${moment_1.default(this.time).format("YYYY-MM-DD HH-mm-ss")}`;
getViewJSON(tournamentModeSettings) { }
const data = { getViewJSON(tournamentModeSettings) {
id: this.id, const data = {
time: moment_1.default(this.time).format("YYYY-MM-DD HH:mm:ss"), id: this.id,
name: this.name + (tournamentModeSettings.show_info ? " (Duel:" + this.duelCount + ")" : ""), time: moment_1.default(this.time).format("YYYY-MM-DD HH:mm:ss"),
roomid: this.roomId, name: this.name + (tournamentModeSettings.show_info ? " (Duel:" + this.duelCount + ")" : ""),
cloud_replay_id: "R#" + this.cloudReplayId, roomid: this.roomId,
replay_filename: this.replayFileName, cloud_replay_id: "R#" + this.cloudReplayId,
roommode: this.roomMode, replay_filename: this.replayFileName,
players: this.players.map(player => { roommode: this.roomMode,
return { players: this.players.map(player => {
pos: player.pos, return {
is_first: player.isFirst === 1, pos: player.pos,
name: player.name + (tournamentModeSettings.show_ip ? " (IP: " + player.ip.slice(7) + ")" : "") + (tournamentModeSettings.show_info && !(this.roomMode === 2 && player.pos % 2 > 0) ? " (Score:" + player.score + " LP:" + (player.lp != null ? player.lp : "???") + (this.roomMode !== 2 ? " Cards:" + (player.cardCount != null ? player.cardCount : "???") : "") + ")" : ""), is_first: player.isFirst === 1,
winner: player.winner === 1 name: player.name + (tournamentModeSettings.show_ip ? " (IP: " + player.ip.slice(7) + ")" : "") + (tournamentModeSettings.show_info && !(this.roomMode === 2 && player.pos % 2 > 0) ? " (Score:" + player.score + " LP:" + (player.lp != null ? player.lp : "???") + (this.roomMode !== 2 ? " Cards:" + (player.cardCount != null ? player.cardCount : "???") : "") + ")" : ""),
}; winner: player.winner === 1
}) };
}; })
return data; };
} return data;
}; }
__decorate([ };
typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }), __decorate([
__metadata("design:type", Number) typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }),
], DuelLog.prototype, "id", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLog.prototype, "id", void 0);
typeorm_1.Column("datetime"), __decorate([
__metadata("design:type", Date) typeorm_1.Column("datetime"),
], DuelLog.prototype, "time", void 0); __metadata("design:type", Date)
__decorate([ ], DuelLog.prototype, "time", void 0);
typeorm_1.Index(), __decorate([
typeorm_1.Column({ type: "varchar", length: 20 }), typeorm_1.Index(),
__metadata("design:type", String) typeorm_1.Column({ type: "varchar", length: 20 }),
], DuelLog.prototype, "name", void 0); __metadata("design:type", String)
__decorate([ ], DuelLog.prototype, "name", void 0);
typeorm_1.Column("int"), __decorate([
__metadata("design:type", Number) typeorm_1.Column("int"),
], DuelLog.prototype, "roomId", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLog.prototype, "roomId", void 0);
typeorm_1.Column("bigint"), __decorate([
__metadata("design:type", Number) typeorm_1.Column("bigint"),
], DuelLog.prototype, "cloudReplayId", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLog.prototype, "cloudReplayId", void 0);
typeorm_1.Column({ type: "varchar", length: 256 }), __decorate([
__metadata("design:type", String) typeorm_1.Column({ type: "varchar", length: 256 }),
], DuelLog.prototype, "replayFileName", void 0); __metadata("design:type", String)
__decorate([ ], DuelLog.prototype, "replayFileName", void 0);
typeorm_1.Column("tinyint", { unsigned: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column("tinyint", { unsigned: true }),
], DuelLog.prototype, "roomMode", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLog.prototype, "roomMode", void 0);
typeorm_1.Column("tinyint", { unsigned: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column("tinyint", { unsigned: true }),
], DuelLog.prototype, "duelCount", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLog.prototype, "duelCount", void 0);
typeorm_1.OneToMany(() => DuelLogPlayer_1.DuelLogPlayer, player => player.duelLog), __decorate([
__metadata("design:type", Array) typeorm_1.OneToMany(() => DuelLogPlayer_1.DuelLogPlayer, player => player.duelLog),
], DuelLog.prototype, "players", void 0); __metadata("design:type", Array)
DuelLog = __decorate([ ], DuelLog.prototype, "players", void 0);
typeorm_1.Entity() DuelLog = __decorate([
], DuelLog); typeorm_1.Entity()
], DuelLog);
return DuelLog;
})();
exports.DuelLog = DuelLog; exports.DuelLog = DuelLog;
//# sourceMappingURL=DuelLog.js.map //# sourceMappingURL=DuelLog.js.map
\ No newline at end of file
...@@ -8,93 +8,96 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key, ...@@ -8,93 +8,96 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
var __metadata = (this && this.__metadata) || function (k, v) { var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
}; };
var DuelLogPlayer_1;
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.DuelLogPlayer = void 0; exports.DuelLogPlayer = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
const BasePlayer_1 = require("./BasePlayer"); const BasePlayer_1 = require("./BasePlayer");
const DuelLog_1 = require("./DuelLog"); const DuelLog_1 = require("./DuelLog");
const DeckEncoder_1 = require("../DeckEncoder"); const DeckEncoder_1 = require("../DeckEncoder");
let DuelLogPlayer = DuelLogPlayer_1 = class DuelLogPlayer extends BasePlayer_1.BasePlayer { let DuelLogPlayer = /** @class */ (() => {
setStartDeck(deck) { var DuelLogPlayer_1;
if (deck === null) { let DuelLogPlayer = DuelLogPlayer_1 = class DuelLogPlayer extends BasePlayer_1.BasePlayer {
this.startDeckBuffer = null; setStartDeck(deck) {
return; if (deck === null) {
this.startDeckBuffer = null;
return;
}
this.startDeckBuffer = DeckEncoder_1.encodeDeck(deck).toString("base64");
} }
this.startDeckBuffer = DeckEncoder_1.encodeDeck(deck).toString("base64"); getStartDeck() {
} return DeckEncoder_1.decodeDeck(Buffer.from(this.startDeckBuffer, "base64"));
getStartDeck() {
return DeckEncoder_1.decodeDeck(Buffer.from(this.startDeckBuffer, "base64"));
}
setCurrentDeck(deck) {
if (deck === null) {
this.currentDeckBuffer = null;
return;
} }
this.currentDeckBuffer = DeckEncoder_1.encodeDeck(deck).toString("base64"); setCurrentDeck(deck) {
} if (deck === null) {
getCurrentDeck() { this.currentDeckBuffer = null;
return DeckEncoder_1.decodeDeck(Buffer.from(this.currentDeckBuffer, "base64")); return;
} }
static fromDuelLogPlayerInfo(info) { this.currentDeckBuffer = DeckEncoder_1.encodeDeck(deck).toString("base64");
const p = new DuelLogPlayer_1(); }
p.name = info.name; getCurrentDeck() {
p.pos = info.pos; return DeckEncoder_1.decodeDeck(Buffer.from(this.currentDeckBuffer, "base64"));
p.realName = info.realName; }
p.lp = info.lp; static fromDuelLogPlayerInfo(info) {
p.ip = info.ip; const p = new DuelLogPlayer_1();
p.score = info.score; p.name = info.name;
p.cardCount = info.cardCount; p.pos = info.pos;
p.isFirst = info.isFirst ? 1 : 0; p.realName = info.realName;
p.winner = info.winner ? 1 : 0; p.lp = info.lp;
p.startDeckBuffer = info.startDeckBuffer.toString("base64"); p.ip = info.ip;
p.setCurrentDeck(info.deck); p.score = info.score;
return p; p.cardCount = info.cardCount;
} p.isFirst = info.isFirst ? 1 : 0;
}; p.winner = info.winner ? 1 : 0;
__decorate([ p.startDeckBuffer = info.startDeckBuffer.toString("base64");
typeorm_1.Index(), p.setCurrentDeck(info.deck);
typeorm_1.Column({ type: "varchar", length: 20 }), return p;
__metadata("design:type", String) }
], DuelLogPlayer.prototype, "realName", void 0); };
__decorate([ __decorate([
typeorm_1.Column({ type: "varchar", length: 64, nullable: true }), typeorm_1.Index(),
__metadata("design:type", String) typeorm_1.Column({ type: "varchar", length: 20 }),
], DuelLogPlayer.prototype, "ip", void 0); __metadata("design:type", String)
__decorate([ ], DuelLogPlayer.prototype, "realName", void 0);
typeorm_1.Column("tinyint", { unsigned: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column({ type: "varchar", length: 64, nullable: true }),
], DuelLogPlayer.prototype, "isFirst", void 0); __metadata("design:type", String)
__decorate([ ], DuelLogPlayer.prototype, "ip", void 0);
typeorm_1.Column("tinyint"), __decorate([
__metadata("design:type", Number) typeorm_1.Column("tinyint", { unsigned: true }),
], DuelLogPlayer.prototype, "score", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLogPlayer.prototype, "isFirst", void 0);
typeorm_1.Column("int", { nullable: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column("tinyint"),
], DuelLogPlayer.prototype, "lp", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLogPlayer.prototype, "score", void 0);
typeorm_1.Column("smallint", { nullable: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column("int", { nullable: true }),
], DuelLogPlayer.prototype, "cardCount", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLogPlayer.prototype, "lp", void 0);
typeorm_1.Column("text", { nullable: true }), __decorate([
__metadata("design:type", String) typeorm_1.Column("smallint", { nullable: true }),
], DuelLogPlayer.prototype, "startDeckBuffer", void 0); __metadata("design:type", Number)
__decorate([ ], DuelLogPlayer.prototype, "cardCount", void 0);
typeorm_1.Column("text", { nullable: true }), __decorate([
__metadata("design:type", String) typeorm_1.Column("text", { nullable: true }),
], DuelLogPlayer.prototype, "currentDeckBuffer", void 0); __metadata("design:type", String)
__decorate([ ], DuelLogPlayer.prototype, "startDeckBuffer", void 0);
typeorm_1.Column("tinyint"), __decorate([
__metadata("design:type", Number) typeorm_1.Column("text", { nullable: true }),
], DuelLogPlayer.prototype, "winner", void 0); __metadata("design:type", String)
__decorate([ ], DuelLogPlayer.prototype, "currentDeckBuffer", void 0);
typeorm_1.ManyToOne(() => DuelLog_1.DuelLog, duelLog => duelLog.players), __decorate([
__metadata("design:type", DuelLog_1.DuelLog) typeorm_1.Column("tinyint"),
], DuelLogPlayer.prototype, "duelLog", void 0); __metadata("design:type", Number)
DuelLogPlayer = DuelLogPlayer_1 = __decorate([ ], DuelLogPlayer.prototype, "winner", void 0);
typeorm_1.Entity() __decorate([
], DuelLogPlayer); typeorm_1.ManyToOne(() => DuelLog_1.DuelLog, duelLog => duelLog.players),
__metadata("design:type", DuelLog_1.DuelLog)
], DuelLogPlayer.prototype, "duelLog", void 0);
DuelLogPlayer = DuelLogPlayer_1 = __decorate([
typeorm_1.Entity()
], DuelLogPlayer);
return DuelLogPlayer;
})();
exports.DuelLogPlayer = DuelLogPlayer; exports.DuelLogPlayer = DuelLogPlayer;
//# sourceMappingURL=DuelLogPlayer.js.map //# sourceMappingURL=DuelLogPlayer.js.map
\ No newline at end of file
...@@ -11,36 +11,39 @@ var __metadata = (this && this.__metadata) || function (k, v) { ...@@ -11,36 +11,39 @@ var __metadata = (this && this.__metadata) || function (k, v) {
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
exports.RandomDuelBan = void 0; exports.RandomDuelBan = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
let RandomDuelBan = class RandomDuelBan { let RandomDuelBan = /** @class */ (() => {
setNeedTip(need) { let RandomDuelBan = class RandomDuelBan {
this.needTip = need ? 1 : 0; setNeedTip(need) {
} this.needTip = need ? 1 : 0;
getNeedTip() { }
return this.needTip > 0 ? true : false; getNeedTip() {
} return this.needTip > 0 ? true : false;
}; }
__decorate([ };
typeorm_1.PrimaryColumn({ type: "varchar", length: 64 }), __decorate([
__metadata("design:type", String) typeorm_1.PrimaryColumn({ type: "varchar", length: 64 }),
], RandomDuelBan.prototype, "ip", void 0); __metadata("design:type", String)
__decorate([ ], RandomDuelBan.prototype, "ip", void 0);
typeorm_1.Column("datetime"), __decorate([
__metadata("design:type", Date) typeorm_1.Column("datetime"),
], RandomDuelBan.prototype, "time", void 0); __metadata("design:type", Date)
__decorate([ ], RandomDuelBan.prototype, "time", void 0);
typeorm_1.Column("smallint"), __decorate([
__metadata("design:type", Number) typeorm_1.Column("smallint"),
], RandomDuelBan.prototype, "count", void 0); __metadata("design:type", Number)
__decorate([ ], RandomDuelBan.prototype, "count", void 0);
typeorm_1.Column({ type: "simple-array" }), __decorate([
__metadata("design:type", Array) typeorm_1.Column({ type: "simple-array" }),
], RandomDuelBan.prototype, "reasons", void 0); __metadata("design:type", Array)
__decorate([ ], RandomDuelBan.prototype, "reasons", void 0);
typeorm_1.Column({ type: "tinyint", unsigned: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column({ type: "tinyint", unsigned: true }),
], RandomDuelBan.prototype, "needTip", void 0); __metadata("design:type", Number)
RandomDuelBan = __decorate([ ], RandomDuelBan.prototype, "needTip", void 0);
typeorm_1.Entity() RandomDuelBan = __decorate([
], RandomDuelBan); typeorm_1.Entity()
], RandomDuelBan);
return RandomDuelBan;
})();
exports.RandomDuelBan = RandomDuelBan; exports.RandomDuelBan = RandomDuelBan;
//# sourceMappingURL=RandomDuelBan.js.map //# sourceMappingURL=RandomDuelBan.js.map
\ No newline at end of file
...@@ -17,42 +17,45 @@ const typeorm_1 = require("typeorm"); ...@@ -17,42 +17,45 @@ const typeorm_1 = require("typeorm");
const UserDialog_1 = require("./UserDialog"); const UserDialog_1 = require("./UserDialog");
const VipKey_1 = require("./VipKey"); const VipKey_1 = require("./VipKey");
const moment_1 = __importDefault(require("moment")); const moment_1 = __importDefault(require("moment"));
let User = class User { let User = /** @class */ (() => {
isVip() { let User = class User {
return this.vipExpireDate && moment_1.default().isBefore(this.vipExpireDate); isVip() {
} return this.vipExpireDate && moment_1.default().isBefore(this.vipExpireDate);
}; }
__decorate([ };
typeorm_1.PrimaryColumn({ type: "varchar", length: 128 }), __decorate([
__metadata("design:type", String) typeorm_1.PrimaryColumn({ type: "varchar", length: 128 }),
], User.prototype, "key", void 0); __metadata("design:type", String)
__decorate([ ], User.prototype, "key", void 0);
typeorm_1.Column("varchar", { length: 16, nullable: true }), __decorate([
__metadata("design:type", String) typeorm_1.Column("varchar", { length: 16, nullable: true }),
], User.prototype, "chatColor", void 0); __metadata("design:type", String)
__decorate([ ], User.prototype, "chatColor", void 0);
typeorm_1.Index(), __decorate([
typeorm_1.Column("datetime", { nullable: true }), typeorm_1.Index(),
__metadata("design:type", Date) typeorm_1.Column("datetime", { nullable: true }),
], User.prototype, "vipExpireDate", void 0); __metadata("design:type", Date)
__decorate([ ], User.prototype, "vipExpireDate", void 0);
typeorm_1.Column("text", { nullable: true }), __decorate([
__metadata("design:type", String) typeorm_1.Column("text", { nullable: true }),
], User.prototype, "victory", void 0); __metadata("design:type", String)
__decorate([ ], User.prototype, "victory", void 0);
typeorm_1.Column("text", { nullable: true }), __decorate([
__metadata("design:type", String) typeorm_1.Column("text", { nullable: true }),
], User.prototype, "words", void 0); __metadata("design:type", String)
__decorate([ ], User.prototype, "words", void 0);
typeorm_1.OneToMany(() => UserDialog_1.UserDialog, dialog => dialog.user), __decorate([
__metadata("design:type", Array) typeorm_1.OneToMany(() => UserDialog_1.UserDialog, dialog => dialog.user),
], User.prototype, "dialogues", void 0); __metadata("design:type", Array)
__decorate([ ], User.prototype, "dialogues", void 0);
typeorm_1.OneToMany(() => VipKey_1.VipKey, vipKey => vipKey.usedBy), __decorate([
__metadata("design:type", Array) typeorm_1.OneToMany(() => VipKey_1.VipKey, vipKey => vipKey.usedBy),
], User.prototype, "usedKeys", void 0); __metadata("design:type", Array)
User = __decorate([ ], User.prototype, "usedKeys", void 0);
typeorm_1.Entity() User = __decorate([
], User); typeorm_1.Entity()
], User);
return User;
})();
exports.User = User; exports.User = User;
//# sourceMappingURL=User.js.map //# sourceMappingURL=User.js.map
\ No newline at end of file
...@@ -12,27 +12,30 @@ Object.defineProperty(exports, "__esModule", { value: true }); ...@@ -12,27 +12,30 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.UserDialog = void 0; exports.UserDialog = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
const User_1 = require("./User"); const User_1 = require("./User");
let UserDialog = class UserDialog { let UserDialog = /** @class */ (() => {
}; let UserDialog = class UserDialog {
__decorate([ };
typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }), __decorate([
__metadata("design:type", Number) typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }),
], UserDialog.prototype, "id", void 0); __metadata("design:type", Number)
__decorate([ ], UserDialog.prototype, "id", void 0);
typeorm_1.Index(), __decorate([
typeorm_1.Column("int", { unsigned: true }), typeorm_1.Index(),
__metadata("design:type", Number) typeorm_1.Column("int", { unsigned: true }),
], UserDialog.prototype, "cardCode", void 0); __metadata("design:type", Number)
__decorate([ ], UserDialog.prototype, "cardCode", void 0);
typeorm_1.Column("text"), __decorate([
__metadata("design:type", String) typeorm_1.Column("text"),
], UserDialog.prototype, "text", void 0); __metadata("design:type", String)
__decorate([ ], UserDialog.prototype, "text", void 0);
typeorm_1.ManyToOne(() => User_1.User, user => user.dialogues), __decorate([
__metadata("design:type", User_1.User) typeorm_1.ManyToOne(() => User_1.User, user => user.dialogues),
], UserDialog.prototype, "user", void 0); __metadata("design:type", User_1.User)
UserDialog = __decorate([ ], UserDialog.prototype, "user", void 0);
typeorm_1.Entity() UserDialog = __decorate([
], UserDialog); typeorm_1.Entity()
], UserDialog);
return UserDialog;
})();
exports.UserDialog = UserDialog; exports.UserDialog = UserDialog;
//# sourceMappingURL=UserDialog.js.map //# sourceMappingURL=UserDialog.js.map
\ No newline at end of file
...@@ -12,34 +12,37 @@ Object.defineProperty(exports, "__esModule", { value: true }); ...@@ -12,34 +12,37 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.VipKey = void 0; exports.VipKey = void 0;
const typeorm_1 = require("typeorm"); const typeorm_1 = require("typeorm");
const User_1 = require("./User"); const User_1 = require("./User");
let VipKey = class VipKey { let VipKey = /** @class */ (() => {
toJSON() { let VipKey = class VipKey {
return { key: this.key, type: this.type }; toJSON() {
} return { key: this.key, type: this.type };
}; }
__decorate([ };
typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }), __decorate([
__metadata("design:type", Number) typeorm_1.PrimaryGeneratedColumn({ unsigned: true, type: "bigint" }),
], VipKey.prototype, "id", void 0); __metadata("design:type", Number)
__decorate([ ], VipKey.prototype, "id", void 0);
typeorm_1.Index({ unique: true }), __decorate([
typeorm_1.Column("varchar", { length: 30 }), typeorm_1.Index({ unique: true }),
__metadata("design:type", String) typeorm_1.Column("varchar", { length: 30 }),
], VipKey.prototype, "key", void 0); __metadata("design:type", String)
__decorate([ ], VipKey.prototype, "key", void 0);
typeorm_1.Column("int", { unsigned: true }), __decorate([
__metadata("design:type", Number) typeorm_1.Column("int", { unsigned: true }),
], VipKey.prototype, "type", void 0); __metadata("design:type", Number)
__decorate([ ], VipKey.prototype, "type", void 0);
typeorm_1.Column("tinyint", { unsigned: true, default: 0 }), __decorate([
__metadata("design:type", Number) typeorm_1.Column("tinyint", { unsigned: true, default: 0 }),
], VipKey.prototype, "isUsed", void 0); __metadata("design:type", Number)
__decorate([ ], VipKey.prototype, "isUsed", void 0);
typeorm_1.ManyToOne(() => User_1.User, user => user.usedKeys), __decorate([
__metadata("design:type", User_1.User) typeorm_1.ManyToOne(() => User_1.User, user => user.usedKeys),
], VipKey.prototype, "usedBy", void 0); __metadata("design:type", User_1.User)
VipKey = __decorate([ ], VipKey.prototype, "usedBy", void 0);
typeorm_1.Entity() VipKey = __decorate([
], VipKey); typeorm_1.Entity()
], VipKey);
return VipKey;
})();
exports.VipKey = VipKey; exports.VipKey = VipKey;
//# sourceMappingURL=VipKey.js.map //# sourceMappingURL=VipKey.js.map
\ No newline at end of file
...@@ -193,6 +193,7 @@ ...@@ -193,6 +193,7 @@
"vip_set_victory": "Your victory word have been set.", "vip_set_victory": "Your victory word have been set.",
"vip_password_changed": "Password changed.", "vip_password_changed": "Password changed.",
"vip_player_name_too_long": "Your username or password is too long to log in. Please change your username and try again.", "vip_player_name_too_long": "Your username or password is too long to log in. Please change your username and try again.",
"vip_no_pass": "You must use the name format of Name$Password to support.",
"replay_hint_part1": "Sending the replay of the duel number ", "replay_hint_part1": "Sending the replay of the duel number ",
"replay_hint_part2": ".", "replay_hint_part2": ".",
"arena_wait_hint": "If you opponent does not appear within 25 seconds, you may quit without any penalty.", "arena_wait_hint": "If you opponent does not appear within 25 seconds, you may quit without any penalty.",
...@@ -543,6 +544,7 @@ ...@@ -543,6 +544,7 @@
"vip_set_victory": "已设置胜利台词。", "vip_set_victory": "已设置胜利台词。",
"vip_password_changed": "密码修改成功。", "vip_password_changed": "密码修改成功。",
"vip_player_name_too_long": "你的用户名或设置的密码太长,使用此用户名可能会无法登陆。请更换用户名重试。", "vip_player_name_too_long": "你的用户名或设置的密码太长,使用此用户名可能会无法登陆。请更换用户名重试。",
"vip_no_pass": "为了保证未来可以识别您的身份,请使用 用户名$密码 的格式重试。",
"replay_hint_part1": "正在发送第", "replay_hint_part1": "正在发送第",
"replay_hint_part2": "局决斗的录像。", "replay_hint_part2": "局决斗的录像。",
"arena_wait_hint": "若对手在25秒内不进入游戏,您退房时不会进行扣分。", "arena_wait_hint": "若对手在25秒内不进入游戏,您退房时不会进行扣分。",
......
...@@ -128,69 +128,33 @@ setting_change = global.setting_change = (settings, path, val) -> ...@@ -128,69 +128,33 @@ setting_change = global.setting_change = (settings, path, val) ->
return return
VIP_generate_cdkeys = global.VIP_generate_cdkeys = (key_type, count) -> VIP_generate_cdkeys = global.VIP_generate_cdkeys = (key_type, count) ->
return false unless settings.modules.vip.enabled and vip_info.cdkeys[key_type] return false unless settings.modules.vip.enabled
for i in [0...count] return await dataManager.generateVipKeys(key_type, count)
key = Math.floor(Math.random() * 10000000000000000).toString()
vip_info.cdkeys[key_type].push(key)
setting_save(vip_info)
log.info("keys generated", key_type, count, vip_info.cdkeys[key_type].length)
return true
CLIENT_use_cdkey = global.CLIENT_use_cdkey = (client, pkey) -> CLIENT_use_cdkey = global.CLIENT_use_cdkey = (client, pkey) ->
return 0 unless settings.modules.vip.enabled and pkey key = CLIENT_get_authorize_key(client)
found_type = null return await dataManager.useVipKey(key, pkey)
for type,keys of vip_info.cdkeys
for key in keys when pkey == key or pkey == (type + "D" + settings.port + ":" + key) # support web given format CLIENT_get_save_data = global.CLIENT_get_save_data = (client) ->
found_type = parseInt(type) return await dataManager.getUser(CLIENT_get_authorize_key(client))
index = _.indexOf(keys, key)
keys.splice(index, 1) unless index == -1
break
if found_type
break
if !found_type
return 0
if !vip_info.cdkeys[found_type].length
VIP_generate_cdkeys(found_type, settings.modules.vip.generate_count)
client.vip = true
new_vip = false
if vip_info.players[client.name]
current_date = moment()
if current_date.isSameOrBefore(vip_info.players[client.name].expire_date)
current_date = moment(vip_info.players[client.name].expire_date, 'YYYY-MM-DD HH:mm:ss')
vip_info.players[client.name].expire_date = current_date.add(found_type, 'd').format('YYYY-MM-DD HH:mm:ss')
else
if !client.vpass
client.vpass = Math.floor(Math.random() * 100000).toString()
vip_info.players[client.name] = {
password: client.vpass,
expire_date: moment().add(found_type, 'd').format('YYYY-MM-DD HH:mm:ss'),
dialogues: {}
}
new_vip = true
setting_save(vip_info)
return (if new_vip then 1 else 2)
CLIENT_check_vip = global.CLIENT_check_vip = (client) -> CLIENT_check_vip = global.CLIENT_check_vip = (client) ->
if !settings.modules.vip.enabled key = CLIENT_get_authorize_key(client)
return false return await dataManager.isUserVip(key)
if !vip_info.players[client.name]
return false
if vip_info.players[client.name].password != client.vpass
return false
return moment().isSameOrBefore(vip_info.players[client.name].expire_date)
CLIENT_send_vip_status = global.CLIENT_send_vip_status = (client, display) -> CLIENT_send_vip_status = global.CLIENT_send_vip_status = (client, display) ->
if !settings.modules.vip.enabled if !settings.modules.vip.enabled
return false return false
if client.vip userData = await CLIENT_get_save_data(client)
if userData.isVip()
if display if display
ygopro.stoc_send_chat(client, "${vip_remain_part1}" + vip_info.players[client.name].expire_date + "${vip_remain_part2}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_remain_part1}" + moment(userData.vipExpireDate).format("YYYY-MM-DD HH:mm:ss") + "${vip_remain_part2}", ygopro.constants.COLORS.BABYBLUE)
else else
ygopro.stoc_send_chat(client,"${vip_remain}" , ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client,"${vip_remain}" , ygopro.constants.COLORS.BABYBLUE)
else if !vip_info.players[client.name] or vip_info.players[client.name].password != client.vpass else if !userData.vipExpireDate
ygopro.stoc_send_chat(client,"${vip_not_bought}" , ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client,"${vip_not_bought}" , ygopro.constants.COLORS.RED)
else else
ygopro.stoc_send_chat(client, "${vip_expired_part1}" + vip_info.players[client.name].expire_date + "${vip_expired_part2}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${vip_expired_part1}" + moment(userData.vipExpireDate).format("YYYY-MM-DD HH:mm:ss") + "${vip_expired_part2}", ygopro.constants.COLORS.RED)
concat_name = global.concat_name = (name, num) -> concat_name = global.concat_name = (name, num) ->
if !name[num] if !name[num]
...@@ -253,7 +217,6 @@ roomlist = null ...@@ -253,7 +217,6 @@ roomlist = null
settings = {} settings = {}
tips = null tips = null
words = null words = null
vip_info = null
dialogues = null dialogues = null
badwords = null badwords = null
lflists = global.lflists = [] lflists = global.lflists = []
...@@ -402,6 +365,10 @@ init = () -> ...@@ -402,6 +365,10 @@ init = () ->
settings.modules.chat_color.enabled = false settings.modules.chat_color.enabled = false
await setting_save(settings) await setting_save(settings)
log.warn("Chat color cannot be enabled because no MySQL.") log.warn("Chat color cannot be enabled because no MySQL.")
if settings.modules.vip.enabled
settings.modules.vip.enabled = false
await setting_save(settings)
log.warn("VIP mode cannot be enabled because no MySQL.")
# 读取数据 # 读取数据
default_data = await loadJSONAsync('./data/default_data.json') default_data = await loadJSONAsync('./data/default_data.json')
try try
...@@ -419,11 +386,14 @@ init = () -> ...@@ -419,11 +386,14 @@ init = () ->
catch catch
words = global.words = default_data.words words = global.words = default_data.words
await setting_save(words) await setting_save(words)
try if settings.modules.vip.enabled and await checkFileExists('./config/vip_info.json')
vip_info = global.vip_info = await loadJSONAsync('./config/vip_info.json') try
catch vip_info = await loadJSONAsync('./config/vip_info.json')
vip_info = global.vip_info = default_data.vip_info if vip_info
await setting_save(vip_info) await dataManager.migrateFromOldVipInfo(vip_info);
await fs.promises.rename('./config/vip_info.json', './config/vip_info.json.bak')
log.info("VIP info migrated.")
catch
try try
badwords = global.badwords = await loadJSONAsync('./config/badwords.json') badwords = global.badwords = await loadJSONAsync('./config/badwords.json')
catch catch
...@@ -669,10 +639,6 @@ init = () -> ...@@ -669,10 +639,6 @@ init = () ->
, 1000 , 1000
if settings.modules.vip.enabled
for k,v of vip_info.cdkeys when v.length == 0
VIP_generate_cdkeys(k, settings.modules.vip.generate_count)
net.createServer(netRequestHandler).listen settings.port, -> net.createServer(netRequestHandler).listen settings.port, ->
log.info "server started", settings.port log.info "server started", settings.port
return return
...@@ -972,8 +938,6 @@ CLIENT_get_authorize_key = global.CLIENT_get_authorize_key = (client) -> ...@@ -972,8 +938,6 @@ CLIENT_get_authorize_key = global.CLIENT_get_authorize_key = (client) ->
return client.name_vpass return client.name_vpass
else if settings.modules.mycard.enabled or settings.modules.tournament_mode.enabled or settings.modules.challonge.enabled or client.is_local else if settings.modules.mycard.enabled or settings.modules.tournament_mode.enabled or settings.modules.challonge.enabled or client.is_local
return client.name return client.name
else if client.vip
return client.name + "$" + client.vpass
else else
return client.ip + ":" + client.name return client.ip + ":" + client.name
...@@ -1847,6 +1811,10 @@ class Room ...@@ -1847,6 +1811,10 @@ class Room
)) ))
await return await return
playLines: (lines) ->
for line in _.lines lines
ygopro.stoc_send_chat_to_room(this, line, ygopro.constants.COLORS.PINK)
# 网络连接 # 网络连接
netRequestHandler = (client) -> netRequestHandler = (client) ->
client.ip = client.remoteAddress client.ip = client.remoteAddress
...@@ -2075,7 +2043,7 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server, datas)-> ...@@ -2075,7 +2043,7 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server, datas)->
client.vpass = vpass client.vpass = vpass
client.name_vpass = if vpass then name + "$" + vpass else name client.name_vpass = if vpass then name + "$" + vpass else name
#console.log client.name, client.vpass #console.log client.name, client.vpass
if settings.modules.vip.enabled and CLIENT_check_vip(client) if settings.modules.vip.enabled and await CLIENT_check_vip(client)
client.vip = true client.vip = true
if not settings.modules.i18n.auto_pick or client.is_local if not settings.modules.i18n.auto_pick or client.is_local
...@@ -2275,12 +2243,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2275,12 +2243,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
client.setTimeout(300000) #连接后超时5分钟 client.setTimeout(300000) #连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room) client.rid = _.indexOf(ROOM_all, room)
client.is_post_watcher = true client.is_post_watcher = true
if settings.modules.vip.enabled and client.vip and vip_info.players[client.name].words if settings.modules.vip.enabled and await CLIENT_check_vip(client)
for line in _.lines vip_info.players[client.name].words words = await dataManager.getUserWords(CLIENT_get_authorize_key(client))
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) if words
room.playLines(words)
else if settings.modules.words.enabled and words.words[client.name] else if settings.modules.words.enabled and words.words[client.name]
for line in _.lines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)] room.playLines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK)
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${watch_join}") ygopro.stoc_send_chat_to_room(room, "#{client.name} ${watch_join}")
room.watchers.push client room.watchers.push client
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE)
...@@ -2466,12 +2434,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2466,12 +2434,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
#client.setTimeout(300000) #连接后超时5分钟 #client.setTimeout(300000) #连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room) client.rid = _.indexOf(ROOM_all, room)
client.is_post_watcher = true client.is_post_watcher = true
if settings.modules.vip.enabled and client.vip and vip_info.players[client.name].words if settings.modules.vip.enabled and await CLIENT_check_vip(client)
for line in _.lines vip_info.players[client.name].words words = await dataManager.getUserWords(CLIENT_get_authorize_key(client))
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) if words
room.playLines(words)
else if settings.modules.words.enabled and words.words[client.name] else if settings.modules.words.enabled and words.words[client.name]
for line in _.lines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)] room.playLines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK)
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${watch_join}") ygopro.stoc_send_chat_to_room(room, "#{client.name} ${watch_join}")
room.watchers.push client room.watchers.push client
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE)
...@@ -2554,12 +2522,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2554,12 +2522,12 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
client.setTimeout(300000) #连接后超时5分钟 client.setTimeout(300000) #连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room) client.rid = _.indexOf(ROOM_all, room)
client.is_post_watcher = true client.is_post_watcher = true
if settings.modules.vip.enabled and client.vip and vip_info.players[client.name].words if settings.modules.vip.enabled and await CLIENT_check_vip(client)
for line in _.lines vip_info.players[client.name].words words = await dataManager.getUserWords(CLIENT_get_authorize_key(client))
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) if words
room.playLines(words)
else if settings.modules.words.enabled and words.words[client.name] else if settings.modules.words.enabled and words.words[client.name]
for line in _.lines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)] room.playLines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK)
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${watch_join}") ygopro.stoc_send_chat_to_room(room, "#{client.name} ${watch_join}")
room.watchers.push client room.watchers.push client
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE)
...@@ -2581,12 +2549,12 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)-> ...@@ -2581,12 +2549,12 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
return unless room and !client.reconnecting return unless room and !client.reconnecting
if !room.join_game_buffer if !room.join_game_buffer
room.join_game_buffer = buffer room.join_game_buffer = buffer
if settings.modules.vip.enabled and client.vip and vip_info.players[client.name].words if settings.modules.vip.enabled and await CLIENT_check_vip(client)
for line in _.lines vip_info.players[client.name].words words = await dataManager.getUserWords(CLIENT_get_authorize_key(client))
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) if words
room.playLines(words)
else if settings.modules.words.enabled and words.words[client.name] else if settings.modules.words.enabled and words.words[client.name]
for line in _.lines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)] room.playLines words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK)
if settings.modules.welcome if settings.modules.welcome
ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN) ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN)
if room.welcome if room.welcome
...@@ -2804,12 +2772,14 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)-> ...@@ -2804,12 +2772,14 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
if room.match_kill if room.match_kill
room.match_kill = false room.match_kill = false
room.scores[room.winner_name] = 99 room.scores[room.winner_name] = 99
if settings.modules.vip.enabled and room.dueling_players[pos].vip and vip_info.players[room.dueling_players[pos].name].victory if settings.modules.vip.enabled
for line in _.lines vip_info.players[room.dueling_players[pos].name].victory victoryWordPlayerList = [room.dueling_players[pos]]
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) if room.hostinfo.mode == 2
else if room.hostinfo.mode == 2 and settings.modules.vip.enabled and room.dueling_players[pos + 1].vip and vip_info.players[room.dueling_players[pos + 1].name].victory victoryWordPlayerList.push(room.dueling_players[pos + 1])
for line in _.lines vip_info.players[room.dueling_players[pos + 1].name].victory for player in victoryWordPlayerList when await CLIENT_check_vip(player) and await dataManager.getUserVictoryWords(CLIENT_get_authorize_key(player))
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK) words = await dataManager.getUserVictoryWords(CLIENT_get_authorize_key(player))
room.playLines(words)
break
if room.death if room.death
if settings.modules.http.quick_death_rule == 1 or settings.modules.http.quick_death_rule == 3 if settings.modules.http.quick_death_rule == 1 or settings.modules.http.quick_death_rule == 3
room.death = -1 room.death = -1
...@@ -2939,18 +2909,14 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)-> ...@@ -2939,18 +2909,14 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
if room.hostinfo.mode == 2 if room.hostinfo.mode == 2
act_pos = act_pos * 2 act_pos = act_pos * 2
if ygopro.constants.MSG[msg] != 'CHAINING' or (trigger_location & 0x8) and client.ready_trap if ygopro.constants.MSG[msg] != 'CHAINING' or (trigger_location & 0x8) and client.ready_trap
if settings.modules.vip.enabled and room.dueling_players[act_pos].vip and vip_info.players[room.dueling_players[act_pos].name].dialogues[card] if settings.modules.vip.enabled and await CLIENT_check_vip(room.dueling_players[act_pos]) and await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos]), card)
for line in _.lines vip_info.players[room.dueling_players[act_pos].name].dialogues[card] room.playLines await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos]), card)
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK) else if settings.modules.vip.enabled and room.hostinfo.mode == 2 and await CLIENT_check_vip(room.dueling_players[act_pos + 1]) and await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos + 1]), card)
else if settings.modules.vip.enabled and room.hostinfo.mode == 2 and room.dueling_players[act_pos + 1].vip and vip_info.players[room.dueling_players[act_pos + 1].name].dialogues[card] room.playLines await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos + 1]), card)
for line in _.lines vip_info.players[room.dueling_players[act_pos + 1].name].dialogues[card]
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK)
else if settings.modules.dialogues.enabled and dialogues.dialogues[card] else if settings.modules.dialogues.enabled and dialogues.dialogues[card]
for line in _.lines dialogues.dialogues[card][Math.floor(Math.random() * dialogues.dialogues[card].length)] room.playLines dialogues.dialogues[card][Math.floor(Math.random() * dialogues.dialogues[card].length)]
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK)
else if settings.modules.dialogues.enabled and dialogues.dialogues_custom[card] else if settings.modules.dialogues.enabled and dialogues.dialogues_custom[card]
for line in _.lines dialogues.dialogues_custom[card][Math.floor(Math.random() * dialogues.dialogues_custom[card].length)] room.playLines dialogues.dialogues_custom[card][Math.floor(Math.random() * dialogues.dialogues_custom[card].length)]
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK)
if ygopro.constants.MSG[msg] == 'POS_CHANGE' if ygopro.constants.MSG[msg] == 'POS_CHANGE'
loc = buffer.readUInt8(6) loc = buffer.readUInt8(6)
ppos = buffer.readUInt8(8) ppos = buffer.readUInt8(8)
...@@ -3382,22 +3348,20 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3382,22 +3348,20 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
when 'status' when 'status'
CLIENT_send_vip_status(client, true) CLIENT_send_vip_status(client, true)
when 'buy' when 'buy'
if vip_info.players[client.name] and vip_info.players[client.name].password != client.vpass if !client.vpass
ygopro.stoc_send_chat(client, "${vip_account_existed}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${vip_no_pass}", ygopro.constants.COLORS.BABYBLUE)
else if (!client.vpass and client.name.length > 13) or (client.vpass and (client.name.length + client.vpass.length) > 18)
ygopro.stoc_send_chat(client, "${vip_player_name_too_long}", ygopro.constants.COLORS.RED)
else else
key = cmd[2] key = cmd[2]
buy_result = CLIENT_use_cdkey(client, key) buy_result = await CLIENT_use_cdkey(client, key)
switch buy_result switch buy_result
when 0 when 0
ygopro.stoc_send_chat(client, "${vip_key_not_found}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${vip_key_not_found}", ygopro.constants.COLORS.RED)
when 1 when 1
ygopro.stoc_send_chat(client, "${vip_success_new_part1}" + client.name + "$" + client.vpass + "${vip_success_new_part2}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_success_new_part1}" + client.name_vpass + "${vip_success_new_part2}", ygopro.constants.COLORS.BABYBLUE)
when 2 when 2
ygopro.stoc_send_chat(client, "${vip_success_renew}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_success_renew}", ygopro.constants.COLORS.BABYBLUE)
when 'dialogues' when 'dialogues'
if !client.vip if !await CLIENT_check_vip(client)
CLIENT_send_vip_status(client) CLIENT_send_vip_status(client)
else else
code = cmd[2] code = cmd[2]
...@@ -3405,12 +3369,10 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3405,12 +3369,10 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
if !code or !parseInt(code) if !code or !parseInt(code)
ygopro.stoc_send_chat(client, "${vip_invalid_card_code}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${vip_invalid_card_code}", ygopro.constants.COLORS.RED)
else if !word else if !word
delete vip_info.players[client.name].dialogues[parseInt(code)] await dataManager.removeUserDialogues(CLIENT_get_authorize_key(client), parseInt(code))
setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_cleared_dialogues_part1}" + code + "${vip_cleared_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_cleared_dialogues_part1}" + code + "${vip_cleared_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE)
else else
vip_info.players[client.name].dialogues[parseInt(code)] = word await dataManager.setUserDialogues(CLIENT_get_authorize_key(client), parseInt(code), word)
setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_set_dialogues_part1}" + code + "${vip_set_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_set_dialogues_part1}" + code + "${vip_set_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE)
when 'words' when 'words'
if !client.vip if !client.vip
...@@ -3418,12 +3380,10 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3418,12 +3380,10 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
else else
word = concat_name(cmd, 2) word = concat_name(cmd, 2)
if !word if !word
delete vip_info.players[client.name].words await dataManager.setUserWords(CLIENT_get_authorize_key(client), null)
setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_cleared_words}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_cleared_words}", ygopro.constants.COLORS.BABYBLUE)
else else
vip_info.players[client.name].words = word await dataManager.setUserWords(CLIENT_get_authorize_key(client), word)
setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_set_words}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_set_words}", ygopro.constants.COLORS.BABYBLUE)
when 'victory' when 'victory'
if !client.vip if !client.vip
...@@ -3431,23 +3391,21 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3431,23 +3391,21 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
else else
word = concat_name(cmd, 2) word = concat_name(cmd, 2)
if !word if !word
delete vip_info.players[client.name].victory await dataManager.setUserVictoryWords(CLIENT_get_authorize_key(client), null)
setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_cleared_victory}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_cleared_victory}", ygopro.constants.COLORS.BABYBLUE)
else else
vip_info.players[client.name].victory = word await dataManager.setUserVictoryWords(CLIENT_get_authorize_key(client), word)
setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_set_victory}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${vip_set_victory}", ygopro.constants.COLORS.BABYBLUE)
when 'password' #when 'password'
if !client.vip # if !client.vip
CLIENT_send_vip_status(client) # CLIENT_send_vip_status(client)
else # else
word = cmd[2] # word = cmd[2]
if word and (client.name.length + word.length) <= 18 # if word and (client.name.length + word.length) <= 18
vip_info.players[client.name].password = word # vip_info.players[client.name].password = word
client.vpass = word # client.vpass = word
setting_save(vip_info) # setting_save(vip_info)
ygopro.stoc_send_chat(client, "${vip_password_changed}", ygopro.constants.COLORS.BABYBLUE) # ygopro.stoc_send_chat(client, "${vip_password_changed}", ygopro.constants.#COLORS.BABYBLUE)
else else
CLIENT_send_vip_status(client) CLIENT_send_vip_status(client)
...@@ -3985,15 +3943,9 @@ if true ...@@ -3985,15 +3943,9 @@ if true
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "Unauthorized.")) response.end(addCallback(u.query.callback, "Unauthorized."))
return return
else if !u.query.keytype or !vip_info.cdkeys[u.query.keytype]
response.writeHead(200)
response.end(addCallback(u.query.callback, "Key type not found."))
return
else else
ret_keys = JSON.stringify(await dataMager.getVipKeys(parseInt(u.query.keytype)), null, 2)
response.writeHead(200) response.writeHead(200)
ret_keys = ""
for key in vip_info.cdkeys[u.query.keytype]
ret_keys = ret_keys + u.query.keytype + "D" + settings.port + ":" + key + "\n"
response.end(addCallback(u.query.callback, ret_keys)) response.end(addCallback(u.query.callback, ret_keys))
else if u.pathname == '/api/archive.zip' and settings.modules.mysql.enabled else if u.pathname == '/api/archive.zip' and settings.modules.mysql.enabled
......
// Generated by CoffeeScript 2.5.1 // Generated by CoffeeScript 2.5.1
(function() { (function() {
// 标准库 // 标准库
var CLIENT_check_vip, 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_vip_status, CLIENT_use_cdkey, 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_players_scores, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, concat_name, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, netRequestHandler, os, path, qs, real_windbot_server_ip, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib; var CLIENT_check_vip, CLIENT_get_absolute_pos, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_get_partner, CLIENT_get_save_data, 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_vip_status, CLIENT_use_cdkey, 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_players_scores, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, concat_name, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, netRequestHandler, os, path, qs, real_windbot_server_ip, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -133,102 +133,45 @@ ...@@ -133,102 +133,45 @@
await setting_save(settings); await setting_save(settings);
}; };
VIP_generate_cdkeys = global.VIP_generate_cdkeys = function(key_type, count) { VIP_generate_cdkeys = global.VIP_generate_cdkeys = async function(key_type, count) {
var i, j, key, ref; if (!settings.modules.vip.enabled) {
if (!(settings.modules.vip.enabled && vip_info.cdkeys[key_type])) {
return false; return false;
} }
for (i = j = 0, ref = count; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) { return (await dataManager.generateVipKeys(key_type, count));
key = Math.floor(Math.random() * 10000000000000000).toString();
vip_info.cdkeys[key_type].push(key);
}
setting_save(vip_info);
log.info("keys generated", key_type, count, vip_info.cdkeys[key_type].length);
return true;
}; };
CLIENT_use_cdkey = global.CLIENT_use_cdkey = function(client, pkey) { CLIENT_use_cdkey = global.CLIENT_use_cdkey = async function(client, pkey) {
var current_date, found_type, index, j, key, keys, len, new_vip, ref, type; var key;
if (!(settings.modules.vip.enabled && pkey)) { key = CLIENT_get_authorize_key(client);
return 0; return (await dataManager.useVipKey(key, pkey));
}
found_type = null;
ref = vip_info.cdkeys;
for (type in ref) {
keys = ref[type];
// support web given format
for (j = 0, len = keys.length; j < len; j++) {
key = keys[j];
if (!(pkey === key || pkey === (type + "D" + settings.port + ":" + key))) {
continue;
}
found_type = parseInt(type);
index = _.indexOf(keys, key);
if (index !== -1) {
keys.splice(index, 1);
}
break;
}
if (found_type) {
break;
}
}
if (!found_type) {
return 0;
}
if (!vip_info.cdkeys[found_type].length) {
VIP_generate_cdkeys(found_type, settings.modules.vip.generate_count);
}
client.vip = true;
new_vip = false;
if (vip_info.players[client.name]) {
current_date = moment();
if (current_date.isSameOrBefore(vip_info.players[client.name].expire_date)) {
current_date = moment(vip_info.players[client.name].expire_date, 'YYYY-MM-DD HH:mm:ss');
}
vip_info.players[client.name].expire_date = current_date.add(found_type, 'd').format('YYYY-MM-DD HH:mm:ss');
} else {
if (!client.vpass) {
client.vpass = Math.floor(Math.random() * 100000).toString();
}
vip_info.players[client.name] = {
password: client.vpass,
expire_date: moment().add(found_type, 'd').format('YYYY-MM-DD HH:mm:ss'),
dialogues: {}
};
new_vip = true;
}
setting_save(vip_info);
return (new_vip ? 1 : 2);
}; };
CLIENT_check_vip = global.CLIENT_check_vip = function(client) { CLIENT_get_save_data = global.CLIENT_get_save_data = async function(client) {
if (!settings.modules.vip.enabled) { return (await dataManager.getUser(CLIENT_get_authorize_key(client)));
return false;
}
if (!vip_info.players[client.name]) {
return false;
}
if (vip_info.players[client.name].password !== client.vpass) {
return false;
}
return moment().isSameOrBefore(vip_info.players[client.name].expire_date);
}; };
CLIENT_send_vip_status = global.CLIENT_send_vip_status = function(client, display) { CLIENT_check_vip = global.CLIENT_check_vip = async function(client) {
var key;
key = CLIENT_get_authorize_key(client);
return (await dataManager.isUserVip(key));
};
CLIENT_send_vip_status = global.CLIENT_send_vip_status = async function(client, display) {
var userData;
if (!settings.modules.vip.enabled) { if (!settings.modules.vip.enabled) {
return false; return false;
} }
if (client.vip) { userData = (await CLIENT_get_save_data(client));
if (userData.isVip()) {
if (display) { if (display) {
return ygopro.stoc_send_chat(client, "${vip_remain_part1}" + vip_info.players[client.name].expire_date + "${vip_remain_part2}", ygopro.constants.COLORS.BABYBLUE); return ygopro.stoc_send_chat(client, "${vip_remain_part1}" + moment(userData.vipExpireDate).format("YYYY-MM-DD HH:mm:ss") + "${vip_remain_part2}", ygopro.constants.COLORS.BABYBLUE);
} else { } else {
return ygopro.stoc_send_chat(client, "${vip_remain}", ygopro.constants.COLORS.BABYBLUE); return ygopro.stoc_send_chat(client, "${vip_remain}", ygopro.constants.COLORS.BABYBLUE);
} }
} else if (!vip_info.players[client.name] || vip_info.players[client.name].password !== client.vpass) { } else if (!userData.vipExpireDate) {
return ygopro.stoc_send_chat(client, "${vip_not_bought}", ygopro.constants.COLORS.RED); return ygopro.stoc_send_chat(client, "${vip_not_bought}", ygopro.constants.COLORS.RED);
} else { } else {
return ygopro.stoc_send_chat(client, "${vip_expired_part1}" + vip_info.players[client.name].expire_date + "${vip_expired_part2}", ygopro.constants.COLORS.RED); return ygopro.stoc_send_chat(client, "${vip_expired_part1}" + moment(userData.vipExpireDate).format("YYYY-MM-DD HH:mm:ss") + "${vip_expired_part2}", ygopro.constants.COLORS.RED);
} }
}; };
...@@ -318,8 +261,6 @@ ...@@ -318,8 +261,6 @@
words = null; words = null;
vip_info = null;
dialogues = null; dialogues = null;
badwords = null; badwords = null;
...@@ -413,7 +354,7 @@ ...@@ -413,7 +354,7 @@
}; };
init = async function() { init = async function() {
var AthleticChecker, DataManager, challonge_module_name, challonge_type, chat_color, config, cppversion, defaultConfig, default_data, dns, e, http_server, https, https_server, imported, j, k, l, len, len1, len2, m, mkdirList, options, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, postData, ref, ref1, v; var AthleticChecker, DataManager, challonge_module_name, challonge_type, chat_color, config, cppversion, defaultConfig, default_data, dns, e, http_server, https, https_server, imported, j, l, len, len1, len2, m, mkdirList, options, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, postData, ref, vip_info;
await createDirectoryIfNotExists("./config"); await createDirectoryIfNotExists("./config");
await importOldConfig(); await importOldConfig();
defaultConfig = (await loadJSONAsync('./data/default_config.json')); defaultConfig = (await loadJSONAsync('./data/default_config.json'));
...@@ -539,6 +480,11 @@ ...@@ -539,6 +480,11 @@
await setting_save(settings); await setting_save(settings);
log.warn("Chat color cannot be enabled because no MySQL."); log.warn("Chat color cannot be enabled because no MySQL.");
} }
if (settings.modules.vip.enabled) {
settings.modules.vip.enabled = false;
await setting_save(settings);
log.warn("VIP mode cannot be enabled because no MySQL.");
}
} }
// 读取数据 // 读取数据
default_data = (await loadJSONAsync('./data/default_data.json')); default_data = (await loadJSONAsync('./data/default_data.json'));
...@@ -560,11 +506,17 @@ ...@@ -560,11 +506,17 @@
words = global.words = default_data.words; words = global.words = default_data.words;
await setting_save(words); await setting_save(words);
} }
try { if (settings.modules.vip.enabled && (await checkFileExists('./config/vip_info.json'))) {
vip_info = global.vip_info = (await loadJSONAsync('./config/vip_info.json')); try {
} catch (error1) { vip_info = (await loadJSONAsync('./config/vip_info.json'));
vip_info = global.vip_info = default_data.vip_info; if (vip_info) {
await setting_save(vip_info); await dataManager.migrateFromOldVipInfo(vip_info);
await fs.promises.rename('./config/vip_info.json', './config/vip_info.json.bak');
log.info("VIP info migrated.");
}
} catch (error1) {
}
} }
try { try {
badwords = global.badwords = (await loadJSONAsync('./config/badwords.json')); badwords = global.badwords = (await loadJSONAsync('./config/badwords.json'));
...@@ -888,15 +840,6 @@ ...@@ -888,15 +840,6 @@
} }
return results; return results;
}, 1000); }, 1000);
if (settings.modules.vip.enabled) {
ref1 = vip_info.cdkeys;
for (k in ref1) {
v = ref1[k];
if (v.length === 0) {
VIP_generate_cdkeys(k, settings.modules.vip.generate_count);
}
}
}
net.createServer(netRequestHandler).listen(settings.port, function() { net.createServer(netRequestHandler).listen(settings.port, function() {
log.info("server started", settings.port); log.info("server started", settings.port);
}); });
...@@ -1312,8 +1255,6 @@ ...@@ -1312,8 +1255,6 @@
return client.name_vpass; return client.name_vpass;
} else if (settings.modules.mycard.enabled || settings.modules.tournament_mode.enabled || settings.modules.challonge.enabled || client.is_local) { } else if (settings.modules.mycard.enabled || settings.modules.tournament_mode.enabled || settings.modules.challonge.enabled || client.is_local) {
return client.name; return client.name;
} else if (client.vip) {
return client.name + "$" + client.vpass;
} else { } else {
return client.ip + ":" + client.name; return client.ip + ":" + client.name;
} }
...@@ -2524,6 +2465,17 @@ ...@@ -2524,6 +2465,17 @@
})); }));
} }
playLines(lines) {
var j, len, line, ref, results;
ref = _.lines(lines);
results = [];
for (j = 0, len = ref.length; j < len; j++) {
line = ref[j];
results.push(ygopro.stoc_send_chat_to_room(this, line, ygopro.constants.COLORS.PINK));
}
return results;
}
}; };
// 网络连接 // 网络连接
...@@ -2816,7 +2768,7 @@ ...@@ -2816,7 +2768,7 @@
client.vpass = vpass; client.vpass = vpass;
client.name_vpass = vpass ? name + "$" + vpass : name; client.name_vpass = vpass ? name + "$" + vpass : name;
//console.log client.name, client.vpass //console.log client.name, client.vpass
if (settings.modules.vip.enabled && CLIENT_check_vip(client)) { if (settings.modules.vip.enabled && (await CLIENT_check_vip(client))) {
client.vip = true; client.vip = true;
} }
if (!settings.modules.i18n.auto_pick || client.is_local) { if (!settings.modules.i18n.auto_pick || client.is_local) {
...@@ -2839,7 +2791,7 @@ ...@@ -2839,7 +2791,7 @@
}); });
ygopro.ctos_follow('JOIN_GAME', true, async function(buffer, info, client, server, datas) { ygopro.ctos_follow('JOIN_GAME', true, async function(buffer, info, client, server, datas) {
var available_logs, check_buffer_indentity, create_room_with_action, duelLog, exactBan, index, j, l, len, len1, len2, len3, len4, len5, line, m, n, name, o, p, pre_room, recover_match, ref, ref1, ref2, ref3, replay, replay_id, replays, room, struct; var available_logs, check_buffer_indentity, create_room_with_action, duelLog, exactBan, index, j, l, len, len1, len2, len3, m, n, name, pre_room, recover_match, ref, ref1, replay, replay_id, replays, room, struct;
//log.info info //log.info info
info.pass = info.pass.trim(); info.pass = info.pass.trim();
client.pass = info.pass; client.pass = info.pass;
...@@ -2917,7 +2869,7 @@ ...@@ -2917,7 +2869,7 @@
return (checksum & 0xFF) === 0; return (checksum & 0xFF) === 0;
}; };
create_room_with_action = async function(buffer, decrypted_buffer, match_permit) { create_room_with_action = async function(buffer, decrypted_buffer, match_permit) {
var action, len2, len3, len4, len5, line, m, n, name, o, opt1, opt2, opt3, options, p, player, ref, ref1, ref2, ref3, room, room_title, title; var action, len2, len3, m, n, name, opt1, opt2, opt3, options, player, ref, ref1, room, room_title, title;
if (client.closed) { if (client.closed) {
return; return;
} }
...@@ -3044,25 +2996,20 @@ ...@@ -3044,25 +2996,20 @@
client.setTimeout(300000); //连接后超时5分钟 client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && (await CLIENT_check_vip(client))) {
ref1 = _.lines(vip_info.players[client.name].words); words = (await dataManager.getUserWords(CLIENT_get_authorize_key(client)));
for (n = 0, len3 = ref1.length; n < len3; n++) { if (words) {
line = ref1[n]; room.playLines(words);
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} else if (settings.modules.words.enabled && words.words[client.name]) { } else if (settings.modules.words.enabled && words.words[client.name]) {
ref2 = _.lines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]); room.playLines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]);
for (o = 0, len4 = ref2.length; o < len4; o++) {
line = ref2[o];
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
}
} }
ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref3 = room.watcher_buffers; ref1 = room.watcher_buffers;
for (p = 0, len5 = ref3.length; p < len5; p++) { for (n = 0, len3 = ref1.length; n < len3; n++) {
buffer = ref3[p]; buffer = ref1[n];
client.write(buffer); client.write(buffer);
} }
} else { } else {
...@@ -3220,7 +3167,7 @@ ...@@ -3220,7 +3167,7 @@
}); });
} }
}, async function(err, datas) { }, async function(err, datas) {
var create_room_name, found, k, len3, len4, len5, len6, line, match, n, o, p, player, q, ref1, ref2, ref3, ref4, ref5, ref6, user; var create_room_name, found, k, len3, len4, match, n, o, player, ref1, ref2, ref3, ref4, user;
if (client.closed) { if (client.closed) {
return; return;
} }
...@@ -3278,25 +3225,20 @@ ...@@ -3278,25 +3225,20 @@
//client.setTimeout(300000) #连接后超时5分钟 //client.setTimeout(300000) #连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && (await CLIENT_check_vip(client))) {
ref3 = _.lines(vip_info.players[client.name].words); words = (await dataManager.getUserWords(CLIENT_get_authorize_key(client)));
for (n = 0, len3 = ref3.length; n < len3; n++) { if (words) {
line = ref3[n]; room.playLines(words);
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} else if (settings.modules.words.enabled && words.words[client.name]) { } else if (settings.modules.words.enabled && words.words[client.name]) {
ref4 = _.lines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]); room.playLines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]);
for (o = 0, len4 = ref4.length; o < len4; o++) {
line = ref4[o];
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
}
} }
ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref5 = room.watcher_buffers; ref3 = room.watcher_buffers;
for (p = 0, len5 = ref5.length; p < len5; p++) { for (n = 0, len3 = ref3.length; n < len3; n++) {
buffer = ref5[p]; buffer = ref3[n];
client.write(buffer); client.write(buffer);
} }
} else { } else {
...@@ -3305,9 +3247,9 @@ ...@@ -3305,9 +3247,9 @@
} else if (room.hostinfo.no_watch && room.players.length >= (room.hostinfo.mode === 2 ? 4 : 2)) { } else if (room.hostinfo.no_watch && room.players.length >= (room.hostinfo.mode === 2 ? 4 : 2)) {
ygopro.stoc_die(client, "${watch_denied_room}"); ygopro.stoc_die(client, "${watch_denied_room}");
} else { } else {
ref6 = room.get_playing_player(); ref4 = room.get_playing_player();
for (q = 0, len6 = ref6.length; q < len6; q++) { for (o = 0, len4 = ref4.length; o < len4; o++) {
player = ref6[q]; player = ref4[o];
if (!(player && player !== client && player.challonge_info.id === client.challonge_info.id)) { if (!(player && player !== client && player.challonge_info.id === client.challonge_info.id)) {
continue; continue;
} }
...@@ -3379,25 +3321,20 @@ ...@@ -3379,25 +3321,20 @@
client.setTimeout(300000); //连接后超时5分钟 client.setTimeout(300000); //连接后超时5分钟
client.rid = _.indexOf(ROOM_all, room); client.rid = _.indexOf(ROOM_all, room);
client.is_post_watcher = true; client.is_post_watcher = true;
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && (await CLIENT_check_vip(client))) {
ref1 = _.lines(vip_info.players[client.name].words); words = (await dataManager.getUserWords(CLIENT_get_authorize_key(client)));
for (n = 0, len3 = ref1.length; n < len3; n++) { if (words) {
line = ref1[n]; room.playLines(words);
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} else if (settings.modules.words.enabled && words.words[client.name]) { } else if (settings.modules.words.enabled && words.words[client.name]) {
ref2 = _.lines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]); room.playLines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]);
for (o = 0, len4 = ref2.length; o < len4; o++) {
line = ref2[o];
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
}
} }
ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`); ygopro.stoc_send_chat_to_room(room, `${client.name} \${watch_join}`);
room.watchers.push(client); room.watchers.push(client);
ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${watch_watching}", ygopro.constants.COLORS.BABYBLUE);
ref3 = room.watcher_buffers; ref1 = room.watcher_buffers;
for (p = 0, len5 = ref3.length; p < len5; p++) { for (n = 0, len3 = ref1.length; n < len3; n++) {
buffer = ref3[p]; buffer = ref1[n];
client.write(buffer); client.write(buffer);
} }
} else { } else {
...@@ -3414,7 +3351,7 @@ ...@@ -3414,7 +3351,7 @@
}); });
ygopro.stoc_follow('JOIN_GAME', false, async function(buffer, info, client, server, datas) { ygopro.stoc_follow('JOIN_GAME', false, async function(buffer, info, client, server, datas) {
var j, l, len, len1, len2, line, m, player, recorder, ref, ref1, ref2, room, watcher; var j, len, player, recorder, ref, room, watcher;
//欢迎信息 //欢迎信息
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
...@@ -3423,18 +3360,13 @@ ...@@ -3423,18 +3360,13 @@
if (!room.join_game_buffer) { if (!room.join_game_buffer) {
room.join_game_buffer = buffer; room.join_game_buffer = buffer;
} }
if (settings.modules.vip.enabled && client.vip && vip_info.players[client.name].words) { if (settings.modules.vip.enabled && (await CLIENT_check_vip(client))) {
ref = _.lines(vip_info.players[client.name].words); words = (await dataManager.getUserWords(CLIENT_get_authorize_key(client)));
for (j = 0, len = ref.length; j < len; j++) { if (words) {
line = ref[j]; room.playLines(words);
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} else if (settings.modules.words.enabled && words.words[client.name]) { } else if (settings.modules.words.enabled && words.words[client.name]) {
ref1 = _.lines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]); room.playLines(words.words[client.name][Math.floor(Math.random() * words.words[client.name].length)]);
for (l = 0, len1 = ref1.length; l < len1; l++) {
line = ref1[l];
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
}
} }
if (settings.modules.welcome) { if (settings.modules.welcome) {
ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN); ygopro.stoc_send_chat(client, settings.modules.welcome, ygopro.constants.COLORS.GREEN);
...@@ -3465,9 +3397,9 @@ ...@@ -3465,9 +3397,9 @@
//client.score_shown = true //client.score_shown = true
if (settings.modules.random_duel.record_match_scores && room.random_type === 'M') { if (settings.modules.random_duel.record_match_scores && room.random_type === 'M') {
ygopro.stoc_send_chat_to_room(room, ROOM_player_get_score(client), ygopro.constants.COLORS.GREEN); ygopro.stoc_send_chat_to_room(room, ROOM_player_get_score(client), ygopro.constants.COLORS.GREEN);
ref2 = room.players; ref = room.players;
for (m = 0, len2 = ref2.length; m < len2; m++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref2[m]; player = ref[j];
if (player.pos !== 7 && player !== client) { if (player.pos !== 7 && player !== client) {
ygopro.stoc_send_chat(client, ROOM_player_get_score(player), ygopro.constants.COLORS.GREEN); ygopro.stoc_send_chat(client, ROOM_player_get_score(player), ygopro.constants.COLORS.GREEN);
} }
...@@ -3505,15 +3437,15 @@ ...@@ -3505,15 +3437,15 @@
ygopro.ctos_send(watcher, 'HS_TOOBSERVER'); ygopro.ctos_send(watcher, 'HS_TOOBSERVER');
}); });
watcher.on('data', function(data) { watcher.on('data', function(data) {
var len3, n, ref3, w; var l, len1, ref1, w;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
return; return;
} }
room.watcher_buffers.push(data); room.watcher_buffers.push(data);
ref3 = room.watchers; ref1 = room.watchers;
for (n = 0, len3 = ref3.length; n < len3; n++) { for (l = 0, len1 = ref1.length; l < len1; l++) {
w = ref3[n]; w = ref1[l];
if (w) { //a WTF fix if (w) { //a WTF fix
w.write(data); w.write(data);
} }
...@@ -3539,7 +3471,7 @@ ...@@ -3539,7 +3471,7 @@
}; };
ygopro.stoc_follow('GAME_MSG', true, async function(buffer, info, client, server, datas) { ygopro.stoc_follow('GAME_MSG', true, async function(buffer, info, client, server, datas) {
var act_pos, card, chain, check, count, cpos, deck_found, found, hint_type, i, id, j, l, len, len1, len2, len3, len4, len5, len6, len7, len8, limbo_found, line, loc, m, max_loop, msg, n, o, oppo_pos, p, phase, player, playertype, pos, ppos, q, r, r_player, reason, ref, ref1, ref10, ref2, ref3, ref4, ref5, ref6, ref7, ref8, ref9, room, s, t, trigger_location, val, win_pos; var act_pos, card, chain, check, count, cpos, deck_found, found, hint_type, i, id, j, l, len, len1, len2, len3, limbo_found, loc, m, max_loop, msg, n, o, oppo_pos, phase, player, playertype, pos, ppos, r_player, reason, ref, ref1, ref2, ref3, ref4, room, trigger_location, val, victoryWordPlayerList, win_pos;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
return; return;
...@@ -3715,17 +3647,19 @@ ...@@ -3715,17 +3647,19 @@
room.match_kill = false; room.match_kill = false;
room.scores[room.winner_name] = 99; room.scores[room.winner_name] = 99;
} }
if (settings.modules.vip.enabled && room.dueling_players[pos].vip && vip_info.players[room.dueling_players[pos].name].victory) { if (settings.modules.vip.enabled) {
ref1 = _.lines(vip_info.players[room.dueling_players[pos].name].victory); victoryWordPlayerList = [room.dueling_players[pos]];
for (l = 0, len1 = ref1.length; l < len1; l++) { if (room.hostinfo.mode === 2) {
line = ref1[l]; victoryWordPlayerList.push(room.dueling_players[pos + 1]);
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK);
} }
} else if (room.hostinfo.mode === 2 && settings.modules.vip.enabled && room.dueling_players[pos + 1].vip && vip_info.players[room.dueling_players[pos + 1].name].victory) { for (l = 0, len1 = victoryWordPlayerList.length; l < len1; l++) {
ref2 = _.lines(vip_info.players[room.dueling_players[pos + 1].name].victory); player = victoryWordPlayerList[l];
for (m = 0, len2 = ref2.length; m < len2; m++) { if (!((await CLIENT_check_vip(player)) && (await dataManager.getUserVictoryWords(CLIENT_get_authorize_key(player))))) {
line = ref2[m]; continue;
ygopro.stoc_send_chat_to_room(room, line, ygopro.constants.COLORS.PINK); }
words = (await dataManager.getUserVictoryWords(CLIENT_get_authorize_key(player)));
room.playLines(words);
break;
} }
} }
} }
...@@ -3754,7 +3688,7 @@ ...@@ -3754,7 +3688,7 @@
if (room.dueling_players[pos].lp < 0) { if (room.dueling_players[pos].lp < 0) {
room.dueling_players[pos].lp = 0; room.dueling_players[pos].lp = 0;
} }
if ((0 < (ref3 = room.dueling_players[pos].lp) && ref3 <= 100)) { if ((0 < (ref1 = room.dueling_players[pos].lp) && ref1 <= 100)) {
ygopro.stoc_send_chat_to_room(room, "${lp_low_opponent}", ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, "${lp_low_opponent}", ygopro.constants.COLORS.PINK);
} }
} }
...@@ -3793,7 +3727,7 @@ ...@@ -3793,7 +3727,7 @@
if (room.dueling_players[pos].lp < 0) { if (room.dueling_players[pos].lp < 0) {
room.dueling_players[pos].lp = 0; room.dueling_players[pos].lp = 0;
} }
if ((0 < (ref4 = room.dueling_players[pos].lp) && ref4 <= 100)) { if ((0 < (ref2 = room.dueling_players[pos].lp) && ref2 <= 100)) {
ygopro.stoc_send_chat_to_room(room, "${lp_low_self}", ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat_to_room(room, "${lp_low_self}", ygopro.constants.COLORS.PINK);
} }
} }
...@@ -3834,7 +3768,7 @@ ...@@ -3834,7 +3768,7 @@
max_loop = 3 + (count - 1) * 7; max_loop = 3 + (count - 1) * 7;
deck_found = 0; deck_found = 0;
limbo_found = 0; // support custom cards which may be in location 0 in KoishiPro or EdoPro limbo_found = 0; // support custom cards which may be in location 0 in KoishiPro or EdoPro
for (i = n = 3, ref5 = max_loop; n <= ref5; i = n += 7) { for (i = m = 3, ref3 = max_loop; m <= ref3; i = m += 7) {
loc = buffer.readInt8(i + 5); loc = buffer.readInt8(i + 5);
if ((loc & 0x41) > 0) { if ((loc & 0x41) > 0) {
deck_found++; deck_found++;
...@@ -3856,8 +3790,8 @@ ...@@ -3856,8 +3790,8 @@
if (ygopro.constants.MSG[msg] === 'CHAINING') { if (ygopro.constants.MSG[msg] === 'CHAINING') {
card = buffer.readUInt32LE(1); card = buffer.readUInt32LE(1);
found = false; found = false;
for (o = 0, len3 = long_resolve_cards.length; o < len3; o++) { for (n = 0, len2 = long_resolve_cards.length; n < len2; n++) {
id = long_resolve_cards[o]; id = long_resolve_cards[n];
if (!(id === card)) { if (!(id === card)) {
continue; continue;
} }
...@@ -3882,9 +3816,9 @@ ...@@ -3882,9 +3816,9 @@
chain = buffer.readInt8(1); chain = buffer.readInt8(1);
// console.log(2,chain) // console.log(2,chain)
if (room.long_resolve_chain[chain]) { if (room.long_resolve_chain[chain]) {
ref6 = room.get_playing_player(); ref4 = room.get_playing_player();
for (p = 0, len4 = ref6.length; p < len4; p++) { for (o = 0, len3 = ref4.length; o < len3; o++) {
player = ref6[p]; player = ref4[o];
player.heartbeat_protected = true; player.heartbeat_protected = true;
} }
} }
...@@ -3911,30 +3845,14 @@ ...@@ -3911,30 +3845,14 @@
act_pos = act_pos * 2; act_pos = act_pos * 2;
} }
if (ygopro.constants.MSG[msg] !== 'CHAINING' || (trigger_location & 0x8) && client.ready_trap) { if (ygopro.constants.MSG[msg] !== 'CHAINING' || (trigger_location & 0x8) && client.ready_trap) {
if (settings.modules.vip.enabled && room.dueling_players[act_pos].vip && vip_info.players[room.dueling_players[act_pos].name].dialogues[card]) { if (settings.modules.vip.enabled && (await CLIENT_check_vip(room.dueling_players[act_pos])) && (await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos]), card))) {
ref7 = _.lines(vip_info.players[room.dueling_players[act_pos].name].dialogues[card]); room.playLines((await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos]), card)));
for (q = 0, len5 = ref7.length; q < len5; q++) { } else if (settings.modules.vip.enabled && room.hostinfo.mode === 2 && (await CLIENT_check_vip(room.dueling_players[act_pos + 1])) && (await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos + 1]), card))) {
line = ref7[q]; room.playLines((await dataManager.getUserDialogueText(CLIENT_get_authorize_key(room.dueling_players[act_pos + 1]), card)));
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK);
}
} else if (settings.modules.vip.enabled && room.hostinfo.mode === 2 && room.dueling_players[act_pos + 1].vip && vip_info.players[room.dueling_players[act_pos + 1].name].dialogues[card]) {
ref8 = _.lines(vip_info.players[room.dueling_players[act_pos + 1].name].dialogues[card]);
for (r = 0, len6 = ref8.length; r < len6; r++) {
line = ref8[r];
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK);
}
} else if (settings.modules.dialogues.enabled && dialogues.dialogues[card]) { } else if (settings.modules.dialogues.enabled && dialogues.dialogues[card]) {
ref9 = _.lines(dialogues.dialogues[card][Math.floor(Math.random() * dialogues.dialogues[card].length)]); room.playLines(dialogues.dialogues[card][Math.floor(Math.random() * dialogues.dialogues[card].length)]);
for (s = 0, len7 = ref9.length; s < len7; s++) {
line = ref9[s];
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK);
}
} else if (settings.modules.dialogues.enabled && dialogues.dialogues_custom[card]) { } else if (settings.modules.dialogues.enabled && dialogues.dialogues_custom[card]) {
ref10 = _.lines(dialogues.dialogues_custom[card][Math.floor(Math.random() * dialogues.dialogues_custom[card].length)]); room.playLines(dialogues.dialogues_custom[card][Math.floor(Math.random() * dialogues.dialogues_custom[card].length)]);
for (t = 0, len8 = ref10.length; t < len8; t++) {
line = ref10[t];
ygopro.stoc_send_chat(client, line, ygopro.constants.COLORS.PINK);
}
} }
} }
} }
...@@ -4586,19 +4504,17 @@ ...@@ -4586,19 +4504,17 @@
CLIENT_send_vip_status(client, true); CLIENT_send_vip_status(client, true);
break; break;
case 'buy': case 'buy':
if (vip_info.players[client.name] && vip_info.players[client.name].password !== client.vpass) { if (!client.vpass) {
ygopro.stoc_send_chat(client, "${vip_account_existed}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${vip_no_pass}", ygopro.constants.COLORS.BABYBLUE);
} else if ((!client.vpass && client.name.length > 13) || (client.vpass && (client.name.length + client.vpass.length) > 18)) {
ygopro.stoc_send_chat(client, "${vip_player_name_too_long}", ygopro.constants.COLORS.RED);
} else { } else {
key = cmd[2]; key = cmd[2];
buy_result = CLIENT_use_cdkey(client, key); buy_result = (await CLIENT_use_cdkey(client, key));
switch (buy_result) { switch (buy_result) {
case 0: case 0:
ygopro.stoc_send_chat(client, "${vip_key_not_found}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${vip_key_not_found}", ygopro.constants.COLORS.RED);
break; break;
case 1: case 1:
ygopro.stoc_send_chat(client, "${vip_success_new_part1}" + client.name + "$" + client.vpass + "${vip_success_new_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_success_new_part1}" + client.name_vpass + "${vip_success_new_part2}", ygopro.constants.COLORS.BABYBLUE);
break; break;
case 2: case 2:
ygopro.stoc_send_chat(client, "${vip_success_renew}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_success_renew}", ygopro.constants.COLORS.BABYBLUE);
...@@ -4606,7 +4522,7 @@ ...@@ -4606,7 +4522,7 @@
} }
break; break;
case 'dialogues': case 'dialogues':
if (!client.vip) { if (!(await CLIENT_check_vip(client))) {
CLIENT_send_vip_status(client); CLIENT_send_vip_status(client);
} else { } else {
code = cmd[2]; code = cmd[2];
...@@ -4614,12 +4530,10 @@ ...@@ -4614,12 +4530,10 @@
if (!code || !parseInt(code)) { if (!code || !parseInt(code)) {
ygopro.stoc_send_chat(client, "${vip_invalid_card_code}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${vip_invalid_card_code}", ygopro.constants.COLORS.RED);
} else if (!word) { } else if (!word) {
delete vip_info.players[client.name].dialogues[parseInt(code)]; await dataManager.removeUserDialogues(CLIENT_get_authorize_key(client), parseInt(code));
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_cleared_dialogues_part1}" + code + "${vip_cleared_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_cleared_dialogues_part1}" + code + "${vip_cleared_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE);
} else { } else {
vip_info.players[client.name].dialogues[parseInt(code)] = word; await dataManager.setUserDialogues(CLIENT_get_authorize_key(client), parseInt(code), word);
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_set_dialogues_part1}" + code + "${vip_set_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_set_dialogues_part1}" + code + "${vip_set_dialogues_part2}", ygopro.constants.COLORS.BABYBLUE);
} }
} }
...@@ -4630,12 +4544,10 @@ ...@@ -4630,12 +4544,10 @@
} else { } else {
word = concat_name(cmd, 2); word = concat_name(cmd, 2);
if (!word) { if (!word) {
delete vip_info.players[client.name].words; await dataManager.setUserWords(CLIENT_get_authorize_key(client), null);
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_cleared_words}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_cleared_words}", ygopro.constants.COLORS.BABYBLUE);
} else { } else {
vip_info.players[client.name].words = word; await dataManager.setUserWords(CLIENT_get_authorize_key(client), word);
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_set_words}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_set_words}", ygopro.constants.COLORS.BABYBLUE);
} }
} }
...@@ -4646,30 +4558,25 @@ ...@@ -4646,30 +4558,25 @@
} else { } else {
word = concat_name(cmd, 2); word = concat_name(cmd, 2);
if (!word) { if (!word) {
delete vip_info.players[client.name].victory; await dataManager.setUserVictoryWords(CLIENT_get_authorize_key(client), null);
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_cleared_victory}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_cleared_victory}", ygopro.constants.COLORS.BABYBLUE);
} else { } else {
vip_info.players[client.name].victory = word; await dataManager.setUserVictoryWords(CLIENT_get_authorize_key(client), word);
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_set_victory}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${vip_set_victory}", ygopro.constants.COLORS.BABYBLUE);
} }
} }
break;
case 'password':
if (!client.vip) {
CLIENT_send_vip_status(client);
} else {
word = cmd[2];
if (word && (client.name.length + word.length) <= 18) {
vip_info.players[client.name].password = word;
client.vpass = word;
setting_save(vip_info);
ygopro.stoc_send_chat(client, "${vip_password_changed}", ygopro.constants.COLORS.BABYBLUE);
}
}
} }
} else { } else {
//when 'password'
// if !client.vip
// CLIENT_send_vip_status(client)
// else
// word = cmd[2]
// if word and (client.name.length + word.length) <= 18
// vip_info.players[client.name].password = word
// client.vpass = word
// setting_save(vip_info)
// ygopro.stoc_send_chat(client, "${vip_password_changed}", ygopro.constants.#COLORS.BABYBLUE)
CLIENT_send_vip_status(client); CLIENT_send_vip_status(client);
} }
} }
...@@ -5322,7 +5229,7 @@ ...@@ -5322,7 +5229,7 @@
return callback + "( " + text + " );"; return callback + "( " + text + " );";
}; };
httpRequestListener = async function(request, response) { httpRequestListener = async function(request, response) {
var archive_args, archive_name, archive_process, buffer, check, death_room_found, duellog, e, err, error, filename, getpath, j, key, l, len, len1, parseQueryString, pass_validated, ref, ref1, ret_keys, roomsjson, success, u; var archive_args, archive_name, archive_process, buffer, check, death_room_found, duellog, e, err, error, filename, getpath, j, len, parseQueryString, pass_validated, ref, ret_keys, roomsjson, success, u;
parseQueryString = true; parseQueryString = true;
u = url.parse(request.url, parseQueryString); u = url.parse(request.url, parseQueryString);
//pass_validated = u.query.pass == settings.modules.http.password //pass_validated = u.query.pass == settings.modules.http.password
...@@ -5393,18 +5300,9 @@ ...@@ -5393,18 +5300,9 @@
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "Unauthorized.")); response.end(addCallback(u.query.callback, "Unauthorized."));
return; return;
} else if (!u.query.keytype || !vip_info.cdkeys[u.query.keytype]) {
response.writeHead(200);
response.end(addCallback(u.query.callback, "Key type not found."));
return;
} else { } else {
ret_keys = JSON.stringify((await dataMager.getVipKeys(parseInt(u.query.keytype))), null, 2);
response.writeHead(200); response.writeHead(200);
ret_keys = "";
ref = vip_info.cdkeys[u.query.keytype];
for (j = 0, len = ref.length; j < len; j++) {
key = ref[j];
ret_keys = ret_keys + u.query.keytype + "D" + settings.port + ":" + key + "\n";
}
response.end(addCallback(u.query.callback, ret_keys)); response.end(addCallback(u.query.callback, ret_keys));
} }
} else if (u.pathname === '/api/archive.zip' && settings.modules.mysql.enabled) { } else if (u.pathname === '/api/archive.zip' && settings.modules.mysql.enabled) {
...@@ -5417,9 +5315,9 @@ ...@@ -5417,9 +5315,9 @@
archive_name = moment().format('YYYY-MM-DD HH-mm-ss') + ".zip"; archive_name = moment().format('YYYY-MM-DD HH-mm-ss') + ".zip";
archive_args = ["a", "-mx0", "-y", archive_name]; archive_args = ["a", "-mx0", "-y", archive_name];
check = false; check = false;
ref1 = (await dataManager.getAllReplayFilenames()); ref = (await dataManager.getAllReplayFilenames());
for (l = 0, len1 = ref1.length; l < len1; l++) { for (j = 0, len = ref.length; j < len; j++) {
filename = ref1[l]; filename = ref[j];
check = true; check = true;
archive_args.push(filename); archive_args.push(filename);
} }
......
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