Commit 673dedd6 authored by nanahira's avatar nanahira

add conditional query

parent aa69147c
...@@ -230,6 +230,46 @@ class DataManager { ...@@ -230,6 +230,46 @@ class DataManager {
return []; return [];
} }
} }
async getDuelLogFromCondition(data) {
if (!data) {
return this.getAllDuelLogs();
}
const { roomName, duelCount, playerName, playerScore } = data;
const repo = this.db.getRepository(DuelLog_1.DuelLog);
try {
const queryBuilder = repo.createQueryBuilder("duelLog")
.where("1");
if (roomName != null && roomName.length) {
const escapedRoomName = roomName.replace(/[%_]/g, "") + "%";
queryBuilder.andWhere("duelLog.name like :escapedRoomName", { escapedRoomName });
}
if (duelCount != null && !isNaN(duelCount)) {
queryBuilder.andWhere("duelLog.duelCount = :duelCount", { duelCount });
}
if (playerName != null && playerName.length || playerScore != null && !isNaN(playerScore)) {
let innerQuery = "select id from duel_log_player where duel_log_player.duelLogId = duelLog.id";
const innerQueryParams = {};
if (playerName != null && playerName.length) {
const escapedPlayerName = playerName.replace(/[%_]/g, "") + "%";
innerQuery += " and duel_log_player.escapedPlayerName like :escapedPlayerName";
innerQueryParams.playerRealName = escapedPlayerName;
}
if (playerScore != null && !isNaN(playerScore)) {
innerQuery += " and duel_log_player.score = :playerScore";
innerQueryParams.playerScore = playerScore;
}
queryBuilder.andWhere(`exists (${innerQuery})`, innerQueryParams);
}
const duelLogs = queryBuilder.orderBy("duelLog.id", "DESC")
.leftJoinAndSelect("duelLog.players", "player")
.getMany();
return duelLogs;
}
catch (e) {
this.log.warn(`Failed to fetch duel logs: ${e.toString()}`);
return [];
}
}
async getDuelLogFromId(id) { async getDuelLogFromId(id) {
const repo = this.db.getRepository(DuelLog_1.DuelLog); const repo = this.db.getRepository(DuelLog_1.DuelLog);
try { try {
...@@ -261,10 +301,18 @@ class DataManager { ...@@ -261,10 +301,18 @@ class DataManager {
const allDuelLogs = await this.getAllDuelLogs(); const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings)); return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
} }
async getDuelLogJSONFromCondition(tournamentModeSettings, data) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
}
async getAllReplayFilenames() { async getAllReplayFilenames() {
const allDuelLogs = await this.getAllDuelLogs(); const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.replayFileName); return allDuelLogs.map(duelLog => duelLog.replayFileName);
} }
async getReplayFilenamesFromCondition(data) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.replayFileName);
}
async clearDuelLog() { async clearDuelLog() {
const runner = this.db.createQueryRunner(); const runner = this.db.createQueryRunner();
try { try {
......
...@@ -33,6 +33,8 @@ export interface DuelLogPlayerInfo extends BasePlayerInfo { ...@@ -33,6 +33,8 @@ export interface DuelLogPlayerInfo extends BasePlayerInfo {
cardCount: number; cardCount: number;
} }
export interface DuelLogQuery {roomName: string, duelCount: number, playerName: string, playerScore: number}
export class DataManager { export class DataManager {
config: ConnectionOptions; config: ConnectionOptions;
...@@ -254,6 +256,46 @@ export class DataManager { ...@@ -254,6 +256,46 @@ export class DataManager {
} }
async getDuelLogFromCondition(data: DuelLogQuery) {
if(!data) {
return this.getAllDuelLogs();
}
const {roomName, duelCount, playerName, playerScore} = data;
const repo = this.db.getRepository(DuelLog);
try {
const queryBuilder = repo.createQueryBuilder("duelLog")
.where("1");
if(roomName != null && roomName.length) {
const escapedRoomName = roomName.replace(/[%_]/g, "") + "%";
queryBuilder.andWhere("duelLog.name like :escapedRoomName", { escapedRoomName });
}
if(duelCount != null && !isNaN(duelCount)) {
queryBuilder.andWhere("duelLog.duelCount = :duelCount", { duelCount });
}
if(playerName != null && playerName.length || playerScore != null && !isNaN(playerScore)) {
let innerQuery = "select id from duel_log_player where duel_log_player.duelLogId = duelLog.id";
const innerQueryParams: any = {};
if(playerName != null && playerName.length) {
const escapedPlayerName = playerName.replace(/[%_]/g, "") + "%";
innerQuery += " and duel_log_player.escapedPlayerName like :escapedPlayerName";
innerQueryParams.playerRealName = escapedPlayerName;
}
if(playerScore != null && !isNaN(playerScore)) {
innerQuery += " and duel_log_player.score = :playerScore";
innerQueryParams.playerScore = playerScore;
}
queryBuilder.andWhere(`exists (${innerQuery})`, innerQueryParams);
}
const duelLogs = queryBuilder.orderBy("duelLog.id", "DESC")
.leftJoinAndSelect("duelLog.players", "player")
.getMany();
return duelLogs;
} catch (e) {
this.log.warn(`Failed to fetch duel logs: ${e.toString()}`);
return [];
}
}
async getDuelLogFromId(id: number) { async getDuelLogFromId(id: number) {
const repo = this.db.getRepository(DuelLog); const repo = this.db.getRepository(DuelLog);
try { try {
...@@ -289,10 +331,18 @@ export class DataManager { ...@@ -289,10 +331,18 @@ export class DataManager {
const allDuelLogs = await this.getAllDuelLogs(); const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings)); return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
} }
async getDuelLogJSONFromCondition(tournamentModeSettings: any, data: DuelLogQuery) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.getViewJSON(tournamentModeSettings));
}
async getAllReplayFilenames() { async getAllReplayFilenames() {
const allDuelLogs = await this.getAllDuelLogs(); const allDuelLogs = await this.getAllDuelLogs();
return allDuelLogs.map(duelLog => duelLog.replayFileName); return allDuelLogs.map(duelLog => duelLog.replayFileName);
} }
async getReplayFilenamesFromCondition(data: DuelLogQuery) {
const allDuelLogs = await this.getDuelLogFromCondition(data);
return allDuelLogs.map(duelLog => duelLog.replayFileName);
}
async clearDuelLog() { async clearDuelLog() {
const runner = this.db.createQueryRunner(); const runner = this.db.createQueryRunner();
try { try {
......
...@@ -77,6 +77,7 @@ __decorate([ ...@@ -77,6 +77,7 @@ __decorate([
__metadata("design:type", Number) __metadata("design:type", Number)
], DuelLog.prototype, "roomMode", void 0); ], DuelLog.prototype, "roomMode", void 0);
__decorate([ __decorate([
typeorm_1.Index(),
typeorm_1.Column("tinyint", { unsigned: true }), typeorm_1.Column("tinyint", { unsigned: true }),
__metadata("design:type", Number) __metadata("design:type", Number)
], DuelLog.prototype, "duelCount", void 0); ], DuelLog.prototype, "duelCount", void 0);
......
...@@ -33,6 +33,7 @@ export class DuelLog extends CreateAndUpdateTimeBase { ...@@ -33,6 +33,7 @@ export class DuelLog extends CreateAndUpdateTimeBase {
@Column("tinyint", {unsigned: true}) @Column("tinyint", {unsigned: true})
roomMode: number; roomMode: number;
@Index()
@Column("tinyint", {unsigned: true}) @Column("tinyint", {unsigned: true})
duelCount: number; duelCount: number;
......
...@@ -66,6 +66,7 @@ __decorate([ ...@@ -66,6 +66,7 @@ __decorate([
__metadata("design:type", Number) __metadata("design:type", Number)
], DuelLogPlayer.prototype, "isFirst", void 0); ], DuelLogPlayer.prototype, "isFirst", void 0);
__decorate([ __decorate([
typeorm_1.Index(),
typeorm_1.Column("tinyint"), typeorm_1.Column("tinyint"),
__metadata("design:type", Number) __metadata("design:type", Number)
], DuelLogPlayer.prototype, "score", void 0); ], DuelLogPlayer.prototype, "score", void 0);
......
...@@ -16,6 +16,7 @@ export class DuelLogPlayer extends BasePlayer { ...@@ -16,6 +16,7 @@ export class DuelLogPlayer extends BasePlayer {
@Column("tinyint", {unsigned: true}) @Column("tinyint", {unsigned: true})
isFirst: number; isFirst: number;
@Index()
@Column("tinyint") @Column("tinyint")
score: number; score: number;
......
...@@ -3643,6 +3643,18 @@ global.rebooted = false ...@@ -3643,6 +3643,18 @@ global.rebooted = false
#http #http
if true if true
getDuelLogQueryFromQs = (qdata) ->
ret = {}
if(qdata.roomname)
ret.roomName = decodeURIComponent(qdata.roomname)
if(qdata.duelcount)
ret.roomName = parseInt(decodeURIComponent(qdata.duelcount))
if(qdata.playername)
ret.playerName = decodeURIComponent(qdata.playername)
if(qdata.score)
ret.playerScore = parseInt(decodeURIComponent(qdata.score))
return
addCallback = (callback, text)-> addCallback = (callback, text)->
if not callback then return text if not callback then return text
return callback + "( " + text + " );" return callback + "( " + text + " );"
...@@ -3696,7 +3708,7 @@ if true ...@@ -3696,7 +3708,7 @@ if true
return return
else else
response.writeHead(200) response.writeHead(200)
duellog = JSON.stringify(await dataManager.getDuelLogJSON(settings.modules.tournament_mode), null, 2) duellog = JSON.stringify(await dataManager.getDuelLogJSONFromCondition(settings.modules.tournament_mode, getDuelLogQueryFromQs(u.query)), null, 2)
response.end(addCallback(u.query.callback, duellog)) response.end(addCallback(u.query.callback, duellog))
else if u.pathname == '/api/archive.zip' and settings.modules.mysql.enabled else if u.pathname == '/api/archive.zip' and settings.modules.mysql.enabled
...@@ -3709,7 +3721,7 @@ if true ...@@ -3709,7 +3721,7 @@ if true
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
for filename in await dataManager.getAllReplayFilenames() for filename in await dataManager.getReplayFilenamesFromCondition(getDuelLogQueryFromQs(u.query))
check = true check = true
archive_args.push(filename) archive_args.push(filename)
if !check if !check
......
// Generated by CoffeeScript 2.5.1 // Generated by CoffeeScript 2.5.1
(function() { (function() {
// 标准库 // 标准库
var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, 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, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, 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_tips, 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, ygopro, zlib; var CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, 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, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_queue_callbacks, checkFileExists, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, fs, geoip, getDuelLogQueryFromQs, getSeedTimet, get_callback, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, is_challonge_requesting, lflists, loadJSON, loadJSONAsync, loadLFList, loadRemoteData, load_dialogues, load_tips, 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, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -4865,6 +4865,22 @@ ...@@ -4865,6 +4865,22 @@
//http //http
if (true) { if (true) {
getDuelLogQueryFromQs = function(qdata) {
var ret;
ret = {};
if (qdata.roomname) {
ret.roomName = decodeURIComponent(qdata.roomname);
}
if (qdata.duelcount) {
ret.roomName = parseInt(decodeURIComponent(qdata.duelcount));
}
if (qdata.playername) {
ret.playerName = decodeURIComponent(qdata.playername);
}
if (qdata.score) {
ret.playerScore = parseInt(decodeURIComponent(qdata.score));
}
};
addCallback = function(callback, text) { addCallback = function(callback, text) {
if (!callback) { if (!callback) {
return text; return text;
...@@ -4935,7 +4951,7 @@ ...@@ -4935,7 +4951,7 @@
return; return;
} else { } else {
response.writeHead(200); response.writeHead(200);
duellog = JSON.stringify((await dataManager.getDuelLogJSON(settings.modules.tournament_mode)), null, 2); duellog = JSON.stringify((await dataManager.getDuelLogJSONFromCondition(settings.modules.tournament_mode, getDuelLogQueryFromQs(u.query))), null, 2);
response.end(addCallback(u.query.callback, duellog)); response.end(addCallback(u.query.callback, duellog));
} }
} else if (u.pathname === '/api/archive.zip' && settings.modules.mysql.enabled) { } else if (u.pathname === '/api/archive.zip' && settings.modules.mysql.enabled) {
...@@ -4948,7 +4964,7 @@ ...@@ -4948,7 +4964,7 @@
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;
ref = (await dataManager.getAllReplayFilenames()); ref = (await dataManager.getReplayFilenamesFromCondition(getDuelLogQueryFromQs(u.query)));
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
filename = ref[j]; filename = ref[j];
check = true; check = true;
......
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