Commit 23b15a3e authored by nanahira's avatar nanahira

fix afk=flee

parent 1cda131d
...@@ -556,9 +556,9 @@ init = () -> ...@@ -556,9 +556,9 @@ init = () ->
setInterval ()-> setInterval ()->
for room in ROOM_all when 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) and !room.recovered for room in ROOM_all when 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) and !room.recovered
time_passed = Math.floor(moment_now.diff(room.last_active_time) / 1000) time_passed = Math.floor(moment_now.diff(room.last_active_time) / 1000)
#log.info time_passed #log.info time_passed, moment_now_string
if time_passed >= settings.modules.random_duel.hang_timeout if time_passed >= settings.modules.random_duel.hang_timeout
room.last_active_time = moment_now_string room.refreshLastActiveTime()
await ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}") await ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}")
room.scores[room.waiting_for_player.name_vpass] = -9 room.scores[room.waiting_for_player.name_vpass] = -9
#log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass] #log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
...@@ -577,7 +577,7 @@ init = () -> ...@@ -577,7 +577,7 @@ init = () ->
time_passed = Math.floor(moment_now.diff(room.last_active_time) / 1000) time_passed = Math.floor(moment_now.diff(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
room.last_active_time = moment_now_string room.refreshLastActiveTime()
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)
room.scores[room.waiting_for_player.name_vpass] = -9 room.scores[room.waiting_for_player.name_vpass] = -9
#log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass] #log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
...@@ -1100,7 +1100,7 @@ CLIENT_reconnect = global.CLIENT_reconnect = (client) -> ...@@ -1100,7 +1100,7 @@ CLIENT_reconnect = global.CLIENT_reconnect = (client) ->
client.established = true client.established = true
client.pre_establish_buffers = [] client.pre_establish_buffers = []
if room.random_type or room.arena if room.random_type or room.arena
room.last_active_time = moment_now_string room.refreshLastActiveTime()
CLIENT_import_data(client, dinfo.old_client, room) CLIENT_import_data(client, dinfo.old_client, room)
CLIENT_send_reconnect_info(client, client.server, room) CLIENT_send_reconnect_info(client, client.server, room)
#console.log("#{client.name} ${reconnect_to_game}") #console.log("#{client.name} ${reconnect_to_game}")
...@@ -1129,7 +1129,7 @@ CLIENT_kick_reconnect = global.CLIENT_kick_reconnect = (client, deckbuf) -> ...@@ -1129,7 +1129,7 @@ CLIENT_kick_reconnect = global.CLIENT_kick_reconnect = (client, deckbuf) ->
client.established = true client.established = true
client.pre_establish_buffers = [] client.pre_establish_buffers = []
if room.random_type or room.arena if room.random_type or room.arena
room.last_active_time = moment_now_string room.refreshLastActiveTime()
CLIENT_import_data(client, player, room) CLIENT_import_data(client, player, room)
CLIENT_send_reconnect_info(client, client.server, room) CLIENT_send_reconnect_info(client, client.server, room)
#console.log("#{client.name} ${reconnect_to_game}") #console.log("#{client.name} ${reconnect_to_game}")
...@@ -1664,7 +1664,7 @@ class Room ...@@ -1664,7 +1664,7 @@ class Room
@finished = true @finished = true
if !@finished_by_death if !@finished_by_death
@scores[client.name_vpass] = -9 @scores[client.name_vpass] = -9
if @random_type and not client.flee_free and (!settings.modules.reconnect.enabled or @get_disconnected_count() == 0) if @random_type and not client.flee_free and (!settings.modules.reconnect.enabled or @get_disconnected_count() == 0) and not client.kicked_by_system and not client.kicked_by_player
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_flee}") ROOM_ban_player(client.name, client.ip, "${random_ban_reason_flee}")
if settings.modules.random_duel.record_match_scores and @random_type == 'M' if settings.modules.random_duel.record_match_scores and @random_type == 'M'
ROOM_player_flee(client.name_vpass) ROOM_player_flee(client.name_vpass)
...@@ -1802,6 +1802,12 @@ class Room ...@@ -1802,6 +1802,12 @@ class Room
@connect(client) @connect(client)
return true return true
refreshLastActiveTime: (longAgo) ->
if longAgo
@last_active_time = moment_long_ago_string
else
@last_active_time = moment_now_string
# 网络连接 # 网络连接
netRequestHandler = (client) -> netRequestHandler = (client) ->
client.ip = client.remoteAddress client.ip = client.remoteAddress
...@@ -2570,7 +2576,7 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)-> ...@@ -2570,7 +2576,7 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
return true return true
else else
room.waiting_for_player = client room.waiting_for_player = client
room.last_active_time = moment_now_string room.refreshLastActiveTime()
#log.info("#{msg_name}等待#{room.waiting_for_player.name}") #log.info("#{msg_name}等待#{room.waiting_for_player.name}")
#log.info 'MSG', msg_name #log.info 'MSG', msg_name
...@@ -2952,6 +2958,7 @@ ygopro.stoc_follow 'DUEL_END', false, (buffer, info, client, server, datas)-> ...@@ -2952,6 +2958,7 @@ ygopro.stoc_follow 'DUEL_END', false, (buffer, info, client, server, datas)->
wait_room_start = (room, time)-> wait_room_start = (room, time)->
if room and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.ready_player_count_without_host >= room.max_player - 1 if room and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.ready_player_count_without_host >= room.max_player - 1
#log.info('wait room start', time)
time -= 1 time -= 1
if time if time
unless time % 5 unless time % 5
...@@ -3121,7 +3128,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3121,7 +3128,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
return unless room return unless room
msg = _.trim(info.msg) msg = _.trim(info.msg)
cancel = _.startsWith(msg, "/") cancel = _.startsWith(msg, "/")
room.last_active_time = moment_now_string unless cancel or not (room.random_type or room.arena) or room.duel_stage == ygopro.constants.DUEL_STAGE.FINGER or room.duel_stage == ygopro.constants.DUEL_STAGE.FIRSTGO or room.duel_stage == ygopro.constants.DUEL_STAGE.SIDING room.refreshLastActiveTime() unless cancel or not (room.random_type or room.arena) or room.duel_stage == ygopro.constants.DUEL_STAGE.FINGER or room.duel_stage == ygopro.constants.DUEL_STAGE.FIRSTGO or room.duel_stage == ygopro.constants.DUEL_STAGE.SIDING
cmd = msg.split(' ') cmd = msg.split(' ')
switch cmd[0] switch cmd[0]
when '/投降', '/surrender' when '/投降', '/surrender'
...@@ -3313,7 +3320,7 @@ ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server, datas)-> ...@@ -3313,7 +3320,7 @@ ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server, datas)->
if room.random_type or room.arena if room.random_type or room.arena
if client.pos == 0 if client.pos == 0
room.waiting_for_player = room.waiting_for_player2 room.waiting_for_player = room.waiting_for_player2
room.last_active_time = moment_now_string room.refreshLastActiveTime()
if room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.recovering if room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.recovering
recover_player_data = _.find(room.recover_duel_log.players, (player) -> recover_player_data = _.find(room.recover_duel_log.players, (player) ->
return player.realName == client.name_vpass and buffer.compare(Buffer.from(player.startDeckBuffer, "base64")) == 0 return player.realName == client.name_vpass and buffer.compare(Buffer.from(player.startDeckBuffer, "base64")) == 0
...@@ -3371,7 +3378,7 @@ ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server, datas)-> ...@@ -3371,7 +3378,7 @@ ygopro.ctos_follow 'UPDATE_DECK', true, (buffer, info, client, server, datas)->
ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server, datas)-> ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return unless room and (room.random_type or room.arena) return unless room and (room.random_type or room.arena)
room.last_active_time = moment_now_string room.refreshLastActiveTime()
await return await return
ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server, datas)-> ygopro.stoc_follow 'TIME_LIMIT', true, (buffer, info, client, server, datas)->
...@@ -3440,7 +3447,7 @@ ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server, datas)-> ...@@ -3440,7 +3447,7 @@ ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server, datas)->
if room.random_type or room.arena if room.random_type or room.arena
if client.pos == 0 if client.pos == 0
room.waiting_for_player = room.waiting_for_player2 room.waiting_for_player = room.waiting_for_player2
room.last_active_time = moment_long_ago_string room.refreshLastActiveTime(true)
await return await return
ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server, datas)-> ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server, datas)->
...@@ -3449,7 +3456,7 @@ ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server, datas)-> ...@@ -3449,7 +3456,7 @@ ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server, datas)->
client.selected_preduel = true client.selected_preduel = true
# room.selecting_tp = false # room.selecting_tp = false
return unless room.random_type or room.arena return unless room.random_type or room.arena
room.last_active_time = moment_now_string room.refreshLastActiveTime()
await return await return
ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server, datas)-> ygopro.stoc_follow 'CHAT', true, (buffer, info, client, server, datas)->
...@@ -3488,7 +3495,7 @@ ygopro.stoc_follow 'SELECT_HAND', true, (buffer, info, client, server, datas)-> ...@@ -3488,7 +3495,7 @@ ygopro.stoc_follow 'SELECT_HAND', true, (buffer, info, client, server, datas)->
room.waiting_for_player = client room.waiting_for_player = client
else else
room.waiting_for_player2 = client room.waiting_for_player2 = client
room.last_active_time = moment_long_ago_string room.refreshLastActiveTime(true)
if room.determine_firstgo if room.determine_firstgo
ygopro.ctos_send(server, "HAND_RESULT", { ygopro.ctos_send(server, "HAND_RESULT", {
res: if client.pos == 0 then 2 else 1 res: if client.pos == 0 then 2 else 1
...@@ -3509,7 +3516,7 @@ ygopro.stoc_follow 'SELECT_TP', true, (buffer, info, client, server, datas)-> ...@@ -3509,7 +3516,7 @@ ygopro.stoc_follow 'SELECT_TP', true, (buffer, info, client, server, datas)->
room.duel_stage = ygopro.constants.DUEL_STAGE.FIRSTGO room.duel_stage = ygopro.constants.DUEL_STAGE.FIRSTGO
if room.random_type or room.arena if room.random_type or room.arena
room.waiting_for_player = client room.waiting_for_player = client
room.last_active_time = moment_now_string room.refreshLastActiveTime()
if room.determine_firstgo if room.determine_firstgo
ygopro.ctos_send(server, "TP_RESULT", { ygopro.ctos_send(server, "TP_RESULT", {
res: if room.determine_firstgo == client then 1 else 0 res: if room.determine_firstgo == client then 1 else 0
...@@ -3565,7 +3572,7 @@ ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server, datas)-> ...@@ -3565,7 +3572,7 @@ ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server, datas)->
room.waiting_for_player = client room.waiting_for_player = client
else else
room.waiting_for_player2 = client room.waiting_for_player2 = client
room.last_active_time = moment_now_string room.refreshLastActiveTime()
await return await return
ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)-> ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)->
......
...@@ -704,9 +704,9 @@ ...@@ -704,9 +704,9 @@
continue; continue;
} }
time_passed = Math.floor(moment_now.diff(room.last_active_time) / 1000); time_passed = Math.floor(moment_now.diff(room.last_active_time) / 1000);
//log.info time_passed //log.info time_passed, moment_now_string
if (time_passed >= settings.modules.random_duel.hang_timeout) { if (time_passed >= settings.modules.random_duel.hang_timeout) {
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
await ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}"); await ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}");
room.scores[room.waiting_for_player.name_vpass] = -9; room.scores[room.waiting_for_player.name_vpass] = -9;
//log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass] //log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
...@@ -731,7 +731,7 @@ ...@@ -731,7 +731,7 @@
time_passed = Math.floor(moment_now.diff(room.last_active_time) / 1000); time_passed = Math.floor(moment_now.diff(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) {
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
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);
room.scores[room.waiting_for_player.name_vpass] = -9; room.scores[room.waiting_for_player.name_vpass] = -9;
//log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass] //log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
...@@ -1451,7 +1451,7 @@ ...@@ -1451,7 +1451,7 @@
client.established = true; client.established = true;
client.pre_establish_buffers = []; client.pre_establish_buffers = [];
if (room.random_type || room.arena) { if (room.random_type || room.arena) {
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
CLIENT_import_data(client, dinfo.old_client, room); CLIENT_import_data(client, dinfo.old_client, room);
CLIENT_send_reconnect_info(client, client.server, room); CLIENT_send_reconnect_info(client, client.server, room);
...@@ -1483,7 +1483,7 @@ ...@@ -1483,7 +1483,7 @@
client.established = true; client.established = true;
client.pre_establish_buffers = []; client.pre_establish_buffers = [];
if (room.random_type || room.arena) { if (room.random_type || room.arena) {
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
CLIENT_import_data(client, player, room); CLIENT_import_data(client, player, room);
CLIENT_send_reconnect_info(client, client.server, room); CLIENT_send_reconnect_info(client, client.server, room);
...@@ -2212,7 +2212,7 @@ ...@@ -2212,7 +2212,7 @@
this.finished = true; this.finished = true;
if (!this.finished_by_death) { if (!this.finished_by_death) {
this.scores[client.name_vpass] = -9; this.scores[client.name_vpass] = -9;
if (this.random_type && !client.flee_free && (!settings.modules.reconnect.enabled || this.get_disconnected_count() === 0)) { if (this.random_type && !client.flee_free && (!settings.modules.reconnect.enabled || this.get_disconnected_count() === 0) && !client.kicked_by_system && !client.kicked_by_player) {
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_flee}"); ROOM_ban_player(client.name, client.ip, "${random_ban_reason_flee}");
if (settings.modules.random_duel.record_match_scores && this.random_type === 'M') { if (settings.modules.random_duel.record_match_scores && this.random_type === 'M') {
ROOM_player_flee(client.name_vpass); ROOM_player_flee(client.name_vpass);
...@@ -2426,6 +2426,14 @@ ...@@ -2426,6 +2426,14 @@
return true; return true;
} }
refreshLastActiveTime(longAgo) {
if (longAgo) {
return this.last_active_time = moment_long_ago_string;
} else {
return this.last_active_time = moment_now_string;
}
}
}; };
// 网络连接 // 网络连接
...@@ -3343,7 +3351,7 @@ ...@@ -3343,7 +3351,7 @@
return true; return true;
} else { } else {
room.waiting_for_player = client; room.waiting_for_player = client;
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
} }
//log.info("#{msg_name}等待#{room.waiting_for_player.name}") //log.info("#{msg_name}等待#{room.waiting_for_player.name}")
...@@ -3888,6 +3896,7 @@ ...@@ -3888,6 +3896,7 @@
wait_room_start = async function(room, time) { wait_room_start = async function(room, time) {
var j, len, player, ref; var j, len, player, ref;
if (room && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.ready_player_count_without_host >= room.max_player - 1) { if (room && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.ready_player_count_without_host >= room.max_player - 1) {
//log.info('wait room start', time)
time -= 1; time -= 1;
if (time) { if (time) {
if (!(time % 5)) { if (!(time % 5)) {
...@@ -4139,7 +4148,7 @@ ...@@ -4139,7 +4148,7 @@
msg = _.trim(info.msg); msg = _.trim(info.msg);
cancel = _.startsWith(msg, "/"); cancel = _.startsWith(msg, "/");
if (!(cancel || !(room.random_type || room.arena) || room.duel_stage === ygopro.constants.DUEL_STAGE.FINGER || room.duel_stage === ygopro.constants.DUEL_STAGE.FIRSTGO || room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING)) { if (!(cancel || !(room.random_type || room.arena) || room.duel_stage === ygopro.constants.DUEL_STAGE.FINGER || room.duel_stage === ygopro.constants.DUEL_STAGE.FIRSTGO || room.duel_stage === ygopro.constants.DUEL_STAGE.SIDING)) {
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
cmd = msg.split(' '); cmd = msg.split(' ');
switch (cmd[0]) { switch (cmd[0]) {
...@@ -4409,7 +4418,7 @@ ...@@ -4409,7 +4418,7 @@
if (client.pos === 0) { if (client.pos === 0) {
room.waiting_for_player = room.waiting_for_player2; room.waiting_for_player = room.waiting_for_player2;
} }
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
if (room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.recovering) { if (room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.recovering) {
recover_player_data = _.find(room.recover_duel_log.players, function(player) { recover_player_data = _.find(room.recover_duel_log.players, function(player) {
...@@ -4488,7 +4497,7 @@ ...@@ -4488,7 +4497,7 @@
if (!(room && (room.random_type || room.arena))) { if (!(room && (room.random_type || room.arena))) {
return; return;
} }
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
}); });
ygopro.stoc_follow('TIME_LIMIT', true, async function(buffer, info, client, server, datas) { ygopro.stoc_follow('TIME_LIMIT', true, async function(buffer, info, client, server, datas) {
...@@ -4587,7 +4596,7 @@ ...@@ -4587,7 +4596,7 @@
if (client.pos === 0) { if (client.pos === 0) {
room.waiting_for_player = room.waiting_for_player2; room.waiting_for_player = room.waiting_for_player2;
} }
room.last_active_time = moment_long_ago_string; room.refreshLastActiveTime(true);
} }
}); });
...@@ -4602,7 +4611,7 @@ ...@@ -4602,7 +4611,7 @@
if (!(room.random_type || room.arena)) { if (!(room.random_type || room.arena)) {
return; return;
} }
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
}); });
ygopro.stoc_follow('CHAT', true, async function(buffer, info, client, server, datas) { ygopro.stoc_follow('CHAT', true, async function(buffer, info, client, server, datas) {
...@@ -4659,7 +4668,7 @@ ...@@ -4659,7 +4668,7 @@
} else { } else {
room.waiting_for_player2 = client; room.waiting_for_player2 = client;
} }
room.last_active_time = moment_long_ago_string; room.refreshLastActiveTime(true);
} }
if (room.determine_firstgo) { if (room.determine_firstgo) {
ygopro.ctos_send(server, "HAND_RESULT", { ygopro.ctos_send(server, "HAND_RESULT", {
...@@ -4690,7 +4699,7 @@ ...@@ -4690,7 +4699,7 @@
room.duel_stage = ygopro.constants.DUEL_STAGE.FIRSTGO; room.duel_stage = ygopro.constants.DUEL_STAGE.FIRSTGO;
if (room.random_type || room.arena) { if (room.random_type || room.arena) {
room.waiting_for_player = client; room.waiting_for_player = client;
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
if (room.determine_firstgo) { if (room.determine_firstgo) {
ygopro.ctos_send(server, "TP_RESULT", { ygopro.ctos_send(server, "TP_RESULT", {
...@@ -4759,7 +4768,7 @@ ...@@ -4759,7 +4768,7 @@
} else { } else {
room.waiting_for_player2 = client; room.waiting_for_player2 = client;
} }
room.last_active_time = moment_now_string; room.refreshLastActiveTime();
} }
}); });
......
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