Commit 3bb9a877 authored by nanahira's avatar nanahira

Merge branch 'master' of https://github.com/moecube/srvpro

parents 15860c29 2be5040b
...@@ -61,7 +61,9 @@ ...@@ -61,7 +61,9 @@
"enabled": false, "enabled": false,
"botlist": "./windbot/bots.json", "botlist": "./windbot/bots.json",
"spawn": false, "spawn": false,
"port": 2399 "port": 2399,
"server_ip": "127.0.0.1",
"my_ip": "127.0.0.1"
}, },
"mycard": { "mycard": {
"enabled": false, "enabled": false,
......
...@@ -6,6 +6,7 @@ path = require 'path' ...@@ -6,6 +6,7 @@ path = require 'path'
fs = require 'fs' fs = require 'fs'
os = require 'os' os = require 'os'
crypto = require 'crypto' crypto = require 'crypto'
exec = require('child_process').exec
execFile = require('child_process').execFile execFile = require('child_process').execFile
spawn = require('child_process').spawn spawn = require('child_process').spawn
spawnSync = require('child_process').spawnSync spawnSync = require('child_process').spawnSync
...@@ -162,6 +163,7 @@ if settings.modules.tournament_mode.enabled ...@@ -162,6 +163,7 @@ if settings.modules.tournament_mode.enabled
duel_log.file = 'duel_log.' + moment().format('YYYY-MM-DD HH-mm-ss') + '.json' duel_log.file = 'duel_log.' + moment().format('YYYY-MM-DD HH-mm-ss') + '.json'
duel_log.duel_log = [] duel_log.duel_log = []
setting_save(duel_log) setting_save(duel_log)
return
clearlog() clearlog()
# 组件 # 组件
...@@ -196,20 +198,28 @@ if settings.modules.mycard.enabled ...@@ -196,20 +198,28 @@ if settings.modules.mycard.enabled
pg_client.connect() pg_client.connect()
# 获取可用内存 # 获取可用内存
memory_usage = 0
get_memory_usage = ()-> get_memory_usage = ()->
prc_free = spawnSync("free", []) prc_free = exec("free")
if (prc_free.stdout) prc_free.stdout.on 'data', (data)->
lines = prc_free.stdout.toString().split(/\n/g) lines = data.toString().split(/\n/g)
line = lines[0].split(/\s+/)
new_free = if line[6] == 'available' then true else false
line = lines[1].split(/\s+/) line = lines[1].split(/\s+/)
total = parseInt(line[1], 10) total = parseInt(line[1], 10)
free = parseInt(line[3], 10) free = parseInt(line[3], 10)
buffers = parseInt(line[5], 10) buffers = parseInt(line[5], 10)
if new_free
actualFree = parseInt(line[6], 10)
else
cached = parseInt(line[6], 10) cached = parseInt(line[6], 10)
actualFree = free + buffers + cached actualFree = free + buffers + cached
percentUsed = parseFloat(((1 - (actualFree / total)) * 100).toFixed(2)) percentUsed = parseFloat(((1 - (actualFree / total)) * 100).toFixed(2))
else memory_usage = percentUsed
percentUsed = 0 return
return percentUsed return
get_memory_usage()
setInterval(get_memory_usage, 3000)
Cloud_replay_ids = [] Cloud_replay_ids = []
...@@ -261,7 +271,7 @@ ROOM_find_or_create_by_name = (name, player_ip)-> ...@@ -261,7 +271,7 @@ ROOM_find_or_create_by_name = (name, player_ip)->
return ROOM_find_or_create_random(uname, player_ip) return ROOM_find_or_create_random(uname, player_ip)
if room = ROOM_find_by_name(name) if room = ROOM_find_by_name(name)
return room return room
else if get_memory_usage() >= 90 else if memory_usage >= 90
return null return null
else else
return new Room(name) return new Room(name)
...@@ -292,7 +302,7 @@ ROOM_find_or_create_random = (type, player_ip)-> ...@@ -292,7 +302,7 @@ ROOM_find_or_create_random = (type, player_ip)->
if result if result
result.welcome = '${random_duel_enter_room_waiting}' result.welcome = '${random_duel_enter_room_waiting}'
#log.info 'found room', player_name #log.info 'found room', player_name
else if get_memory_usage() < 90 else if memory_usage < 90
type = if type then type else 'S' type = if type then type else 'S'
name = type + ',RANDOM#' + Math.floor(Math.random() * 100000) name = type + ',RANDOM#' + Math.floor(Math.random() * 100000)
result = new Room(name) result = new Room(name)
...@@ -617,7 +627,7 @@ class Room ...@@ -617,7 +627,7 @@ class Room
add_windbot: (botdata)-> add_windbot: (botdata)->
@windbot = botdata @windbot = botdata
request request
url: "http://127.0.0.1:#{settings.modules.windbot.port}/?name=#{encodeURIComponent(botdata.name)}&deck=#{encodeURIComponent(botdata.deck)}&host=127.0.0.1&port=#{settings.port}&dialog=#{encodeURIComponent(botdata.dialog)}&version=#{settings.version}&password=#{encodeURIComponent(@name)}" url: "http://#{settings.modules.windbot.server_ip}:#{settings.modules.windbot.port}/?name=#{encodeURIComponent(botdata.name)}&deck=#{encodeURIComponent(botdata.deck)}&host=#{settings.modules.windbot.my_ip}&port=#{settings.port}&dialog=#{encodeURIComponent(botdata.dialog)}&version=#{settings.version}&password=#{encodeURIComponent(@name)}"
, (error, response, body)=> , (error, response, body)=>
if error if error
log.warn 'windbot add error', error, this.name log.warn 'windbot add error', error, this.name
...@@ -682,8 +692,10 @@ class Room ...@@ -682,8 +692,10 @@ class Room
# 网络连接 # 网络连接
net.createServer (client) -> net.createServer (client) ->
client.ip = client.remoteAddress client.ip = client.remoteAddress
client.is_local = client.ip and (client.ip.includes('127.0.0.1') or client.ip.includes(settings.modules.windbot.server_ip))
connect_count = ROOM_connected_ip[client.ip] or 0 connect_count = ROOM_connected_ip[client.ip] or 0
if !settings.modules.test_mode.no_connect_count_limit and client.ip != '::ffff:127.0.0.1' if !settings.modules.test_mode.no_connect_count_limit and !client.is_local
connect_count++ connect_count++
ROOM_connected_ip[client.ip] = connect_count ROOM_connected_ip[client.ip] = connect_count
#log.info "connect", client.ip, ROOM_connected_ip[client.ip] #log.info "connect", client.ip, ROOM_connected_ip[client.ip]
...@@ -935,7 +947,7 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)-> ...@@ -935,7 +947,7 @@ ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
buffer = struct.buffer buffer = struct.buffer
client.name = name client.name = name
if not settings.modules.i18n.auto_pick or client.ip=="::ffff:127.0.0.1" if not settings.modules.i18n.auto_pick or client.is_local
client.lang=settings.modules.i18n.default client.lang=settings.modules.i18n.default
else else
geo = geoip.lookup(client.ip) geo = geoip.lookup(client.ip)
...@@ -1232,7 +1244,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -1232,7 +1244,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
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
ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE)
if settings.modules.arena_mode.enabled and client.ip != '::ffff:127.0.0.1' #and not client.score_shown if settings.modules.arena_mode.enabled and !client.is_local #and not client.score_shown
request request
url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name), url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name),
json: true json: true
...@@ -1416,7 +1428,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ...@@ -1416,7 +1428,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
ygopro.ctos_follow 'HS_TOOBSERVER', true, (buffer, info, client, server)-> ygopro.ctos_follow 'HS_TOOBSERVER', true, (buffer, info, client, server)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
if not room.arena or client.ip == "::ffff:127.0.0.1" if not room.arena or client.is_local
return false return false
for player in room.players for player in room.players
if player == client if player == client
...@@ -1613,7 +1625,6 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ...@@ -1613,7 +1625,6 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client.deck_saved = true client.deck_saved = true
return return
ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server)-> ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room return unless room
...@@ -1893,7 +1904,7 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server)-> ...@@ -1893,7 +1904,7 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server)->
cloud_replay_id: "R#"+room.cloud_replay_id, cloud_replay_id: "R#"+room.cloud_replay_id,
replay_filename: replay_filename, replay_filename: replay_filename,
players: (for player in room.dueling_players players: (for player in room.dueling_players
name: player.name + (if settings.modules.tournament_mode.show_ip and player.ip != '::ffff:127.0.0.1' then (" (IP: " + player.ip.slice(7) + ")") else "") + (if settings.modules.tournament_mode.show_info and not (room.hostinfo.mode == 2 and player.pos > 1) then (" (Score:" + room.scores[player.name] + " LP:" + (if player.lp? then player.lp else room.hostinfo.start_lp) + ")") else ""), name: player.name + (if settings.modules.tournament_mode.show_ip and !player.is_local then (" (IP: " + player.ip.slice(7) + ")") else "") + (if settings.modules.tournament_mode.show_info and not (room.hostinfo.mode == 2 and player.pos > 1) then (" (Score:" + room.scores[player.name] + " LP:" + (if player.lp? then player.lp else room.hostinfo.start_lp) + ")") else ""),
winner: player.pos == room.winner winner: player.pos == room.winner
) )
} }
...@@ -1991,7 +2002,7 @@ if settings.modules.http ...@@ -1991,7 +2002,7 @@ if settings.modules.http
needpass: (room.name.indexOf('$') != -1).toString(), needpass: (room.name.indexOf('$') != -1).toString(),
users: (for player in room.players when player.pos? users: (for player in room.players when player.pos?
id: (-1).toString(), id: (-1).toString(),
name: player.name + (if settings.modules.http.show_ip and pass_validated and player.ip != '::ffff:127.0.0.1' then (" (IP: " + player.ip.slice(7) + ")") else "") + (if settings.modules.http.show_info and room.started and not (room.hostinfo.mode == 2 and player.pos > 1) then (" (Score:" + room.scores[player.name] + " LP:" + (if player.lp? then player.lp else room.hostinfo.start_lp) + ")") else ""), name: player.name + (if settings.modules.http.show_ip and pass_validated and !player.is_local then (" (IP: " + player.ip.slice(7) + ")") else "") + (if settings.modules.http.show_info and room.started and not (room.hostinfo.mode == 2 and player.pos > 1) then (" (Score:" + room.scores[player.name] + " LP:" + (if player.lp? then player.lp else room.hostinfo.start_lp) + ")") else ""),
pos: player.pos pos: player.pos
), ),
istart: if room.started then (if settings.modules.http.show_info then ("Duel:" + room.duel_count + " " + (if room.changing_side then "Siding" else "Turn:" + (if room.turn? then room.turn else 0) + (if room.death then "/" + (if room.death > 0 then room.death - 1 else "Death") else ""))) else 'start') else 'wait' istart: if room.started then (if settings.modules.http.show_info then ("Duel:" + room.duel_count + " " + (if room.changing_side then "Siding" else "Turn:" + (if room.turn? then room.turn else 0) + (if room.death then "/" + (if room.death > 0 then room.death - 1 else "Death") else ""))) else 'start') else 'wait'
...@@ -2076,6 +2087,7 @@ if settings.modules.http ...@@ -2076,6 +2087,7 @@ if settings.modules.http
else else
response.writeHead(200, { "Content-Type": "application/octet-stream", "Content-Disposition": "attachment" }) response.writeHead(200, { "Content-Type": "application/octet-stream", "Content-Disposition": "attachment" })
response.end(buffer) response.end(buffer)
return
) )
else if u.pathname == '/api/message' else if u.pathname == '/api/message'
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 1.12.7
(function() { (function() {
var Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_connected_ip, ROOM_find_by_name, 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_players_banned, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, Room, _, addCallback, badwords, ban_user, bunyan, clearlog, config, cppversion, crypto, date, default_config, default_data, dialogues, duel_log, e, execFile, fs, geoip, get_memory_usage, http, http_server, https, https_server, lflists, list, load_dialogues, load_tips, log, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldtips, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, tips, url, users_cache, wait_room_start, wait_room_start_arena, windbot_bin, windbot_parameters, windbot_process, windbots, ygopro, zlib; var Cloud_replay_ids, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_connected_ip, ROOM_find_by_name, 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_players_banned, ROOM_players_oppentlist, ROOM_unwelcome, ROOM_validate, Room, _, addCallback, badwords, ban_user, bunyan, clearlog, config, cppversion, crypto, date, default_config, default_data, dialogues, duel_log, e, exec, execFile, fs, geoip, get_memory_usage, http, http_server, https, https_server, lflists, list, load_dialogues, load_tips, log, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldtips, options, os, path, pgClient, pg_client, pg_query, redis, redisdb, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, tips, url, users_cache, wait_room_start, wait_room_start_arena, windbot_bin, windbot_parameters, windbot_process, windbots, ygopro, zlib;
var words, oldwords; var words, oldwords;
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
crypto = require('crypto'); crypto = require('crypto');
exec = require('child_process').exec;
execFile = require('child_process').execFile; execFile = require('child_process').execFile;
spawn = require('child_process').spawn; spawn = require('child_process').spawn;
...@@ -252,7 +254,7 @@ ...@@ -252,7 +254,7 @@
duel_log = {}; duel_log = {};
duel_log.file = 'duel_log.' + moment().format('YYYY-MM-DD HH-mm-ss') + '.json'; duel_log.file = 'duel_log.' + moment().format('YYYY-MM-DD HH-mm-ss') + '.json';
duel_log.duel_log = []; duel_log.duel_log = [];
return setting_save(duel_log); setting_save(duel_log);
}; };
clearlog(); clearlog();
} }
...@@ -290,24 +292,35 @@ ...@@ -290,24 +292,35 @@
pg_client.connect(); pg_client.connect();
} }
memory_usage = 0;
get_memory_usage = function() { get_memory_usage = function() {
var actualFree, buffers, cached, free, line, lines, percentUsed, prc_free, total; var prc_free;
prc_free = spawnSync("free", []); prc_free = exec("free");
if (prc_free.stdout) { prc_free.stdout.on('data', function(data) {
lines = prc_free.stdout.toString().split(/\n/g); var actualFree, buffers, cached, free, line, lines, new_free, percentUsed, total;
lines = data.toString().split(/\n/g);
line = lines[0].split(/\s+/);
new_free = line[6] === 'available' ? true : false;
line = lines[1].split(/\s+/); line = lines[1].split(/\s+/);
total = parseInt(line[1], 10); total = parseInt(line[1], 10);
free = parseInt(line[3], 10); free = parseInt(line[3], 10);
buffers = parseInt(line[5], 10); buffers = parseInt(line[5], 10);
if (new_free) {
actualFree = parseInt(line[6], 10);
} else {
cached = parseInt(line[6], 10); cached = parseInt(line[6], 10);
actualFree = free + buffers + cached; actualFree = free + buffers + cached;
percentUsed = parseFloat(((1 - (actualFree / total)) * 100).toFixed(2));
} else {
percentUsed = 0;
} }
return percentUsed; percentUsed = parseFloat(((1 - (actualFree / total)) * 100).toFixed(2));
memory_usage = percentUsed;
});
}; };
get_memory_usage();
setInterval(get_memory_usage, 3000);
Cloud_replay_ids = []; Cloud_replay_ids = [];
ROOM_all = []; ROOM_all = [];
...@@ -388,7 +401,7 @@ ...@@ -388,7 +401,7 @@
} }
if (room = ROOM_find_by_name(name)) { if (room = ROOM_find_by_name(name)) {
return room; return room;
} else if (get_memory_usage() >= 90) { } else if (memory_usage >= 90) {
return null; return null;
} else { } else {
return new Room(name); return new Room(name);
...@@ -427,7 +440,7 @@ ...@@ -427,7 +440,7 @@
}); });
if (result) { if (result) {
result.welcome = '${random_duel_enter_room_waiting}'; result.welcome = '${random_duel_enter_room_waiting}';
} else if (get_memory_usage() < 90) { } else if (memory_usage < 90) {
type = type ? type : 'S'; type = type ? type : 'S';
name = type + ',RANDOM#' + Math.floor(Math.random() * 100000); name = type + ',RANDOM#' + Math.floor(Math.random() * 100000);
result = new Room(name); result = new Room(name);
...@@ -861,7 +874,7 @@ ...@@ -861,7 +874,7 @@
Room.prototype.add_windbot = function(botdata) { Room.prototype.add_windbot = function(botdata) {
this.windbot = botdata; this.windbot = botdata;
request({ request({
url: "http://127.0.0.1:" + settings.modules.windbot.port + "/?name=" + (encodeURIComponent(botdata.name)) + "&deck=" + (encodeURIComponent(botdata.deck)) + "&host=127.0.0.1&port=" + settings.port + "&dialog=" + (encodeURIComponent(botdata.dialog)) + "&version=" + settings.version + "&password=" + (encodeURIComponent(this.name)) url: "http://" + settings.modules.windbot.server_ip + ":" + settings.modules.windbot.port + "/?name=" + (encodeURIComponent(botdata.name)) + "&deck=" + (encodeURIComponent(botdata.deck)) + "&host=" + settings.modules.windbot.my_ip + "&port=" + settings.port + "&dialog=" + (encodeURIComponent(botdata.dialog)) + "&version=" + settings.version + "&password=" + (encodeURIComponent(this.name))
}, (function(_this) { }, (function(_this) {
return function(error, response, body) { return function(error, response, body) {
if (error) { if (error) {
...@@ -951,8 +964,9 @@ ...@@ -951,8 +964,9 @@
net.createServer(function(client) { net.createServer(function(client) {
var connect_count, server; var connect_count, server;
client.ip = client.remoteAddress; client.ip = client.remoteAddress;
client.is_local = client.ip && (client.ip.includes('127.0.0.1') || client.ip.includes(settings.modules.windbot.server_ip));
connect_count = ROOM_connected_ip[client.ip] || 0; connect_count = ROOM_connected_ip[client.ip] || 0;
if (!settings.modules.test_mode.no_connect_count_limit && client.ip !== '::ffff:127.0.0.1') { if (!settings.modules.test_mode.no_connect_count_limit && !client.is_local) {
connect_count++; connect_count++;
} }
ROOM_connected_ip[client.ip] = connect_count; ROOM_connected_ip[client.ip] = connect_count;
...@@ -1224,7 +1238,7 @@ ...@@ -1224,7 +1238,7 @@
struct.set("name", name); struct.set("name", name);
buffer = struct.buffer; buffer = struct.buffer;
client.name = name; client.name = name;
if (!settings.modules.i18n.auto_pick || client.ip === "::ffff:127.0.0.1") { if (!settings.modules.i18n.auto_pick || client.is_local) {
client.lang = settings.modules.i18n["default"]; client.lang = settings.modules.i18n["default"];
} else { } else {
geo = geoip.lookup(client.ip); geo = geoip.lookup(client.ip);
...@@ -1537,7 +1551,7 @@ ...@@ -1537,7 +1551,7 @@
if (room.welcome) { if (room.welcome) {
ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE);
} }
if (settings.modules.arena_mode.enabled && client.ip !== '::ffff:127.0.0.1') { if (settings.modules.arena_mode.enabled && !client.is_local) {
request({ request({
url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name), url: settings.modules.arena_mode.get_score + encodeURIComponent(client.name),
json: true json: true
...@@ -1780,7 +1794,7 @@ ...@@ -1780,7 +1794,7 @@
if (!room) { if (!room) {
return; return;
} }
if (!room.arena || client.ip === "::ffff:127.0.0.1") { if (!room.arena || client.is_local) {
return false; return false;
} }
ref = room.players; ref = room.players;
...@@ -2531,7 +2545,7 @@ ...@@ -2531,7 +2545,7 @@
for (k = 0, len1 = ref1.length; k < len1; k++) { for (k = 0, len1 = ref1.length; k < len1; k++) {
player = ref1[k]; player = ref1[k];
results.push({ results.push({
name: player.name + (settings.modules.tournament_mode.show_ip && player.ip !== '::ffff:127.0.0.1' ? " (IP: " + player.ip.slice(7) + ")" : "") + (settings.modules.tournament_mode.show_info && !(room.hostinfo.mode === 2 && player.pos > 1) ? " (Score:" + room.scores[player.name] + " LP:" + (player.lp != null ? player.lp : room.hostinfo.start_lp) + ")" : ""), name: player.name + (settings.modules.tournament_mode.show_ip && !player.is_local ? " (IP: " + player.ip.slice(7) + ")" : "") + (settings.modules.tournament_mode.show_info && !(room.hostinfo.mode === 2 && player.pos > 1) ? " (Score:" + room.scores[player.name] + " LP:" + (player.lp != null ? player.lp : room.hostinfo.start_lp) + ")" : ""),
winner: player.pos === room.winner winner: player.pos === room.winner
}); });
} }
...@@ -2666,7 +2680,7 @@ ...@@ -2666,7 +2680,7 @@
if (player.pos != null) { if (player.pos != null) {
results1.push({ results1.push({
id: (-1).toString(), id: (-1).toString(),
name: player.name + (settings.modules.http.show_ip && pass_validated && player.ip !== '::ffff:127.0.0.1' ? " (IP: " + player.ip.slice(7) + ")" : "") + (settings.modules.http.show_info && room.started && !(room.hostinfo.mode === 2 && player.pos > 1) ? " (Score:" + room.scores[player.name] + " LP:" + (player.lp != null ? player.lp : room.hostinfo.start_lp) + ")" : ""), name: player.name + (settings.modules.http.show_ip && pass_validated && !player.is_local ? " (IP: " + player.ip.slice(7) + ")" : "") + (settings.modules.http.show_info && room.started && !(room.hostinfo.mode === 2 && player.pos > 1) ? " (Score:" + room.scores[player.name] + " LP:" + (player.lp != null ? player.lp : room.hostinfo.start_lp) + ")" : ""),
pos: player.pos pos: player.pos
}); });
} }
...@@ -2777,13 +2791,13 @@ ...@@ -2777,13 +2791,13 @@
fs.readFile(settings.modules.tournament_mode.replay_path + filename, function(error, buffer) { fs.readFile(settings.modules.tournament_mode.replay_path + filename, function(error, buffer) {
if (error) { if (error) {
response.writeHead(404); response.writeHead(404);
return response.end("未找到文件 " + filename); response.end("未找到文件 " + filename);
} else { } else {
response.writeHead(200, { response.writeHead(200, {
"Content-Type": "application/octet-stream", "Content-Type": "application/octet-stream",
"Content-Disposition": "attachment" "Content-Disposition": "attachment"
}); });
return response.end(buffer); response.end(buffer);
} }
}); });
} }
......
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