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 @@
"show_ip": true,
"show_info": true,
"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
},
"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
spawnSync = require('child_process').spawnSync
_async = require('async')
# ts utility
utility = require './utility.js'
# 三方库
_ = global._ = require 'underscore'
_.str = require 'underscore.string'
......@@ -1435,7 +1438,7 @@ class Room
if (rule.match /(^|,|,)(T|TAG)(,|,|$)/)
@hostinfo.mode = 2
@hostinfo.start_lp = 16000
@hostinfo.start_lp = settings.hostinfo.start_lp * 2
if (rule.match /(^|,|,)(OOR|OCGONLYRANDOM)(,|,|$)/)
@hostinfo.rule = 0
......@@ -1701,28 +1704,36 @@ class Room
formatted_replays = []
for repbuf in @replays when repbuf
formatted_replays.push(repbuf.toString("base64"))
request.post { url : settings.modules.arena_mode.post_score , form : {
accesskey: settings.modules.arena_mode.accesskey,
usernameA: score_array[0].name,
usernameB: score_array[1].name,
userscoreA: score_array[0].score,
userscoreB: score_array[1].score,
userdeckA: score_array[0].deck,
userdeckB: score_array[1].deck,
first: JSON.stringify(@first_list),
replays: JSON.stringify(formatted_replays),
start: @start_time,
end: end_time,
arena: @arena
}}, (error, response, body)=>
if error
log.warn 'SCORE POST ERROR', error
form_data = new URLSearchParams
form_data.append 'accesskey', settings.modules.arena_mode.accesskey
form_data.append 'usernameA', score_array[0].name
form_data.append 'usernameB', score_array[1].name
form_data.append 'userscoreA', score_array[0].score
form_data.append 'userscoreB', score_array[1].score
form_data.append 'userdeckA', score_array[0].deck
form_data.append 'userdeckB', score_array[1].deck
form_data.append 'first', JSON.stringify @first_list
form_data.append 'replays', JSON.stringify formatted_replays
form_data.append 'start', @start_time
form_data.append 'end', end_time
form_data.append 'arena', @arena
post_score_process = () ->
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
if response.statusCode >= 300
log.warn 'SCORE POST FAIL', response.statusCode, response.statusMessage, @name, body
#else
# log.info 'SCORE POST OK', response.statusCode, response.statusMessage, @name, body
return
log.warn 'SCORE POST ERROR', error.message
if settings.modules.challonge.enabled and @duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and @hostinfo.mode != 2 and !@kicked
room_name = @name
......
// Generated by CoffeeScript 2.7.0
(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');
......@@ -27,6 +27,9 @@
_async = require('async');
// ts utility
utility = require('./utility.js');
// 三方库
_ = global._ = require('underscore');
......@@ -1861,7 +1864,7 @@
}
if (rule.match(/(^|,|,)(T|TAG)(,|,|$)/)) {
this.hostinfo.mode = 2;
this.hostinfo.start_lp = 16000;
this.hostinfo.start_lp = settings.hostinfo.start_lp * 2;
}
if (rule.match(/(^|,|,)(OOR|OCGONLYRANDOM)(,|,|$)/)) {
this.hostinfo.rule = 0;
......@@ -2133,7 +2136,7 @@
}
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) {
return;
}
......@@ -2204,34 +2207,39 @@
formatted_replays.push(repbuf.toString("base64"));
}
}
request.post({
url: settings.modules.arena_mode.post_score,
form: {
accesskey: settings.modules.arena_mode.accesskey,
usernameA: score_array[0].name,
usernameB: score_array[1].name,
userscoreA: score_array[0].score,
userscoreB: score_array[1].score,
userdeckA: score_array[0].deck,
userdeckB: score_array[1].deck,
first: JSON.stringify(this.first_list),
replays: JSON.stringify(formatted_replays),
start: this.start_time,
end: end_time,
arena: this.arena
}
}, (error, response, body) => {
if (error) {
log.warn('SCORE POST ERROR', error);
} else {
if (response.statusCode >= 300) {
log.warn('SCORE POST FAIL', response.statusCode, response.statusMessage, this.name, body);
form_data = new URLSearchParams();
form_data.append('accesskey', settings.modules.arena_mode.accesskey);
form_data.append('usernameA', score_array[0].name);
form_data.append('usernameB', score_array[1].name);
form_data.append('userscoreA', score_array[0].score);
form_data.append('userscoreB', score_array[1].score);
form_data.append('userdeckA', score_array[0].deck);
form_data.append('userdeckB', score_array[1].deck);
form_data.append('first', JSON.stringify(this.first_list));
form_data.append('replays', JSON.stringify(formatted_replays));
form_data.append('start', this.start_time);
form_data.append('end', end_time);
form_data.append('arena', this.arena);
post_score_process = function() {
return axios.post(settings.modules.arena_mode.post_score, form_data, {
validateStatus: function(status) {
return status < 400;
},
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
};
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) {
room_name = this.name;
this.post_challonge_score();
......
......@@ -176,7 +176,15 @@ const receiveDecks = function(files, callback) {
_async.eachSeries(files, async(file) => {
if (_.endsWith(file.name, ".ydk")) {
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));
result.push({
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