Commit 142b232a authored by nanahira's avatar nanahira

Merge branch 'mc'

parents 330cb6be 848207b6
...@@ -100,7 +100,7 @@ check_permission = (user, permission_required) -> ...@@ -100,7 +100,7 @@ check_permission = (user, permission_required) ->
return false return false
return permission[permission_required] return permission[permission_required]
@auth = (name, pass, permission_required, action = 'unknown') -> @auth = (name, pass, permission_required, action = 'unknown', no_log) ->
reload() reload()
user = users.users[name] user = users.users[name]
if !user if !user
...@@ -115,6 +115,7 @@ check_permission = (user, permission_required) -> ...@@ -115,6 +115,7 @@ check_permission = (user, permission_required) ->
if !check_permission(user, permission_required) if !check_permission(user, permission_required)
add_log("Permission denied. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action) add_log("Permission denied. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return false return false
if !no_log
add_log("Operation success. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action) add_log("Operation success. User: "+ name+", Permission needed: "+ permission_required+", Action: " +action)
return true return true
......
...@@ -122,7 +122,7 @@ or as follows, to use a specific set of permissions. ...@@ -122,7 +122,7 @@ or as follows, to use a specific set of permissions.
return permission[permission_required]; return permission[permission_required];
}; };
this.auth = function(name, pass, permission_required, action) { this.auth = function(name, pass, permission_required, action, no_log) {
var user; var user;
if (action == null) { if (action == null) {
action = 'unknown'; action = 'unknown';
...@@ -145,7 +145,9 @@ or as follows, to use a specific set of permissions. ...@@ -145,7 +145,9 @@ or as follows, to use a specific set of permissions.
add_log("Permission denied. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); add_log("Permission denied. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action);
return false; return false;
} }
if (!no_log) {
add_log("Operation success. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action); add_log("Operation success. User: " + name + ", Permission needed: " + permission_required + ", Action: " + action);
}
return true; return true;
}; };
......
...@@ -141,11 +141,15 @@ try ...@@ -141,11 +141,15 @@ try
catch e catch e
log.info e unless e.code == 'ENOENT' log.info e unless e.code == 'ENOENT'
setting_save = global.setting_save = (settings) -> setting_save = global.setting_save = (settings, callback) ->
fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2)) if !callback
callback = (err) ->
if(err)
log.warn("setting save fail", err.toString())
fs.writeFile(settings.file, JSON.stringify(settings, null, 2), callback)
return return
setting_change = global.setting_change = (settings, path, val) -> setting_change = global.setting_change = (settings, path, val, callback) ->
# path should be like "modules:welcome" # path should be like "modules:welcome"
log.info("setting changed", path, val) if _.isString(val) log.info("setting changed", path, val) if _.isString(val)
path=path.split(':') path=path.split(':')
...@@ -158,7 +162,7 @@ setting_change = global.setting_change = (settings, path, val) -> ...@@ -158,7 +162,7 @@ setting_change = global.setting_change = (settings, path, val) ->
target=target[key] target=target[key]
key = path.shift() key = path.shift()
target[key] = val target[key] = val
setting_save(settings) setting_save(settings, callback)
return return
VIP_generate_cdkeys = global.VIP_generate_cdkeys = (key_type, count) -> VIP_generate_cdkeys = global.VIP_generate_cdkeys = (key_type, count) ->
...@@ -558,20 +562,27 @@ ROOM_connected_ip = global.ROOM_connected_ip = {} ...@@ -558,20 +562,27 @@ ROOM_connected_ip = global.ROOM_connected_ip = {}
ROOM_bad_ip = global.ROOM_bad_ip = {} ROOM_bad_ip = global.ROOM_bad_ip = {}
# ban a user manually and permanently # ban a user manually and permanently
ban_user = global.ban_user = (name) -> ban_user = global.ban_user = (name, callback) ->
settings.ban.banned_user.push(name) settings.ban.banned_user.push(name)
setting_save(settings) setting_save(settings)
bad_ip=0 bad_ip = []
for room in ROOM_all when room and room.established _async.each(ROOM_all, (room, done)->
for player in room.players if !(room and room.established)
if player and (player.name == name or player.ip == bad_ip) done()
bad_ip = player.ip return
_async.each(["players", "watchers"], (player_type, _done)->
_async.each(room[player_type], (player, __done)->
if player and (player.name == name or bad_ip.indexOf(player.ip) != -1)
bad_ip.push(player.ip)
ROOM_bad_ip[bad_ip]=99 ROOM_bad_ip[bad_ip]=99
settings.ban.banned_ip.push(player.ip) settings.ban.banned_ip.push(player.ip)
ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
CLIENT_send_replays(player, room) CLIENT_send_replays(player, room)
CLIENT_kick(player) CLIENT_kick(player)
continue __done()
, _done)
, done)
, callback)
return return
# automatically ban user to use random duel # automatically ban user to use random duel
...@@ -592,6 +603,28 @@ ROOM_ban_player = global.ROOM_ban_player = (name, ip, reason, countadd = 1)-> ...@@ -592,6 +603,28 @@ ROOM_ban_player = global.ROOM_ban_player = (name, ip, reason, countadd = 1)->
#log.info("banned", name, ip, reason, bannedplayer.count) #log.info("banned", name, ip, reason, bannedplayer.count)
return return
ROOM_kick = (name, callback)->
found = false
_async.each(ROOM_all, (room, done)->
if !(room and room.established and (name == "all" or name == room.process_pid.toString() or name == room.name))
done()
return
found = true
if room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN
room.scores[room.dueling_players[0].name_vpass] = 0
room.scores[room.dueling_players[1].name_vpass] = 0
room.kicked = true
room.send_replays()
room.process.kill()
room.delete()
done()
return
, (err)->
callback(null, found)
return
)
ROOM_player_win = global.ROOM_player_win = (name)-> ROOM_player_win = global.ROOM_player_win = (name)->
if !ROOM_players_scores[name] if !ROOM_players_scores[name]
ROOM_players_scores[name]={win:0, lose:0, flee:0, combo:0} ROOM_players_scores[name]={win:0, lose:0, flee:0, combo:0}
...@@ -2520,7 +2553,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)-> ...@@ -2520,7 +2553,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
return return
# 登场台词 # 登场台词
load_words = global.load_words = () -> load_words = global.load_words = (callback) ->
request request
url: settings.modules.words.get url: settings.modules.words.get
json: true json: true
...@@ -2532,13 +2565,15 @@ load_words = global.load_words = () -> ...@@ -2532,13 +2565,15 @@ load_words = global.load_words = () ->
else else
setting_change(words, "words", body) setting_change(words, "words", body)
log.info "words loaded", _.size words.words log.info "words loaded", _.size words.words
if callback
callback(error, body)
return return
return return
if settings.modules.words.get if settings.modules.words.get
load_words() load_words()
load_dialogues = global.load_dialogues = () -> load_dialogues = global.load_dialogues = (callback) ->
request request
url: settings.modules.dialogues.get url: settings.modules.dialogues.get
json: true json: true
...@@ -2550,6 +2585,8 @@ load_dialogues = global.load_dialogues = () -> ...@@ -2550,6 +2585,8 @@ load_dialogues = global.load_dialogues = () ->
else else
setting_change(dialogues, "dialogues", body) setting_change(dialogues, "dialogues", body)
log.info "dialogues loaded", _.size dialogues.dialogues log.info "dialogues loaded", _.size dialogues.dialogues
if callback
callback(error, body)
return return
return return
...@@ -3026,7 +3063,7 @@ ygopro.stoc_send_random_tip_to_room = (room)-> ...@@ -3026,7 +3063,7 @@ ygopro.stoc_send_random_tip_to_room = (room)->
ygopro.stoc_send_random_tip(player) ygopro.stoc_send_random_tip(player)
return return
load_tips = global.load_tips = ()-> load_tips = global.load_tips = (callback)->
request request
url: settings.modules.tips.get url: settings.modules.tips.get
json: true json: true
...@@ -3038,10 +3075,12 @@ load_tips = global.load_tips = ()-> ...@@ -3038,10 +3075,12 @@ load_tips = global.load_tips = ()->
else else
setting_change(tips, "tips", body) setting_change(tips, "tips", body)
log.info "tips loaded", tips.tips.length log.info "tips loaded", tips.tips.length
if callback
callback(error, body)
return return
return return
load_tips_zh = global.load_tips_zh = ()-> load_tips_zh = global.load_tips_zh = (callback)->
request request
url: settings.modules.tips.get_zh url: settings.modules.tips.get_zh
json: true json: true
...@@ -3053,6 +3092,8 @@ load_tips_zh = global.load_tips_zh = ()-> ...@@ -3053,6 +3092,8 @@ load_tips_zh = global.load_tips_zh = ()->
else else
setting_change(tips, "tips_zh", body) setting_change(tips, "tips_zh", body)
log.info "zh tips loaded", tips.tips_zh.length log.info "zh tips loaded", tips.tips_zh.length
if callback
callback(error, body)
return return
return return
...@@ -3745,9 +3786,10 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)-> ...@@ -3745,9 +3786,10 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)->
if settings.modules.random_duel.enabled if settings.modules.random_duel.enabled
setInterval ()-> setInterval ()->
_async.each(ROOM_all.filter((room) -> _async.each(ROOM_all, (room, done) ->
return room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.random_type and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING) if !(room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.random_type and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING))
), (room, done) -> done()
return
time_passed = Math.floor((moment() - room.last_active_time) / 1000) time_passed = Math.floor((moment() - room.last_active_time) / 1000)
#log.info time_passed #log.info time_passed
if time_passed >= settings.modules.random_duel.hang_timeout if time_passed >= settings.modules.random_duel.hang_timeout
...@@ -3761,15 +3803,18 @@ if settings.modules.random_duel.enabled ...@@ -3761,15 +3803,18 @@ if settings.modules.random_duel.enabled
else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10) else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10)
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED)
ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}") ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}")
done()
return
) )
return return
, 1000 , 1000
if settings.modules.mycard.enabled if settings.modules.mycard.enabled
setInterval ()-> setInterval ()->
_async.each(ROOM_all.filter((room) -> _async.each(ROOM_all, (room, done) ->
return room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.arena and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING) if not (room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.arena and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING))
), (room, done) -> done()
return
time_passed = Math.floor((moment() - room.last_active_time) / 1000) time_passed = Math.floor((moment() - room.last_active_time) / 1000)
#log.info time_passed #log.info time_passed
if time_passed >= settings.modules.random_duel.hang_timeout if time_passed >= settings.modules.random_duel.hang_timeout
...@@ -3786,9 +3831,10 @@ if settings.modules.mycard.enabled ...@@ -3786,9 +3831,10 @@ if settings.modules.mycard.enabled
) )
if settings.modules.arena_mode.punish_quit_before_match if settings.modules.arena_mode.punish_quit_before_match
async.each(ROOM_all.filter((room) -> _async.each(ROOM_all, (room, done) ->
return room and room.arena and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.get_playing_player().length < 2 if not (room and room.arena and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.get_playing_player().length < 2)
), (room, done) -> done()
return
player = room.get_playing_player()[0] player = room.get_playing_player()[0]
if player and player.join_time and !player.arena_quit_free if player and player.join_time and !player.arena_quit_free
waited_time = moment() - player.join_time waited_time = moment() - player.join_time
...@@ -3805,17 +3851,25 @@ if settings.modules.mycard.enabled ...@@ -3805,17 +3851,25 @@ if settings.modules.mycard.enabled
if settings.modules.heartbeat_detection.enabled if settings.modules.heartbeat_detection.enabled
setInterval ()-> setInterval ()->
for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and (room.hostinfo.time_limit == 0 or room.duel_stage != ygopro.constants.DUEL_STAGE.DUELING) and !room.windbot _async.each ROOM_all, (room, done)->
for player in room.get_playing_player() when player and (room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING or player.selected_preduel) if room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and (room.hostinfo.time_limit == 0 or room.duel_stage != ygopro.constants.DUEL_STAGE.DUELING) and !room.windbot
_async.each(room.get_playing_player(), (player, _done)->
if player and (room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING or player.selected_preduel)
CLIENT_heartbeat_register(player, true) CLIENT_heartbeat_register(player, true)
_done()
, done)
else
done()
return return
, settings.modules.heartbeat_detection.interval , settings.modules.heartbeat_detection.interval
setInterval ()-> setInterval ()->
current_time = moment() current_time = moment()
for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.hostinfo.auto_death and !room.auto_death_triggered and current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death _async.each ROOM_all, (room, done)->
if room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.hostinfo.auto_death and !room.auto_death_triggered and current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death
room.auto_death_triggered = true room.auto_death_triggered = true
room.start_death() room.start_death()
done()
, 1000 , 1000
...@@ -3835,13 +3889,13 @@ spawn_windbot = global.spawn_windbot = () -> ...@@ -3835,13 +3889,13 @@ spawn_windbot = global.spawn_windbot = () ->
windbot_process = spawn windbot_bin, windbot_parameters, {cwd: 'windbot'} windbot_process = spawn windbot_bin, windbot_parameters, {cwd: 'windbot'}
windbot_process.on 'error', (err)-> windbot_process.on 'error', (err)->
log.warn 'WindBot ERROR', err log.warn 'WindBot ERROR', err
if windbot_looplimit < 1000 and !rebooted if windbot_looplimit < 1000 and !global.rebooted
windbot_looplimit++ windbot_looplimit++
spawn_windbot() spawn_windbot()
return return
windbot_process.on 'exit', (code)-> windbot_process.on 'exit', (code)->
log.warn 'WindBot EXIT', code log.warn 'WindBot EXIT', code
if windbot_looplimit < 1000 and !rebooted if windbot_looplimit < 1000 and !global.rebooted
windbot_looplimit++ windbot_looplimit++
spawn_windbot() spawn_windbot()
return return
...@@ -3858,7 +3912,7 @@ spawn_windbot = global.spawn_windbot = () -> ...@@ -3858,7 +3912,7 @@ spawn_windbot = global.spawn_windbot = () ->
if settings.modules.windbot.enabled and settings.modules.windbot.spawn if settings.modules.windbot.enabled and settings.modules.windbot.spawn
spawn_windbot() spawn_windbot()
rebooted = false global.rebooted = false
#http #http
if settings.modules.http if settings.modules.http
...@@ -3873,13 +3927,17 @@ if settings.modules.http ...@@ -3873,13 +3927,17 @@ if settings.modules.http
#console.log(u.query.username, u.query.pass) #console.log(u.query.username, u.query.pass)
if u.pathname == '/api/getrooms' if u.pathname == '/api/getrooms'
pass_validated = auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms") pass_validated = auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms", true)
if !settings.modules.http.public_roomlist and !pass_validated if !settings.modules.http.public_roomlist and !pass_validated
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}')) response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}'))
else else
response.writeHead(200) roomsjson = [];
roomsjson = JSON.stringify rooms: (for room in ROOM_all when room and room.established _async.each(ROOM_all, (room, done)->
if !(room and room.established)
done()
return
roomsjson.push({
roomid: room.process_pid.toString(), roomid: room.process_pid.toString(),
roomname: if pass_validated then room.name else room.name.split('$', 2)[0], roomname: if pass_validated then room.name else room.name.split('$', 2)[0],
roommode: room.hostinfo.mode, roommode: room.hostinfo.mode,
...@@ -3896,8 +3954,13 @@ if settings.modules.http ...@@ -3896,8 +3954,13 @@ if settings.modules.http
pos: player.pos pos: player.pos
), "pos"), ), "pos"),
istart: if room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN then (if settings.modules.http.show_info then ("Duel:" + room.duel_count + " " + (if room.duel_stage == ygopro.constants.DUEL_STAGE.SIDING 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.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN then (if settings.modules.http.show_info then ("Duel:" + room.duel_count + " " + (if room.duel_stage == ygopro.constants.DUEL_STAGE.SIDING 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'
), null, 2 })
response.end(addCallback(u.query.callback, roomsjson)) done()
, ()->
response.writeHead(200)
response.end(addCallback(u.query.callback, JSON.stringify({rooms: roomsjson})))
)
else if u.pathname == '/api/duellog' and settings.modules.tournament_mode.enabled else if u.pathname == '/api/duellog' and settings.modules.tournament_mode.enabled
if !auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log") if !auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log")
...@@ -4032,18 +4095,26 @@ if settings.modules.http ...@@ -4032,18 +4095,26 @@ if settings.modules.http
return return
if u.query.stop == 'false' if u.query.stop == 'false'
u.query.stop = false u.query.stop = false
setting_change(settings, 'modules:stop', u.query.stop) setting_change(settings, 'modules:stop', u.query.stop, (err)->
response.writeHead(200) response.writeHead(200)
if(err)
response.end(addCallback(u.query.callback, "['stop fail', '" + u.query.stop + "']"))
else
response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']")) response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']"))
)
else if u.query.welcome else if u.query.welcome
if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome") if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
setting_change(settings, 'modules:welcome', u.query.welcome) setting_change(settings, 'modules:welcome', (err)->
response.writeHead(200) response.writeHead(200)
if(err)
response.end(addCallback(u.query.callback, "['welcome fail', '" + u.query.welcome + "']"))
else
response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']")) response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']"))
)
else if u.query.getwelcome else if u.query.getwelcome
if !auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome") if !auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome")
...@@ -4058,57 +4129,61 @@ if settings.modules.http ...@@ -4058,57 +4129,61 @@ if settings.modules.http
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
load_tips() _async.auto({
if settings.modules.tips.get_zh tips: load_tips,
load_tips_zh() tips_zh: load_tips_zh
}, (err)->
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['loading tip', '" + settings.modules.tips.get + (if settings.modules.tips.get_zh then " and " + settings.modules.tips.get_zh else "") + "']")) if(err)
response.end(addCallback(u.query.callback, "['tip fail', '" + settings.modules.tips.get + "']"))
else
response.end(addCallback(u.query.callback, "['tip ok', '" + settings.modules.tips.get + "']"))
)
else if u.query.loaddialogues else if u.query.loaddialogues
if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues") if !auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
load_dialogues() _async.auto({
if settings.modules.dialogues.get_custom dialogues: load_dialogues,
load_dialogues_custom() dialogues_custom: load_dialogues_custom
response.writeHead(200) }, (err)->
response.end(addCallback(u.query.callback, "['loading dialogues', '" + settings.modules.dialogues.get + (if settings.modules.dialogues.get_custom then " and " + settings.modules.dialogues.get_custom else "") + "']"))
else if u.query.loadwords
load_words()
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['loading words', '" + settings.modules.words.get + "']")) if(err)
response.end(addCallback(u.query.callback, "['dialogues fail', '" + settings.modules.dialogues.get + "']"))
else
response.end(addCallback(u.query.callback, "['dialogues ok', '" + settings.modules.dialogues.get + "']"))
)
else if u.query.ban else if u.query.ban
if !auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user") if !auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
ban_user(u.query.ban) ban_user(u.query.ban, (err)->
response.writeHead(200) response.writeHead(200)
if(err)
response.end(addCallback(u.query.callback, "['ban fail', '" + u.query.ban + "']"))
else
response.end(addCallback(u.query.callback, "['ban ok', '" + u.query.ban + "']")) response.end(addCallback(u.query.callback, "['ban ok', '" + u.query.ban + "']"))
)
else if u.query.kick else if u.query.kick
if !auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user") if !auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
kick_room_found = false ROOM_kick(u.query.kick, (err, found)->
for room in ROOM_all when room and room.established and (u.query.kick == "all" or u.query.kick == room.process_pid.toString() or u.query.kick == room.name)
kick_room_found = true
if room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN
room.scores[room.dueling_players[0].name_vpass] = 0
room.scores[room.dueling_players[1].name_vpass] = 0
room.kicked = true
room.send_replays()
room.process.kill()
room.delete()
response.writeHead(200) response.writeHead(200)
if kick_room_found if err
response.end(addCallback(u.query.callback, "['kick fail', '" + u.query.kick + "']"))
else if found
response.end(addCallback(u.query.callback, "['kick ok', '" + u.query.kick + "']")) response.end(addCallback(u.query.callback, "['kick ok', '" + u.query.kick + "']"))
else else
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.kick + "']")) response.end(addCallback(u.query.callback, "['room not found', '" + u.query.kick + "']"))
)
else if u.query.death else if u.query.death
if !auth.auth(u.query.username, u.query.pass, "start_death", "start_death") if !auth.auth(u.query.username, u.query.pass, "start_death", "start_death")
...@@ -4116,14 +4191,21 @@ if settings.modules.http ...@@ -4116,14 +4191,21 @@ if settings.modules.http
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
death_room_found = false death_room_found = false
for room in ROOM_all when room and (u.query.death == "all" or u.query.death == room.process_pid.toString() or u.query.death == room.name) _async.each(ROOM_all, (room, done)->
if !(room and (u.query.death == "all" or u.query.death == room.process_pid.toString() or u.query.death == room.name))
done()
return
if room.start_death() if room.start_death()
death_room_found = true death_room_found = true
done()
return
, () ->
response.writeHead(200) response.writeHead(200)
if death_room_found if death_room_found
response.end(addCallback(u.query.callback, "['death ok', '" + u.query.death + "']")) response.end(addCallback(u.query.callback, "['death ok', '" + u.query.death + "']"))
else else
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.death + "']")) response.end(addCallback(u.query.callback, "['room not found', '" + u.query.death + "']"))
)
else if u.query.deathcancel else if u.query.deathcancel
if !auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death") if !auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death")
...@@ -4131,34 +4213,35 @@ if settings.modules.http ...@@ -4131,34 +4213,35 @@ if settings.modules.http
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
death_room_found = false death_room_found = false
for room in ROOM_all when room and (u.query.deathcancel == "all" or u.query.deathcancel == room.process_pid.toString() or u.query.deathcancel == room.name) _async.each(rooms, (room, done)->
if !(room and (u.query.deathcancel == "all" or u.query.deathcancel == room.process_pid.toString() or u.query.deathcancel == room.name))
done()
return
if room.cancel_death() if room.cancel_death()
death_room_found = true death_room_found = true
done()
, () ->
response.writeHead(200) response.writeHead(200)
if death_room_found if death_room_found
response.end(addCallback(u.query.callback, "['death cancel ok', '" + u.query.deathcancel + "']")) response.end(addCallback(u.query.callback, "['death cancel ok', '" + u.query.deathcancel + "']"))
else else
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']")) response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']"))
)
else if u.query.reboot else if u.query.reboot
if !auth.auth(u.query.username, u.query.pass, "stop", "reboot") if !auth.auth(u.query.username, u.query.pass, "stop", "reboot")
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['密码错误', 0]")) response.end(addCallback(u.query.callback, "['密码错误', 0]"))
return return
for room in ROOM_all when room ROOM_kick("all", (err, found)->
if room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN global.rebooted = true
room.scores[room.dueling_players[0].name_vpass] = 0
room.scores[room.dueling_players[1].name_vpass] = 0
room.kicked = true
room.send_replays()
room.process.kill()
room.delete()
rebooted = true
if windbot_process if windbot_process
windbot_process.kill() windbot_process.kill()
response.writeHead(200) response.writeHead(200)
response.end(addCallback(u.query.callback, "['reboot ok', '" + u.query.reboot + "']")) response.end(addCallback(u.query.callback, "['reboot ok', '" + u.query.reboot + "']"))
throw "rebooted" process.exit()
)
else if u.query.generatekey and settings.modules.vip.enabled else if u.query.generatekey and settings.modules.vip.enabled
if !auth.auth(u.query.username, u.query.pass, "vip", "generate_keys") if !auth.auth(u.query.username, u.query.pass, "vip", "generate_keys")
......
// Generated by CoffeeScript 1.12.7 // Generated by CoffeeScript 1.12.7
(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, Cloud_replay_ids, 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_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, _, _async, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, deck_name_match, default_config, default_data, dialogues, disconnect_list, dns, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, m, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, real_windbot_server_ip, rebooted, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, v, 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_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, Cloud_replay_ids, 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_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, VIP_generate_cdkeys, _, _async, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, deck_name_match, default_config, default_data, dialogues, disconnect_list, dns, duel_log, e, exec, execFile, fs, geoip, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_requesting, j, k, l, len, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, m, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, real_windbot_server_ip, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, v, vip_info, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, words, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -139,11 +139,18 @@ ...@@ -139,11 +139,18 @@
} }
} }
setting_save = global.setting_save = function(settings) { setting_save = global.setting_save = function(settings, callback) {
fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2)); if (!callback) {
callback = function(err) {
if (err) {
return log.warn("setting save fail", err.toString());
}
};
}
fs.writeFile(settings.file, JSON.stringify(settings, null, 2), callback);
}; };
setting_change = global.setting_change = function(settings, path, val) { setting_change = global.setting_change = function(settings, path, val, callback) {
var key, target; var key, target;
if (_.isString(val)) { if (_.isString(val)) {
log.info("setting changed", path, val); log.info("setting changed", path, val);
...@@ -160,7 +167,7 @@ ...@@ -160,7 +167,7 @@
key = path.shift(); key = path.shift();
target[key] = val; target[key] = val;
} }
setting_save(settings); setting_save(settings, callback);
}; };
VIP_generate_cdkeys = global.VIP_generate_cdkeys = function(key_type, count) { VIP_generate_cdkeys = global.VIP_generate_cdkeys = function(key_type, count) {
...@@ -685,29 +692,30 @@ ...@@ -685,29 +692,30 @@
ROOM_bad_ip = global.ROOM_bad_ip = {}; ROOM_bad_ip = global.ROOM_bad_ip = {};
ban_user = global.ban_user = function(name) { ban_user = global.ban_user = function(name, callback) {
var bad_ip, len2, len3, m, n, player, ref3, room; var bad_ip;
settings.ban.banned_user.push(name); settings.ban.banned_user.push(name);
setting_save(settings); setting_save(settings);
bad_ip = 0; bad_ip = [];
for (m = 0, len2 = ROOM_all.length; m < len2; m++) { _async.each(ROOM_all, function(room, done) {
room = ROOM_all[m]; if (!(room && room.established)) {
if (room && room.established) { done();
ref3 = room.players; return;
for (n = 0, len3 = ref3.length; n < len3; n++) { }
player = ref3[n]; return _async.each(["players", "watchers"], function(player_type, _done) {
if (player && (player.name === name || player.ip === bad_ip)) { return _async.each(room[player_type], function(player, __done) {
bad_ip = player.ip; if (player && (player.name === name || bad_ip.indexOf(player.ip) !== -1)) {
bad_ip.push(player.ip);
ROOM_bad_ip[bad_ip] = 99; ROOM_bad_ip[bad_ip] = 99;
settings.ban.banned_ip.push(player.ip); settings.ban.banned_ip.push(player.ip);
ygopro.stoc_send_chat_to_room(room, player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED);
CLIENT_send_replays(player, room); CLIENT_send_replays(player, room);
CLIENT_kick(player); CLIENT_kick(player);
continue;
}
}
}
} }
return __done();
}, _done);
}, done);
}, callback);
}; };
ROOM_ban_player = global.ROOM_ban_player = function(name, ip, reason, countadd) { ROOM_ban_player = global.ROOM_ban_player = function(name, ip, reason, countadd) {
...@@ -743,6 +751,29 @@ ...@@ -743,6 +751,29 @@
} }
}; };
ROOM_kick = function(name, callback) {
var found;
found = false;
return _async.each(ROOM_all, function(room, done) {
if (!(room && room.established && (name === "all" || name === room.process_pid.toString() || name === room.name))) {
done();
return;
}
found = true;
if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
room.scores[room.dueling_players[0].name_vpass] = 0;
room.scores[room.dueling_players[1].name_vpass] = 0;
}
room.kicked = true;
room.send_replays();
room.process.kill();
room["delete"]();
done();
}, function(err) {
callback(null, found);
});
};
ROOM_player_win = global.ROOM_player_win = function(name) { ROOM_player_win = global.ROOM_player_win = function(name) {
if (!ROOM_players_scores[name]) { if (!ROOM_players_scores[name]) {
ROOM_players_scores[name] = { ROOM_players_scores[name] = {
...@@ -3177,7 +3208,7 @@ ...@@ -3177,7 +3208,7 @@
} }
}); });
load_words = global.load_words = function() { load_words = global.load_words = function(callback) {
request({ request({
url: settings.modules.words.get, url: settings.modules.words.get,
json: true json: true
...@@ -3190,6 +3221,9 @@ ...@@ -3190,6 +3221,9 @@
setting_change(words, "words", body); setting_change(words, "words", body);
log.info("words loaded", _.size(words.words)); log.info("words loaded", _.size(words.words));
} }
if (callback) {
callback(error, body);
}
}); });
}; };
...@@ -3197,7 +3231,7 @@ ...@@ -3197,7 +3231,7 @@
load_words(); load_words();
} }
load_dialogues = global.load_dialogues = function() { load_dialogues = global.load_dialogues = function(callback) {
request({ request({
url: settings.modules.dialogues.get, url: settings.modules.dialogues.get,
json: true json: true
...@@ -3210,6 +3244,9 @@ ...@@ -3210,6 +3244,9 @@
setting_change(dialogues, "dialogues", body); setting_change(dialogues, "dialogues", body);
log.info("dialogues loaded", _.size(dialogues.dialogues)); log.info("dialogues loaded", _.size(dialogues.dialogues));
} }
if (callback) {
callback(error, body);
}
}); });
}; };
...@@ -3886,7 +3923,7 @@ ...@@ -3886,7 +3923,7 @@
} }
}; };
load_tips = global.load_tips = function() { load_tips = global.load_tips = function(callback) {
request({ request({
url: settings.modules.tips.get, url: settings.modules.tips.get,
json: true json: true
...@@ -3899,10 +3936,13 @@ ...@@ -3899,10 +3936,13 @@
setting_change(tips, "tips", body); setting_change(tips, "tips", body);
log.info("tips loaded", tips.tips.length); log.info("tips loaded", tips.tips.length);
} }
if (callback) {
callback(error, body);
}
}); });
}; };
load_tips_zh = global.load_tips_zh = function() { load_tips_zh = global.load_tips_zh = function(callback) {
request({ request({
url: settings.modules.tips.get_zh, url: settings.modules.tips.get_zh,
json: true json: true
...@@ -3915,6 +3955,9 @@ ...@@ -3915,6 +3955,9 @@
setting_change(tips, "tips_zh", body); setting_change(tips, "tips_zh", body);
log.info("zh tips loaded", tips.tips_zh.length); log.info("zh tips loaded", tips.tips_zh.length);
} }
if (callback) {
callback(error, body);
}
}); });
}; };
...@@ -4874,10 +4917,12 @@ ...@@ -4874,10 +4917,12 @@
if (settings.modules.random_duel.enabled) { if (settings.modules.random_duel.enabled) {
setInterval(function() { setInterval(function() {
_async.each(ROOM_all.filter(function(room) { _async.each(ROOM_all, function(room, done) {
return room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.random_type && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING);
}), function(room, done) {
var time_passed; var time_passed;
if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.random_type && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING))) {
done();
return;
}
time_passed = Math.floor((moment() - room.last_active_time) / 1000); time_passed = Math.floor((moment() - room.last_active_time) / 1000);
if (time_passed >= settings.modules.random_duel.hang_timeout) { if (time_passed >= settings.modules.random_duel.hang_timeout) {
room.last_active_time = moment(); room.last_active_time = moment();
...@@ -4885,21 +4930,24 @@ ...@@ -4885,21 +4930,24 @@
room.scores[room.waiting_for_player.name_vpass] = -9; room.scores[room.waiting_for_player.name_vpass] = -9;
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${kicked_by_system}", ygopro.constants.COLORS.RED);
CLIENT_send_replays(room.waiting_for_player, room); CLIENT_send_replays(room.waiting_for_player, room);
return CLIENT_kick(room.waiting_for_player); CLIENT_kick(room.waiting_for_player);
} else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) { } else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) {
ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${afk_warn_part1}" + (settings.modules.random_duel.hang_timeout - time_passed) + "${afk_warn_part2}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, room.waiting_for_player.name + " ${afk_warn_part1}" + (settings.modules.random_duel.hang_timeout - time_passed) + "${afk_warn_part2}", ygopro.constants.COLORS.RED);
return ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}"); ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}");
} }
done();
}); });
}, 1000); }, 1000);
} }
if (settings.modules.mycard.enabled) { if (settings.modules.mycard.enabled) {
setInterval(function() { setInterval(function() {
_async.each(ROOM_all.filter(function(room) { _async.each(ROOM_all, function(room, done) {
return room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.arena && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING);
}), function(room, done) {
var time_passed; var time_passed;
if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.arena && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING))) {
done();
return;
}
time_passed = Math.floor((moment() - room.last_active_time) / 1000); time_passed = Math.floor((moment() - room.last_active_time) / 1000);
if (time_passed >= settings.modules.random_duel.hang_timeout) { if (time_passed >= settings.modules.random_duel.hang_timeout) {
room.last_active_time = moment(); room.last_active_time = moment();
...@@ -4913,10 +4961,12 @@ ...@@ -4913,10 +4961,12 @@
done(); done();
}); });
if (settings.modules.arena_mode.punish_quit_before_match) { if (settings.modules.arena_mode.punish_quit_before_match) {
async.each(ROOM_all.filter(function(room) { _async.each(ROOM_all, function(room, done) {
return room && room.arena && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.get_playing_player().length < 2;
}), function(room, done) {
var player, waited_time; var player, waited_time;
if (!(room && room.arena && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.get_playing_player().length < 2)) {
done();
return;
}
player = room.get_playing_player()[0]; player = room.get_playing_player()[0];
if (player && player.join_time && !player.arena_quit_free) { if (player && player.join_time && !player.arena_quit_free) {
waited_time = moment() - player.join_time; waited_time = moment() - player.join_time;
...@@ -4935,35 +4985,31 @@ ...@@ -4935,35 +4985,31 @@
if (settings.modules.heartbeat_detection.enabled) { if (settings.modules.heartbeat_detection.enabled) {
setInterval(function() { setInterval(function() {
var len2, len3, m, n, player, ref3, room; _async.each(ROOM_all, function(room, done) {
for (m = 0, len2 = ROOM_all.length; m < len2; m++) {
room = ROOM_all[m];
if (room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && (room.hostinfo.time_limit === 0 || room.duel_stage !== ygopro.constants.DUEL_STAGE.DUELING) && !room.windbot) { if (room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && (room.hostinfo.time_limit === 0 || room.duel_stage !== ygopro.constants.DUEL_STAGE.DUELING) && !room.windbot) {
ref3 = room.get_playing_player(); return _async.each(room.get_playing_player(), function(player, _done) {
for (n = 0, len3 = ref3.length; n < len3; n++) {
player = ref3[n];
if (player && (room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING || player.selected_preduel)) { if (player && (room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING || player.selected_preduel)) {
CLIENT_heartbeat_register(player, true); CLIENT_heartbeat_register(player, true);
} }
return _done();
}, done);
} else {
return done();
} }
} });
}
}, settings.modules.heartbeat_detection.interval); }, settings.modules.heartbeat_detection.interval);
} }
setInterval(function() { setInterval(function() {
var current_time, len2, m, results, room; var current_time;
current_time = moment(); current_time = moment();
results = []; return _async.each(ROOM_all, function(room, done) {
for (m = 0, len2 = ROOM_all.length; m < len2; m++) { if (room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.hostinfo.auto_death && !room.auto_death_triggered && current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death) {
room = ROOM_all[m];
if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.hostinfo.auto_death && !room.auto_death_triggered && current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death)) {
continue;
}
room.auto_death_triggered = true; room.auto_death_triggered = true;
results.push(room.start_death()); room.start_death();
} }
return results; return done();
});
}, 1000); }, 1000);
windbot_looplimit = 0; windbot_looplimit = 0;
...@@ -4986,14 +5032,14 @@ ...@@ -4986,14 +5032,14 @@
}); });
windbot_process.on('error', function(err) { windbot_process.on('error', function(err) {
log.warn('WindBot ERROR', err); log.warn('WindBot ERROR', err);
if (windbot_looplimit < 1000 && !rebooted) { if (windbot_looplimit < 1000 && !global.rebooted) {
windbot_looplimit++; windbot_looplimit++;
spawn_windbot(); spawn_windbot();
} }
}); });
windbot_process.on('exit', function(code) { windbot_process.on('exit', function(code) {
log.warn('WindBot EXIT', code); log.warn('WindBot EXIT', code);
if (windbot_looplimit < 1000 && !rebooted) { if (windbot_looplimit < 1000 && !global.rebooted) {
windbot_looplimit++; windbot_looplimit++;
spawn_windbot(); spawn_windbot();
} }
...@@ -5012,7 +5058,7 @@ ...@@ -5012,7 +5058,7 @@
spawn_windbot(); spawn_windbot();
} }
rebooted = false; global.rebooted = false;
if (settings.modules.http) { if (settings.modules.http) {
addCallback = function(callback, text) { addCallback = function(callback, text) {
...@@ -5022,36 +5068,35 @@ ...@@ -5022,36 +5068,35 @@
return callback + "( " + text + " );"; return callback + "( " + text + " );";
}; };
requestListener = function(request, response) { requestListener = function(request, response) {
var archive_args, archive_name, archive_process, check, death_room_found, duellog, error, filename, getpath, key, kick_room_found, len2, len3, len4, len5, len6, len7, len8, m, n, o, p, parseQueryString, pass_validated, player, q, r, ref3, ref4, replay, ret_keys, room, roomsjson, s, u; var archive_args, archive_name, archive_process, check, death_room_found, duellog, error, filename, getpath, key, len2, len3, len4, m, n, o, parseQueryString, pass_validated, ref3, ref4, replay, ret_keys, room, roomsjson, u;
parseQueryString = true; parseQueryString = true;
u = url.parse(request.url, parseQueryString); u = url.parse(request.url, parseQueryString);
if (u.pathname === '/api/getrooms') { if (u.pathname === '/api/getrooms') {
pass_validated = auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms"); pass_validated = auth.auth(u.query.username, u.query.pass, "get_rooms", "get_rooms", true);
if (!settings.modules.http.public_roomlist && !pass_validated) { if (!settings.modules.http.public_roomlist && !pass_validated) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}')); response.end(addCallback(u.query.callback, '{"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]}'));
} else { } else {
response.writeHead(200); roomsjson = [];
roomsjson = JSON.stringify({ _async.each(ROOM_all, function(room, done) {
rooms: (function() { var player;
var len2, m, results; if (!(room && room.established)) {
results = []; done();
for (m = 0, len2 = ROOM_all.length; m < len2; m++) { return;
room = ROOM_all[m]; }
if (room && room.established) { roomsjson.push({
results.push({
roomid: room.process_pid.toString(), roomid: room.process_pid.toString(),
roomname: pass_validated ? room.name : room.name.split('$', 2)[0], roomname: pass_validated ? room.name : room.name.split('$', 2)[0],
roommode: room.hostinfo.mode, roommode: room.hostinfo.mode,
needpass: (room.name.indexOf('$') !== -1).toString(), needpass: (room.name.indexOf('$') !== -1).toString(),
users: _.sortBy((function() { users: _.sortBy((function() {
var len3, n, ref3, results1; var len2, m, ref3, results;
ref3 = room.players; ref3 = room.players;
results1 = []; results = [];
for (n = 0, len3 = ref3.length; n < len3; n++) { for (m = 0, len2 = ref3.length; m < len2; m++) {
player = ref3[n]; player = ref3[m];
if (player.pos != null) { if (player.pos != null) {
results1.push({ results.push({
id: (-1).toString(), id: (-1).toString(),
name: player.name, name: player.name,
ip: settings.modules.http.show_ip && pass_validated && !player.is_local ? player.ip.slice(7) : null, ip: settings.modules.http.show_ip && pass_validated && !player.is_local ? player.ip.slice(7) : null,
...@@ -5064,16 +5109,17 @@ ...@@ -5064,16 +5109,17 @@
}); });
} }
} }
return results1; return results;
})(), "pos"), })(), "pos"),
istart: room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN ? (settings.modules.http.show_info ? "Duel:" + room.duel_count + " " + (room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING ? "Siding" : "Turn:" + (room.turn != null ? room.turn : 0) + (room.death ? "/" + (room.death > 0 ? room.death - 1 : "Death") : "")) : 'start') : 'wait' istart: room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN ? (settings.modules.http.show_info ? "Duel:" + room.duel_count + " " + (room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING ? "Siding" : "Turn:" + (room.turn != null ? room.turn : 0) + (room.death ? "/" + (room.death > 0 ? room.death - 1 : "Death") : "")) : 'start') : 'wait'
}); });
} return done();
} }, function() {
return results; response.writeHead(200);
})() return response.end(addCallback(u.query.callback, JSON.stringify({
}, null, 2); rooms: roomsjson
response.end(addCallback(u.query.callback, roomsjson)); })));
});
} }
} else if (u.pathname === '/api/duellog' && settings.modules.tournament_mode.enabled) { } else if (u.pathname === '/api/duellog' && settings.modules.tournament_mode.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log")) { if (!auth.auth(u.query.username, u.query.pass, "duel_log", "duel_log")) {
...@@ -5239,18 +5285,28 @@ ...@@ -5239,18 +5285,28 @@
if (u.query.stop === 'false') { if (u.query.stop === 'false') {
u.query.stop = false; u.query.stop = false;
} }
setting_change(settings, 'modules:stop', u.query.stop); setting_change(settings, 'modules:stop', u.query.stop, function(err) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']")); if (err) {
return response.end(addCallback(u.query.callback, "['stop fail', '" + u.query.stop + "']"));
} else {
return response.end(addCallback(u.query.callback, "['stop ok', '" + u.query.stop + "']"));
}
});
} else if (u.query.welcome) { } else if (u.query.welcome) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome")) { if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_welcome")) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
setting_change(settings, 'modules:welcome', u.query.welcome); setting_change(settings, 'modules:welcome', function(err) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']")); if (err) {
return response.end(addCallback(u.query.callback, "['welcome fail', '" + u.query.welcome + "']"));
} else {
return response.end(addCallback(u.query.callback, "['welcome ok', '" + u.query.welcome + "']"));
}
});
} else if (u.query.getwelcome) { } else if (u.query.getwelcome) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome")) { if (!auth.auth(u.query.username, u.query.pass, "change_settings", "get_welcome")) {
response.writeHead(200); response.writeHead(200);
...@@ -5265,65 +5321,64 @@ ...@@ -5265,65 +5321,64 @@
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
load_tips(); _async.auto({
if (settings.modules.tips.get_zh) { tips: load_tips,
load_tips_zh(); tips_zh: load_tips_zh
} }, function(err) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['loading tip', '" + settings.modules.tips.get + (settings.modules.tips.get_zh ? " and " + settings.modules.tips.get_zh : "") + "']")); if (err) {
return response.end(addCallback(u.query.callback, "['tip fail', '" + settings.modules.tips.get + "']"));
} else {
return response.end(addCallback(u.query.callback, "['tip ok', '" + settings.modules.tips.get + "']"));
}
});
} else if (u.query.loaddialogues) { } else if (u.query.loaddialogues) {
if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues")) { if (!auth.auth(u.query.username, u.query.pass, "change_settings", "change_dialogues")) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
load_dialogues(); _async.auto({
if (settings.modules.dialogues.get_custom) { dialogues: load_dialogues,
load_dialogues_custom(); dialogues_custom: load_dialogues_custom
} }, function(err) {
response.writeHead(200);
response.end(addCallback(u.query.callback, "['loading dialogues', '" + settings.modules.dialogues.get + (settings.modules.dialogues.get_custom ? " and " + settings.modules.dialogues.get_custom : "") + "']"));
} else if (u.query.loadwords) {
load_words();
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['loading words', '" + settings.modules.words.get + "']")); if (err) {
return response.end(addCallback(u.query.callback, "['dialogues fail', '" + settings.modules.dialogues.get + "']"));
} else {
return response.end(addCallback(u.query.callback, "['dialogues ok', '" + settings.modules.dialogues.get + "']"));
}
});
} else if (u.query.ban) { } else if (u.query.ban) {
if (!auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user")) { if (!auth.auth(u.query.username, u.query.pass, "ban_user", "ban_user")) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
ban_user(u.query.ban); ban_user(u.query.ban, function(err) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['ban ok', '" + u.query.ban + "']")); if (err) {
return response.end(addCallback(u.query.callback, "['ban fail', '" + u.query.ban + "']"));
} else {
return response.end(addCallback(u.query.callback, "['ban ok', '" + u.query.ban + "']"));
}
});
} else if (u.query.kick) { } else if (u.query.kick) {
if (!auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user")) { if (!auth.auth(u.query.username, u.query.pass, "kick_user", "kick_user")) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
kick_room_found = false; ROOM_kick(u.query.kick, function(err, found) {
for (p = 0, len5 = ROOM_all.length; p < len5; p++) {
room = ROOM_all[p];
if (!(room && room.established && (u.query.kick === "all" || u.query.kick === room.process_pid.toString() || u.query.kick === room.name))) {
continue;
}
kick_room_found = true;
if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
room.scores[room.dueling_players[0].name_vpass] = 0;
room.scores[room.dueling_players[1].name_vpass] = 0;
}
room.kicked = true;
room.send_replays();
room.process.kill();
room["delete"]();
}
response.writeHead(200); response.writeHead(200);
if (kick_room_found) { if (err) {
response.end(addCallback(u.query.callback, "['kick ok', '" + u.query.kick + "']")); return response.end(addCallback(u.query.callback, "['kick fail', '" + u.query.kick + "']"));
} else if (found) {
return response.end(addCallback(u.query.callback, "['kick ok', '" + u.query.kick + "']"));
} else { } else {
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.kick + "']")); return response.end(addCallback(u.query.callback, "['room not found', '" + u.query.kick + "']"));
} }
});
} else if (u.query.death) { } else if (u.query.death) {
if (!auth.auth(u.query.username, u.query.pass, "start_death", "start_death")) { if (!auth.auth(u.query.username, u.query.pass, "start_death", "start_death")) {
response.writeHead(200); response.writeHead(200);
...@@ -5331,20 +5386,23 @@ ...@@ -5331,20 +5386,23 @@
return; return;
} }
death_room_found = false; death_room_found = false;
for (q = 0, len6 = ROOM_all.length; q < len6; q++) { _async.each(ROOM_all, function(room, done) {
room = ROOM_all[q]; if (!(room && (u.query.death === "all" || u.query.death === room.process_pid.toString() || u.query.death === room.name))) {
if (room && (u.query.death === "all" || u.query.death === room.process_pid.toString() || u.query.death === room.name)) { done();
return;
}
if (room.start_death()) { if (room.start_death()) {
death_room_found = true; death_room_found = true;
} }
} done();
} }, function() {
response.writeHead(200); response.writeHead(200);
if (death_room_found) { if (death_room_found) {
response.end(addCallback(u.query.callback, "['death ok', '" + u.query.death + "']")); return response.end(addCallback(u.query.callback, "['death ok', '" + u.query.death + "']"));
} else { } else {
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.death + "']")); return response.end(addCallback(u.query.callback, "['room not found', '" + u.query.death + "']"));
} }
});
} else if (u.query.deathcancel) { } else if (u.query.deathcancel) {
if (!auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death")) { if (!auth.auth(u.query.username, u.query.pass, "start_death", "cancel_death")) {
response.writeHead(200); response.writeHead(200);
...@@ -5352,47 +5410,38 @@ ...@@ -5352,47 +5410,38 @@
return; return;
} }
death_room_found = false; death_room_found = false;
for (r = 0, len7 = ROOM_all.length; r < len7; r++) { _async.each(rooms, function(room, done) {
room = ROOM_all[r]; if (!(room && (u.query.deathcancel === "all" || u.query.deathcancel === room.process_pid.toString() || u.query.deathcancel === room.name))) {
if (room && (u.query.deathcancel === "all" || u.query.deathcancel === room.process_pid.toString() || u.query.deathcancel === room.name)) { done();
return;
}
if (room.cancel_death()) { if (room.cancel_death()) {
death_room_found = true; death_room_found = true;
} }
} return done();
} }, function() {
response.writeHead(200); response.writeHead(200);
if (death_room_found) { if (death_room_found) {
response.end(addCallback(u.query.callback, "['death cancel ok', '" + u.query.deathcancel + "']")); return response.end(addCallback(u.query.callback, "['death cancel ok', '" + u.query.deathcancel + "']"));
} else { } else {
response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']")); return response.end(addCallback(u.query.callback, "['room not found', '" + u.query.deathcancel + "']"));
} }
});
} else if (u.query.reboot) { } else if (u.query.reboot) {
if (!auth.auth(u.query.username, u.query.pass, "stop", "reboot")) { if (!auth.auth(u.query.username, u.query.pass, "stop", "reboot")) {
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['密码错误', 0]")); response.end(addCallback(u.query.callback, "['密码错误', 0]"));
return; return;
} }
for (s = 0, len8 = ROOM_all.length; s < len8; s++) { ROOM_kick("all", function(err, found) {
room = ROOM_all[s]; global.rebooted = true;
if (!(room)) {
continue;
}
if (room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN) {
room.scores[room.dueling_players[0].name_vpass] = 0;
room.scores[room.dueling_players[1].name_vpass] = 0;
}
room.kicked = true;
room.send_replays();
room.process.kill();
room["delete"]();
}
rebooted = true;
if (windbot_process) { if (windbot_process) {
windbot_process.kill(); windbot_process.kill();
} }
response.writeHead(200); response.writeHead(200);
response.end(addCallback(u.query.callback, "['reboot ok', '" + u.query.reboot + "']")); response.end(addCallback(u.query.callback, "['reboot ok', '" + u.query.reboot + "']"));
throw "rebooted"; return process.exit();
});
} else if (u.query.generatekey && settings.modules.vip.enabled) { } else if (u.query.generatekey && settings.modules.vip.enabled) {
if (!auth.auth(u.query.username, u.query.pass, "vip", "generate_keys")) { if (!auth.auth(u.query.username, u.query.pass, "vip", "generate_keys")) {
response.writeHead(200); response.writeHead(200);
......
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