Commit 1dc9ca38 authored by nanahira's avatar nanahira

Merge branch 'master' into ai-play

parents c848d320 69402caa
Pipeline #38292 passed with stages
in 26 minutes and 30 seconds
...@@ -217,6 +217,10 @@ ...@@ -217,6 +217,10 @@
"show_ip": true, "show_ip": true,
"show_info": true, "show_info": true,
"log_save_path": "./config/", "log_save_path": "./config/",
"deck_dashboard_min_deck": 40,
"deck_dashboard_max_deck": 60,
"deck_dashboard_max_extra": 15,
"deck_dashboard_max_side": 15,
"port": 7933 "port": 7933
}, },
"athletic_check": { "athletic_check": {
......
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.retry = retry;
async function retry(fn, count, delayFn = (attempt) => Math.pow(2, attempt) * 100) {
let lastError;
for (let attempt = 0; attempt < count; attempt++) {
try {
return await fn();
}
catch (error) {
lastError = error;
if (attempt < count - 1) {
const delay = delayFn(attempt);
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
}
// 如果全部尝试失败,抛出最后一个错误
throw lastError;
}
export async function retry<T>(
fn: () => Promise<T>,
count: number,
delayFn: (attempt: number) => number = (attempt) => Math.pow(2, attempt) * 100
): Promise<T> {
let lastError: any;
for (let attempt = 0; attempt < count; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (attempt < count - 1) {
const delay = delayFn(attempt);
await new Promise((resolve) => setTimeout(resolve, delay));
}
}
}
// 如果全部尝试失败,抛出最后一个错误
throw lastError;
}
...@@ -12,6 +12,9 @@ spawn = require('child_process').spawn ...@@ -12,6 +12,9 @@ spawn = require('child_process').spawn
spawnSync = require('child_process').spawnSync spawnSync = require('child_process').spawnSync
_async = require('async') _async = require('async')
# ts utility
utility = require './utility.js'
# 三方库 # 三方库
_ = global._ = require 'underscore' _ = global._ = require 'underscore'
_.str = require 'underscore.string' _.str = require 'underscore.string'
...@@ -1435,7 +1438,7 @@ class Room ...@@ -1435,7 +1438,7 @@ class Room
if (rule.match /(^|,|,)(T|TAG)(,|,|$)/) if (rule.match /(^|,|,)(T|TAG)(,|,|$)/)
@hostinfo.mode = 2 @hostinfo.mode = 2
@hostinfo.start_lp = 16000 @hostinfo.start_lp = settings.hostinfo.start_lp * 2
if (rule.match /(^|,|,)(OOR|OCGONLYRANDOM)(,|,|$)/) if (rule.match /(^|,|,)(OOR|OCGONLYRANDOM)(,|,|$)/)
@hostinfo.rule = 0 @hostinfo.rule = 0
...@@ -1701,28 +1704,36 @@ class Room ...@@ -1701,28 +1704,36 @@ class Room
formatted_replays = [] formatted_replays = []
for repbuf in @replays when repbuf for repbuf in @replays when repbuf
formatted_replays.push(repbuf.toString("base64")) formatted_replays.push(repbuf.toString("base64"))
request.post { url : settings.modules.arena_mode.post_score , form : { form_data = new URLSearchParams
accesskey: settings.modules.arena_mode.accesskey, form_data.append 'accesskey', settings.modules.arena_mode.accesskey
usernameA: score_array[0].name, form_data.append 'usernameA', score_array[0].name
usernameB: score_array[1].name, form_data.append 'usernameB', score_array[1].name
userscoreA: score_array[0].score, form_data.append 'userscoreA', score_array[0].score
userscoreB: score_array[1].score, form_data.append 'userscoreB', score_array[1].score
userdeckA: score_array[0].deck, form_data.append 'userdeckA', score_array[0].deck
userdeckB: score_array[1].deck, form_data.append 'userdeckB', score_array[1].deck
first: JSON.stringify(@first_list), form_data.append 'first', JSON.stringify @first_list
replays: JSON.stringify(formatted_replays), form_data.append 'replays', JSON.stringify formatted_replays
start: @start_time, form_data.append 'start', @start_time
end: end_time, form_data.append 'end', end_time
arena: @arena form_data.append 'arena', @arena
}}, (error, response, body)=>
if error post_score_process = () ->
log.warn 'SCORE POST ERROR', error axios.post settings.modules.arena_mode.post_score, form_data,
validateStatus: (status) -> status < 400
headers:
'Content-Type': 'application/x-www-form-urlencoded'
utility.retry post_score_process, 10
.then (response) =>
log.info 'SCORE POST OK', response.status, response.statusText, @name, response.data
.catch (error) =>
if error.response?
log.warn 'SCORE POST FAIL', error.response.status, error.response.statusText, @name, error.response.data
else else
if response.statusCode >= 300 log.warn 'SCORE POST ERROR', error.message
log.warn 'SCORE POST FAIL', response.statusCode, response.statusMessage, @name, body
#else
# log.info 'SCORE POST OK', response.statusCode, response.statusMessage, @name, body
return
if settings.modules.challonge.enabled and @duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and @hostinfo.mode != 2 and !@kicked if settings.modules.challonge.enabled and @duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and @hostinfo.mode != 2 and !@kicked
room_name = @name room_name = @name
......
// Generated by CoffeeScript 2.7.0 // Generated by CoffeeScript 2.7.0
(function() { (function() {
// 标准库 // 标准库
var Aragami, 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_replays_and_kick, CLIENT_send_vip_status, CLIENT_set_ip, 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_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, YGOProDeck, _, _async, addCallback, aragami, aragami_classes, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, concat_name, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, getRealIp, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, isTrustedProxy, 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, moment_long_ago_string, moment_now, moment_now_string, msg_polyfill, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, toIpv4, toIpv6, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib; var Aragami, 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_replays_and_kick, CLIENT_send_vip_status, CLIENT_set_ip, 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_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, YGOProDeck, _, _async, addCallback, aragami, aragami_classes, athleticChecker, auth, axios, badwordR, badwords, ban_user, bunyan, challonge, checkFileExists, concat_name, createDirectoryIfNotExists, crypto, dataManager, deck_name_match, dialogues, disconnect_list, exec, execFile, extra_mode_list, fs, geoip, getDuelLogQueryFromQs, getRealIp, get_memory_usage, http, httpRequestListener, importOldConfig, import_datas, init, ip6addr, isTrustedProxy, 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, moment_long_ago_string, moment_now, moment_now_string, msg_polyfill, neosRequestListener, net, netRequestHandler, os, osu, path, qs, real_windbot_server_ip, release_disconnect, report_to_big_brother, request, roomlist, rooms_count, setting_change, setting_get, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, toIpv4, toIpv6, url, users_cache, util, utility, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -27,6 +27,9 @@ ...@@ -27,6 +27,9 @@
_async = require('async'); _async = require('async');
// ts utility
utility = require('./utility.js');
// 三方库 // 三方库
_ = global._ = require('underscore'); _ = global._ = require('underscore');
...@@ -1861,7 +1864,7 @@ ...@@ -1861,7 +1864,7 @@
} }
if (rule.match(/(^|,|,)(T|TAG)(,|,|$)/)) { if (rule.match(/(^|,|,)(T|TAG)(,|,|$)/)) {
this.hostinfo.mode = 2; this.hostinfo.mode = 2;
this.hostinfo.start_lp = 16000; this.hostinfo.start_lp = settings.hostinfo.start_lp * 2;
} }
if (rule.match(/(^|,|,)(OOR|OCGONLYRANDOM)(,|,|$)/)) { if (rule.match(/(^|,|,)(OOR|OCGONLYRANDOM)(,|,|$)/)) {
this.hostinfo.rule = 0; this.hostinfo.rule = 0;
...@@ -2133,7 +2136,7 @@ ...@@ -2133,7 +2136,7 @@
} }
delete() { delete() {
var end_time, formatted_replays, index, j, len, log_rep_id, name, name_vpass, player_datas, recorder_buffer, ref, ref1, repbuf, replay_id, room_name, score, score_array, score_form; var end_time, form_data, formatted_replays, index, j, len, log_rep_id, name, name_vpass, player_datas, post_score_process, recorder_buffer, ref, ref1, repbuf, replay_id, room_name, score, score_array, score_form;
if (this.deleted) { if (this.deleted) {
return; return;
} }
...@@ -2204,34 +2207,39 @@ ...@@ -2204,34 +2207,39 @@
formatted_replays.push(repbuf.toString("base64")); formatted_replays.push(repbuf.toString("base64"));
} }
} }
request.post({ form_data = new URLSearchParams();
url: settings.modules.arena_mode.post_score, form_data.append('accesskey', settings.modules.arena_mode.accesskey);
form: { form_data.append('usernameA', score_array[0].name);
accesskey: settings.modules.arena_mode.accesskey, form_data.append('usernameB', score_array[1].name);
usernameA: score_array[0].name, form_data.append('userscoreA', score_array[0].score);
usernameB: score_array[1].name, form_data.append('userscoreB', score_array[1].score);
userscoreA: score_array[0].score, form_data.append('userdeckA', score_array[0].deck);
userscoreB: score_array[1].score, form_data.append('userdeckB', score_array[1].deck);
userdeckA: score_array[0].deck, form_data.append('first', JSON.stringify(this.first_list));
userdeckB: score_array[1].deck, form_data.append('replays', JSON.stringify(formatted_replays));
first: JSON.stringify(this.first_list), form_data.append('start', this.start_time);
replays: JSON.stringify(formatted_replays), form_data.append('end', end_time);
start: this.start_time, form_data.append('arena', this.arena);
end: end_time, post_score_process = function() {
arena: this.arena return axios.post(settings.modules.arena_mode.post_score, form_data, {
} validateStatus: function(status) {
}, (error, response, body) => { return status < 400;
if (error) { },
log.warn('SCORE POST ERROR', error); headers: {
} else { 'Content-Type': 'application/x-www-form-urlencoded'
if (response.statusCode >= 300) {
log.warn('SCORE POST FAIL', response.statusCode, response.statusMessage, this.name, body);
} }
});
};
utility.retry(post_score_process, 10).then((response) => {
return log.info('SCORE POST OK', response.status, response.statusText, this.name, response.data);
}).catch((error) => {
if (error.response != null) {
return log.warn('SCORE POST FAIL', error.response.status, error.response.statusText, this.name, error.response.data);
} else {
return log.warn('SCORE POST ERROR', error.message);
} }
}); });
} }
//else
// log.info 'SCORE POST OK', response.statusCode, response.statusMessage, @name, body
if (settings.modules.challonge.enabled && this.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && this.hostinfo.mode !== 2 && !this.kicked) { if (settings.modules.challonge.enabled && this.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && this.hostinfo.mode !== 2 && !this.kicked) {
room_name = this.name; room_name = this.name;
this.post_challonge_score(); this.post_challonge_score();
......
...@@ -176,7 +176,15 @@ const receiveDecks = function(files, callback) { ...@@ -176,7 +176,15 @@ const receiveDecks = function(files, callback) {
_async.eachSeries(files, async(file) => { _async.eachSeries(files, async(file) => {
if (_.endsWith(file.name, ".ydk")) { if (_.endsWith(file.name, ".ydk")) {
const deck = await readDeck(file.name, file.path); const deck = await readDeck(file.name, file.path);
if (deck.main.length >= 40) { const minDeck = config.deck_dashboard_min_deck || 40;
const maxDeck = config.deck_dashboard_max_deck || 60;
const maxExtra = config.deck_dashboard_max_extra || 15;
const maxSide = config.deck_dashboard_max_side || 15;
if (deck.main.length >= minDeck
&& deck.main.length <= maxDeck
&& deck.extra.length <= maxExtra
&& deck.side.length <= maxSide
) {
fs.createReadStream(file.path).pipe(fs.createWriteStream(config.deck_path + file.name)); fs.createReadStream(file.path).pipe(fs.createWriteStream(config.deck_path + file.name));
result.push({ result.push({
file: file.name, file: file.name,
......
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