Commit f7529ebb authored by nanahira's avatar nanahira

Merge branch 'master' into ai-play

parents e345b2ae 55f6e999
Pipeline #33381 failed with stages
in 9 minutes and 2 seconds
...@@ -726,12 +726,12 @@ class DataManager { ...@@ -726,12 +726,12 @@ class DataManager {
newScore.name = name; newScore.name = name;
return await this.saveRandomDuelScore(newScore); return await this.saveRandomDuelScore(newScore);
} }
async getRandomDuelScoreDisplay(name) { async getRandomDuelScoreDisplay(name, displayName) {
const score = await this.getRandomDuelScore(name); const score = await this.getRandomDuelScore(name);
if (!score) { if (!score) {
return `${name.split("$")[0]} \${random_score_blank}`; return `${displayName} \${random_score_blank}`;
} }
return score.getScoreText(); return score.getScoreText(displayName);
} }
async randomDuelPlayerWin(name) { async randomDuelPlayerWin(name) {
const score = await this.getOrCreateRandomDuelScore(name); const score = await this.getOrCreateRandomDuelScore(name);
......
...@@ -723,12 +723,12 @@ export class DataManager { ...@@ -723,12 +723,12 @@ export class DataManager {
newScore.name = name; newScore.name = name;
return await this.saveRandomDuelScore(newScore); return await this.saveRandomDuelScore(newScore);
} }
async getRandomDuelScoreDisplay(name: string) { async getRandomDuelScoreDisplay(name: string, displayName: string) {
const score = await this.getRandomDuelScore(name); const score = await this.getRandomDuelScore(name);
if(!score) { if(!score) {
return `${name.split("$")[0]} \${random_score_blank}`; return `${displayName} \${random_score_blank}`;
} }
return score.getScoreText(); return score.getScoreText(displayName);
} }
async randomDuelPlayerWin(name: string) { async randomDuelPlayerWin(name: string) {
const score = await this.getOrCreateRandomDuelScore(name); const score = await this.getOrCreateRandomDuelScore(name);
......
...@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); ...@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeDeck = exports.encodeDeck = void 0; exports.decodeDeck = exports.encodeDeck = void 0;
const assert_1 = __importDefault(require("assert")); const assert_1 = __importDefault(require("assert"));
function encodeDeck(deck) { function encodeDeck(deck) {
deck.main ??= [];
deck.side ??= [];
let pointer = 0; let pointer = 0;
const bufferSize = (2 + deck.main.length + deck.side.length) * 4; const bufferSize = (2 + deck.main.length + deck.side.length) * 4;
const buffer = Buffer.allocUnsafe(bufferSize); const buffer = Buffer.allocUnsafe(bufferSize);
......
...@@ -6,6 +6,8 @@ export interface Deck { ...@@ -6,6 +6,8 @@ export interface Deck {
} }
export function encodeDeck(deck: Deck) { export function encodeDeck(deck: Deck) {
deck.main ??= [];
deck.side ??= [];
let pointer = 0; let pointer = 0;
const bufferSize = (2 + deck.main.length + deck.side.length) * 4; const bufferSize = (2 + deck.main.length + deck.side.length) * 4;
const buffer = Buffer.allocUnsafe(bufferSize); const buffer = Buffer.allocUnsafe(bufferSize);
...@@ -40,4 +42,4 @@ export function decodeDeck(buffer: Buffer): Deck { ...@@ -40,4 +42,4 @@ export function decodeDeck(buffer: Buffer): Deck {
pointer += 4; pointer += 4;
} }
return {main, side}; return {main, side};
} }
\ No newline at end of file
...@@ -33,8 +33,7 @@ let RandomDuelScore = class RandomDuelScore extends CreateAndUpdateTimeBase_1.Cr ...@@ -33,8 +33,7 @@ let RandomDuelScore = class RandomDuelScore extends CreateAndUpdateTimeBase_1.Cr
++this.fleeCount; ++this.fleeCount;
this.lose(); this.lose();
} }
getScoreText() { getScoreText(displayName) {
const displayName = this.getDisplayName();
const total = this.winCount + this.loseCount; const total = this.winCount + this.loseCount;
if (this.winCount < 2 && total < 3) { if (this.winCount < 2 && total < 3) {
return `${displayName} \${random_score_not_enough}`; return `${displayName} \${random_score_not_enough}`;
......
...@@ -40,8 +40,7 @@ export class RandomDuelScore extends CreateAndUpdateTimeBase { ...@@ -40,8 +40,7 @@ export class RandomDuelScore extends CreateAndUpdateTimeBase {
this.lose(); this.lose();
} }
getScoreText() { getScoreText(displayName: string) {
const displayName = this.getDisplayName();
const total = this.winCount + this.loseCount; const total = this.winCount + this.loseCount;
if (this.winCount < 2 && total < 3) { if (this.winCount < 2 && total < 3) {
return `${displayName} \${random_score_not_enough}`; return `${displayName} \${random_score_not_enough}`;
...@@ -53,4 +52,4 @@ export class RandomDuelScore extends CreateAndUpdateTimeBase { ...@@ -53,4 +52,4 @@ export class RandomDuelScore extends CreateAndUpdateTimeBase {
return `\${random_score_part1}${displayName} \${random_score_part2} ${Math.ceil(this.winCount / total * 100)}\${random_score_part3} ${Math.ceil(this.fleeCount / total * 100)}\${random_score_part4}`; return `\${random_score_part1}${displayName} \${random_score_part2} ${Math.ceil(this.winCount / total * 100)}\${random_score_part3} ${Math.ceil(this.fleeCount / total * 100)}\${random_score_part4}`;
} }
} }
} }
\ No newline at end of file
...@@ -16,7 +16,9 @@ ...@@ -16,7 +16,9 @@
"draw_count": 1, "draw_count": 1,
"time_limit": 180, "time_limit": 180,
"no_watch": false, "no_watch": false,
"auto_death": false "auto_death": false,
"bo5": false,
"sideins": false
}, },
"modules": { "modules": {
"welcome": "MyCard YGOPro Server", "welcome": "MyCard YGOPro Server",
...@@ -90,6 +92,7 @@ ...@@ -90,6 +92,7 @@
"record_match_scores": false, "record_match_scores": false,
"post_match_scores": false, "post_match_scores": false,
"post_match_accesskey": "123456", "post_match_accesskey": "123456",
"disable_chat": false,
"blank_pass_modes": { "blank_pass_modes": {
"S": true, "S": true,
"M": true, "M": true,
......
...@@ -211,6 +211,7 @@ ...@@ -211,6 +211,7 @@
"refresh_failed": "Refresh field failed.", "refresh_failed": "Refresh field failed.",
"banned_athletic_deck_part1": "Entertainment Mode does not allow top ", "banned_athletic_deck_part1": "Entertainment Mode does not allow top ",
"banned_athletic_deck_part2": " popular meta decks. Please change your deck.", "banned_athletic_deck_part2": " popular meta decks. Please change your deck.",
"chat_disabled": "Chat is disabled in this room.",
"using_athletic_deck": " is using a competitive deck." "using_athletic_deck": " is using a competitive deck."
}, },
"es-es": { "es-es": {
...@@ -571,6 +572,7 @@ ...@@ -571,6 +572,7 @@
"refresh_fail": "刷新场面失败。", "refresh_fail": "刷新场面失败。",
"banned_athletic_deck_part1": "娱乐匹配中禁止使用使用数前", "banned_athletic_deck_part1": "娱乐匹配中禁止使用使用数前",
"banned_athletic_deck_part2": "的竞技卡组。请更换卡组。", "banned_athletic_deck_part2": "的竞技卡组。请更换卡组。",
"chat_disabled": "本房间禁止聊天。",
"using_athletic_deck": " 正在使用竞技卡组。" "using_athletic_deck": " 正在使用竞技卡组。"
}, },
"ko-kr": { "ko-kr": {
......
...@@ -78,7 +78,8 @@ ...@@ -78,7 +78,8 @@
], ],
"STOC_HS_PlayerEnter": [ "STOC_HS_PlayerEnter": [
{"name": "name", "type": "unsigned short", "length": 20, "encoding": "UTF-16LE"}, {"name": "name", "type": "unsigned short", "length": 20, "encoding": "UTF-16LE"},
{"name": "pos", "type": "unsigned char"} {"name": "pos", "type": "unsigned char"},
{"name": "padding", "type": "unsigned char"}
], ],
"STOC_HS_PlayerChange": [ "STOC_HS_PlayerChange": [
{"name": "status", "type": "unsigned char"} {"name": "status", "type": "unsigned char"}
......
...@@ -280,7 +280,7 @@ loadLFList = (path) -> ...@@ -280,7 +280,7 @@ loadLFList = (path) ->
lflists.push({date: moment(list.match(/!([\d\.]+)/)[1], 'YYYY.MM.DD').utcOffset("-08:00"), tcg: list.indexOf('TCG') != -1}) lflists.push({date: moment(list.match(/!([\d\.]+)/)[1], 'YYYY.MM.DD').utcOffset("-08:00"), tcg: list.indexOf('TCG') != -1})
catch catch
init = () -> init = () ->
log.info('Reading config.') log.info('Reading config.')
await createDirectoryIfNotExists("./config") await createDirectoryIfNotExists("./config")
await importOldConfig() await importOldConfig()
...@@ -397,6 +397,9 @@ init = () -> ...@@ -397,6 +397,9 @@ init = () ->
} }
delete settings.modules.random_duel.blank_pass_match delete settings.modules.random_duel.blank_pass_match
imported = true imported = true
if settings.modules.hide_name == true
settings.modules.hide_name = "start"
imported = true
#finish #finish
keysFromEnv = Object.keys(process.env).filter((key) => key.startsWith('SRVPRO_')) keysFromEnv = Object.keys(process.env).filter((key) => key.startsWith('SRVPRO_'))
if keysFromEnv.length > 0 if keysFromEnv.length > 0
...@@ -623,6 +626,13 @@ init = () -> ...@@ -623,6 +626,13 @@ init = () ->
return return
, 60000) , 60000)
# clean zombie rooms
setInterval ()->
for room in ROOM_all when room and !room.players.length
room.terminate()
return
, 300000
if settings.modules.random_duel.enabled if settings.modules.random_duel.enabled
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
...@@ -641,6 +651,7 @@ init = () -> ...@@ -641,6 +651,7 @@ init = () ->
return return
, 1000 , 1000
if settings.modules.mycard.enabled if settings.modules.mycard.enabled
setInterval ()-> setInterval ()->
for room in ROOM_all when 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) and !room.recovered for room in ROOM_all when 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) and !room.recovered
...@@ -812,10 +823,10 @@ ROOM_player_flee = global.ROOM_player_flee = (name)-> ...@@ -812,10 +823,10 @@ ROOM_player_flee = global.ROOM_player_flee = (name)->
await dataManager.randomDuelPlayerFlee(name) await dataManager.randomDuelPlayerFlee(name)
return return
ROOM_player_get_score = global.ROOM_player_get_score = (player)-> ROOM_player_get_score = global.ROOM_player_get_score = (player, display_name)->
if !settings.modules.mysql.enabled if !settings.modules.mysql.enabled
return "" return ""
return await dataManager.getRandomDuelScoreDisplay(player.name_vpass) return await dataManager.getRandomDuelScoreDisplay(player.name_vpass, display_name)
ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player_ip)-> ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player_ip)->
uname=name.toUpperCase() uname=name.toUpperCase()
...@@ -825,7 +836,7 @@ ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player ...@@ -825,7 +836,7 @@ ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player
return await ROOM_find_or_create_random(uname, player_ip) return await 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 memory_usage >= 90 or (settings.modules.max_rooms_count and rooms_count >= settings.modules.max_rooms_count) else if memory_usage >= 95 or (settings.modules.max_rooms_count and rooms_count >= settings.modules.max_rooms_count)
return null return null
else else
room = new Room(name) room = new Room(name)
...@@ -855,7 +866,7 @@ ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_i ...@@ -855,7 +866,7 @@ ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_i
max_player = if type == 'T' then 4 else 2 max_player = if type == 'T' then 4 else 2
playerbanned = (randomDuelBanRecord and randomDuelBanRecord.count > 3 and moment_now < randomDuelBanRecord.time) playerbanned = (randomDuelBanRecord and randomDuelBanRecord.count > 3 and moment_now < randomDuelBanRecord.time)
result = _.find ROOM_all, (room)-> result = _.find ROOM_all, (room)->
return room and room.random_type != '' and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and !room.windbot and return room and room.random_type != '' and !room.disconnector and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and !room.windbot and
((type == '' and ((type == '' and
(room.random_type == settings.modules.random_duel.default_type or (room.random_type == settings.modules.random_duel.default_type or
settings.modules.random_duel.blank_pass_modes[room.random_type])) or settings.modules.random_duel.blank_pass_modes[room.random_type])) or
...@@ -867,7 +878,7 @@ ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_i ...@@ -867,7 +878,7 @@ ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_i
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 memory_usage < 90 and not (settings.modules.max_rooms_count and rooms_count >= settings.modules.max_rooms_count) else if memory_usage < 95 and not (settings.modules.max_rooms_count and rooms_count >= settings.modules.max_rooms_count)
type = if type then type else settings.modules.random_duel.default_type type = if type then type else settings.modules.random_duel.default_type
name = type + ',RANDOM#' + Math.floor(Math.random() * 100000) name = type + ',RANDOM#' + Math.floor(Math.random() * 100000)
result = new Room(name) result = new Room(name)
...@@ -1025,7 +1036,7 @@ CLIENT_reconnect_register = global.CLIENT_reconnect_register = (client, room_id, ...@@ -1025,7 +1036,7 @@ CLIENT_reconnect_register = global.CLIENT_reconnect_register = (client, room_id,
dinfo.timeout = tmot dinfo.timeout = tmot
disconnect_list[CLIENT_get_authorize_key(client)] = dinfo disconnect_list[CLIENT_get_authorize_key(client)] = dinfo
#console.log("#{client.name} ${disconnect_from_game}") #console.log("#{client.name} ${disconnect_from_game}")
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${disconnect_from_game}" + if error then ": #{error}" else '') ygopro.stoc_send_chat_to_room(room, "#{room.getMaskedPlayerName(client)} ${disconnect_from_game}" + if error then ": #{error}" else '')
if client.time_confirm_required if client.time_confirm_required
client.time_confirm_required = false client.time_confirm_required = false
ygopro.ctos_send(client.server, 'TIME_CONFIRM') ygopro.ctos_send(client.server, 'TIME_CONFIRM')
...@@ -1118,8 +1129,9 @@ CLIENT_send_pre_reconnect_info = global.CLIENT_send_pre_reconnect_info = (client ...@@ -1118,8 +1129,9 @@ CLIENT_send_pre_reconnect_info = global.CLIENT_send_pre_reconnect_info = (client
}) })
for player in room.players for player in room.players
ygopro.stoc_send(client, 'HS_PLAYER_ENTER', { ygopro.stoc_send(client, 'HS_PLAYER_ENTER', {
name: player.name, name: room.getMaskedPlayerName(player, old_client),
pos: player.pos, pos: player.pos,
padding: 0,
}) })
return return
...@@ -1187,7 +1199,7 @@ CLIENT_reconnect = global.CLIENT_reconnect = (client) -> ...@@ -1187,7 +1199,7 @@ CLIENT_reconnect = global.CLIENT_reconnect = (client) ->
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}")
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${reconnect_to_game}") ygopro.stoc_send_chat_to_room(room, "#{room.getMaskedPlayerName(client)} ${reconnect_to_game}")
CLIENT_reconnect_unregister(client, true) CLIENT_reconnect_unregister(client, true)
return return
...@@ -1487,6 +1499,13 @@ class Room ...@@ -1487,6 +1499,13 @@ class Room
else else
@hostinfo.auto_death = 40 @hostinfo.auto_death = 40
if (rule.match /(^|,|,)(30EX|SIDEINS)(,|,|$)/)
@hostinfo.sideins = true
if (rule.match /(^|,|,)(BO5|BESTOF5)(,|,|$)/)
@hostinfo.mode = 1
@hostinfo.bo5 = true
if settings.modules.tournament_mode.enable_recover and (param = rule.match /(^|,|,)(RC|RECOVER)(\d*)T(\d*)(,|,|$)/) if settings.modules.tournament_mode.enable_recover and (param = rule.match /(^|,|,)(RC|RECOVER)(\d*)T(\d*)(,|,|$)/)
@recovered = true @recovered = true
@recovering = true @recovering = true
...@@ -1508,7 +1527,12 @@ class Room ...@@ -1508,7 +1527,12 @@ class Room
@spawn() @spawn()
spawn: (firstSeed) -> spawn: (firstSeed) ->
param = [0, @hostinfo.lflist, @hostinfo.rule, @hostinfo.mode, @hostinfo.duel_rule, duel_rule_flags = (@hostinfo.duel_rule & 0xf)
if @hostinfo.sideins
duel_rule_flags |= 0x10
if @hostinfo.bo5
duel_rule_flags |= 0x20
param = [0, @hostinfo.lflist, @hostinfo.rule, @hostinfo.mode, duel_rule_flags,
(if @hostinfo.no_check_deck then 'T' else 'F'), (if @hostinfo.no_shuffle_deck then 'T' else 'F'), (if @hostinfo.no_check_deck then 'T' else 'F'), (if @hostinfo.no_shuffle_deck then 'T' else 'F'),
@hostinfo.start_lp, @hostinfo.start_hand, @hostinfo.draw_count, @hostinfo.time_limit, @hostinfo.replay_mode] @hostinfo.start_lp, @hostinfo.start_hand, @hostinfo.draw_count, @hostinfo.time_limit, @hostinfo.replay_mode]
...@@ -1568,8 +1592,9 @@ class Room ...@@ -1568,8 +1592,9 @@ class Room
return if @deleted return if @deleted
#log.info 'room-delete', this.name, ROOM_all.length #log.info 'room-delete', this.name, ROOM_all.length
score_array=[] score_array=[]
for name, score of @scores for name_vpass, score of @scores
score_form = { name: name.split('$')[0], score: score, deck: null, name_vpass: name } name = name_vpass.split('$')[0]
score_form = { name: name, score: score, deck: null, name_vpass: name_vpass }
if @decks[name] if @decks[name]
score_form.deck = @decks[name] score_form.deck = @decks[name]
score_array.push score_form score_array.push score_form
...@@ -1832,7 +1857,7 @@ class Room ...@@ -1832,7 +1857,7 @@ class Room
if @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and !client.is_local and client.bot_bound if @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and !client.is_local and client.bot_bound
@kill_bots_with_name(client.name_vpass) @kill_bots_with_name(client.name_vpass)
if @players.length and !(@windbot and client.is_host and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN) and !(@arena and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and client.pos <= 3) if @players.length and !(@windbot and client.is_host and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN) and !(@arena and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and client.pos <= 3)
left_name = (if settings.modules.hide_name and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN then "********" else client.name) left_name = @getMaskedPlayerName(client)
ygopro.stoc_send_chat_to_room this, "#{left_name} ${left_game}" + if error then ": #{error}" else '' ygopro.stoc_send_chat_to_room this, "#{left_name} ${left_game}" + if error then ": #{error}" else ''
roomlist.update(this) if !@windbot and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and settings.modules.http.websocket_roomlist roomlist.update(this) if !@windbot and @duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and settings.modules.http.websocket_roomlist
#client.room = null #client.room = null
...@@ -1842,7 +1867,7 @@ class Room ...@@ -1842,7 +1867,7 @@ class Room
#client.room = null #client.room = null
this.delete() this.delete()
if !CLIENT_reconnect_unregister(client, false, true) if !CLIENT_reconnect_unregister(client, false, true)
SERVER_kick(client.server) SERVER_kick(client.server)
return return
start_death: () -> start_death: () ->
...@@ -2006,10 +2031,17 @@ class Room ...@@ -2006,10 +2031,17 @@ class Room
@watcher_buffers.push chat_buf @watcher_buffers.push chat_buf
return return
getMaskedPlayerName: (player, sight_player) ->
if not settings.modules.hide_name or (sight_player and player == sight_player) or not (@random_type or @arena)
return player.name
if (@duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and settings.modules.hide_name == "start") or settings.modules.hide_name == "always"
return "Player #{player.pos + 1}"
return player.name
# 网络连接 # 网络连接
netRequestHandler = (client) -> netRequestHandler = (client) ->
if !client.isWs if !client.isWs
client.ip = client.remoteAddress client.ip = client.remoteAddress or ''
client.is_local = client.ip and (client.ip.includes('127.0.0.1') or client.ip.includes(real_windbot_server_ip)) client.is_local = client.ip and (client.ip.includes('127.0.0.1') or client.ip.includes(real_windbot_server_ip))
connect_count = ROOM_connected_ip[client.ip] or 0 connect_count = ROOM_connected_ip[client.ip] or 0
...@@ -2405,8 +2437,8 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2405,8 +2437,8 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
#console.log(options) #console.log(options)
if options.rule == 2 if options.rule == 2
options.lflist = -1 options.lflist = -1
else if options.rule != 3 #else if options.rule != 3
options.lflist = _.findIndex lflists, (list)-> ((options.rule == 1) == list.tcg) and list.date.isBefore() # options.lflist = _.findIndex lflists, (list)-> ((options.rule == 1) == list.tcg) and list.date.isBefore()
room_title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ') room_title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ')
if badwordR.level3.test(room_title) if badwordR.level3.test(room_title)
log.warn("BAD ROOM NAME LEVEL 3", room_title, client.name, client.ip) log.warn("BAD ROOM NAME LEVEL 3", room_title, client.name, client.ip)
...@@ -2627,7 +2659,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)-> ...@@ -2627,7 +2659,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, room.welcome, ygopro.constants.COLORS.BABYBLUE)
if room.welcome2 if room.welcome2
ygopro.stoc_send_chat(client, room.welcome2, ygopro.constants.COLORS.PINK) ygopro.stoc_send_chat(client, room.welcome2, ygopro.constants.COLORS.PINK)
if settings.modules.arena_mode.enabled and !client.is_local #and not client.score_shown if settings.modules.arena_mode.enabled and !client.is_local and settings.modules.arena_mode.get_score #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
...@@ -2643,9 +2675,10 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)-> ...@@ -2643,9 +2675,10 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
#client.score_shown = true #client.score_shown = true
return return
if settings.modules.random_duel.record_match_scores and room.random_type == 'M' if settings.modules.random_duel.record_match_scores and room.random_type == 'M'
ygopro.stoc_send_chat_to_room(room, await ROOM_player_get_score(client), ygopro.constants.COLORS.GREEN) for player in room.players when player.pos != 7
ygopro.stoc_send_chat(player, await ROOM_player_get_score(client, room.getMaskedPlayerName(client, player)), ygopro.constants.COLORS.GREEN)
for player in room.players when player.pos != 7 and player != client for player in room.players when player.pos != 7 and player != client
ygopro.stoc_send_chat(client, await ROOM_player_get_score(player), ygopro.constants.COLORS.GREEN) ygopro.stoc_send_chat(client, await ROOM_player_get_score(player, room.getMaskedPlayerName(player, client)), ygopro.constants.COLORS.GREEN)
if !room.recorder if !room.recorder
room.recorder = recorder = net.connect room.port, -> room.recorder = recorder = net.connect room.port, ->
ygopro.ctos_send recorder, 'PLAYER_INFO', { ygopro.ctos_send recorder, 'PLAYER_INFO', {
...@@ -2799,7 +2832,7 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)-> ...@@ -2799,7 +2832,7 @@ ygopro.stoc_follow 'GAME_MSG', true, (buffer, info, client, server, datas)->
ygopro.stoc_send_chat_to_room(room, "${death_remain_final}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat_to_room(room, "${death_remain_final}", ygopro.constants.COLORS.BABYBLUE)
else else
ygopro.stoc_send_chat_to_room(room, "${death_remain_part1}" + (room.death - room.turn) + "${death_remain_part2}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat_to_room(room, "${death_remain_part1}" + (room.death - room.turn) + "${death_remain_part2}", ygopro.constants.COLORS.BABYBLUE)
if client.surrend_confirm if client.surrend_confirm and (r_player & 0x2) == 0
client.surrend_confirm = false client.surrend_confirm = false
ygopro.stoc_send_chat(client, "${surrender_canceled}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${surrender_canceled}", ygopro.constants.COLORS.BABYBLUE)
...@@ -3058,13 +3091,13 @@ ygopro.stoc_follow 'TYPE_CHANGE', true, (buffer, info, client, server, datas)-> ...@@ -3058,13 +3091,13 @@ ygopro.stoc_follow 'TYPE_CHANGE', true, (buffer, info, client, server, datas)->
ygopro.stoc_follow 'HS_PLAYER_ENTER', true, (buffer, info, client, server, datas)-> ygopro.stoc_follow 'HS_PLAYER_ENTER', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return false unless room and settings.modules.hide_name and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN if room and (room.random_type or room.arena) and settings.modules.hide_name and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN
pos = info.pos pos = info.pos
if pos < 4 and pos != client.pos if pos < 4 and pos != client.pos
struct = ygopro.structs.get("STOC_HS_PlayerEnter") struct = ygopro.structs.get("STOC_HS_PlayerEnter")
struct._setBuff(buffer) struct._setBuff(buffer)
struct.set("name", "********") struct.set("name", "Player " + (pos + 1))
buffer = struct.buffer buffer = struct.buffer
await return false await return false
ygopro.stoc_follow 'HS_PLAYER_CHANGE', true, (buffer, info, client, server, datas)-> ygopro.stoc_follow 'HS_PLAYER_CHANGE', true, (buffer, info, client, server, datas)->
...@@ -3169,7 +3202,7 @@ wait_room_start_arena = (room)-> ...@@ -3169,7 +3202,7 @@ wait_room_start_arena = (room)->
if room.waiting_for_player_time > 0 if room.waiting_for_player_time > 0
unless room.waiting_for_player_time % 5 unless room.waiting_for_player_time % 5
for player in room.players when player for player in room.players when player
display_name = (if settings.modules.hide_name and player != room.waiting_for_player then "********" else room.waiting_for_player.name) display_name = room.getMaskedPlayerName(player, room.waiting_for_player)
ygopro.stoc_send_chat(player, "#{if room.waiting_for_player_time <= 9 then ' ' else ''}#{room.waiting_for_player_time}${kick_count_down_arena_part1} #{display_name} ${kick_count_down_arena_part2}", if room.waiting_for_player_time <= 9 then ygopro.constants.COLORS.RED else ygopro.constants.COLORS.LIGHTBLUE) ygopro.stoc_send_chat(player, "#{if room.waiting_for_player_time <= 9 then ' ' else ''}#{room.waiting_for_player_time}${kick_count_down_arena_part1} #{display_name} ${kick_count_down_arena_part2}", if room.waiting_for_player_time <= 9 then ygopro.constants.COLORS.RED else ygopro.constants.COLORS.LIGHTBLUE)
else else
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)
...@@ -3243,11 +3276,12 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server, datas)-> ...@@ -3243,11 +3276,12 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server, datas)->
clearInterval client.side_interval clearInterval client.side_interval
client.side_interval = null client.side_interval = null
client.side_tcount = null client.side_tcount = null
if settings.modules.hide_name and room.duel_count == 0 if settings.modules.hide_name == "start" and room.duel_count == 0
for player in room.get_playing_player() when player != client for player in room.get_playing_player() when player != client
ygopro.stoc_send(client, 'HS_PLAYER_ENTER', { ygopro.stoc_send(client, 'HS_PLAYER_ENTER', {
name: player.name, name: player.name,
pos: player.pos pos: player.pos
padding: 0,
}) })
if settings.modules.tips.enabled if settings.modules.tips.enabled
ygopro.stoc_send_random_tip(client) ygopro.stoc_send_random_tip(client)
...@@ -3305,13 +3339,13 @@ ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)-> ...@@ -3305,13 +3339,13 @@ ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)->
ygopro.stoc_send_chat(client, "${surrender_denied}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${surrender_denied}", ygopro.constants.COLORS.BABYBLUE)
return true return true
if room.hostinfo.mode == 2 if room.hostinfo.mode == 2
if !client.surrend_confirm and !CLIENT_get_partner(client).closed and !CLIENT_get_partner(client).is_local if !client.surrend_confirm and !CLIENT_get_partner(client).isClosed and !CLIENT_get_partner(client).is_local
sur_player = CLIENT_get_partner(client) sur_player = CLIENT_get_partner(client)
ygopro.stoc_send_chat(sur_player, "${surrender_confirm_tag}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(sur_player, "${surrender_confirm_tag}", ygopro.constants.COLORS.BABYBLUE)
ygopro.stoc_send_chat(client, "${surrender_confirm_sent}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${surrender_confirm_sent}", ygopro.constants.COLORS.BABYBLUE)
sur_player.surrend_confirm = true sur_player.surrend_confirm = true
for player in [client, sur_player] for player in [client, sur_player]
ygopro.stoc_send(client, 'TEAMMATE_SURRENDER') ygopro.stoc_send(player, 'TEAMMATE_SURRENDER')
return true return true
await return false await return false
...@@ -3355,13 +3389,13 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3355,13 +3389,13 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
ygopro.ctos_send(client.server, 'SURRENDER') ygopro.ctos_send(client.server, 'SURRENDER')
else else
sur_player = CLIENT_get_partner(client) sur_player = CLIENT_get_partner(client)
if !sur_player or sur_player.closed or sur_player.is_local if !sur_player or sur_player.isClosed or sur_player.is_local
sur_player = client sur_player = client
if room.hostinfo.mode==2 and sur_player != client if room.hostinfo.mode==2 and sur_player != client
ygopro.stoc_send_chat(sur_player, "${surrender_confirm_tag}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(sur_player, "${surrender_confirm_tag}", ygopro.constants.COLORS.BABYBLUE)
ygopro.stoc_send_chat(client, "${surrender_confirm_sent}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${surrender_confirm_sent}", ygopro.constants.COLORS.BABYBLUE)
for player in [client, sur_player] for player in [client, sur_player]
ygopro.stoc_send(client, 'TEAMMATE_SURRENDER') ygopro.stoc_send(player, 'TEAMMATE_SURRENDER')
else else
ygopro.stoc_send_chat(client, "${surrender_confirm}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${surrender_confirm}", ygopro.constants.COLORS.BABYBLUE)
sur_player.surrend_confirm = true sur_player.surrend_confirm = true
...@@ -3550,6 +3584,9 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3550,6 +3584,9 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
ygopro.stoc_send_chat_to_room(room, "#{client.name}: #{msg}", 9) ygopro.stoc_send_chat_to_room(room, "#{client.name}: #{msg}", 9)
return true return true
return cancel return cancel
if room.random_type and settings.modules.random_duel.disable_chat
ygopro.stoc_send_chat(client, "${chat_disabled}", ygopro.constants.COLORS.BABYBLUE)
return true
if client.abuse_count>=5 or CLIENT_is_banned_by_mc(client) if client.abuse_count>=5 or CLIENT_is_banned_by_mc(client)
log.warn "BANNED CHAT", client.name, client.ip, msg log.warn "BANNED CHAT", client.name, client.ip, msg
ygopro.stoc_send_chat(client, "${banned_chat_tip}" + (if client.ban_mc and client.ban_mc.message then (": " + client.ban_mc.message) else ""), ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${banned_chat_tip}" + (if client.ban_mc and client.ban_mc.message then (": " + client.ban_mc.message) else ""), ygopro.constants.COLORS.RED)
......
...@@ -511,6 +511,10 @@ ...@@ -511,6 +511,10 @@
delete settings.modules.random_duel.blank_pass_match; delete settings.modules.random_duel.blank_pass_match;
imported = true; imported = true;
} }
if (settings.modules.hide_name === true) {
settings.modules.hide_name = "start";
imported = true;
}
//finish //finish
keysFromEnv = Object.keys(process.env).filter((key) => { keysFromEnv = Object.keys(process.env).filter((key) => {
return key.startsWith('SRVPRO_'); return key.startsWith('SRVPRO_');
...@@ -787,6 +791,16 @@ ...@@ -787,6 +791,16 @@
} }
}, 60000); }, 60000);
} }
// clean zombie rooms
setInterval(function() {
var l, len1, room;
for (l = 0, len1 = ROOM_all.length; l < len1; l++) {
room = ROOM_all[l];
if (room && !room.players.length) {
room.terminate();
}
}
}, 300000);
if (settings.modules.random_duel.enabled) { if (settings.modules.random_duel.enabled) {
setInterval(async function() { setInterval(async function() {
var l, len1, room, time_passed; var l, len1, room, time_passed;
...@@ -1040,11 +1054,11 @@ ...@@ -1040,11 +1054,11 @@
await dataManager.randomDuelPlayerFlee(name); await dataManager.randomDuelPlayerFlee(name);
}; };
ROOM_player_get_score = global.ROOM_player_get_score = async function(player) { ROOM_player_get_score = global.ROOM_player_get_score = async function(player, display_name) {
if (!settings.modules.mysql.enabled) { if (!settings.modules.mysql.enabled) {
return ""; return "";
} }
return (await dataManager.getRandomDuelScoreDisplay(player.name_vpass)); return (await dataManager.getRandomDuelScoreDisplay(player.name_vpass, display_name));
}; };
ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = async function(name, player_ip) { ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = async function(name, player_ip) {
...@@ -1058,7 +1072,7 @@ ...@@ -1058,7 +1072,7 @@
} }
if (room = ROOM_find_by_name(name)) { if (room = ROOM_find_by_name(name)) {
return room; return room;
} else if (memory_usage >= 90 || (settings.modules.max_rooms_count && rooms_count >= settings.modules.max_rooms_count)) { } else if (memory_usage >= 95 || (settings.modules.max_rooms_count && rooms_count >= settings.modules.max_rooms_count)) {
return null; return null;
} else { } else {
room = new Room(name); room = new Room(name);
...@@ -1106,12 +1120,12 @@ ...@@ -1106,12 +1120,12 @@
playerbanned = randomDuelBanRecord && randomDuelBanRecord.count > 3 && moment_now < randomDuelBanRecord.time; playerbanned = randomDuelBanRecord && randomDuelBanRecord.count > 3 && moment_now < randomDuelBanRecord.time;
result = _.find(ROOM_all, function(room) { result = _.find(ROOM_all, function(room) {
var ref; var ref;
return room && room.random_type !== '' && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && !room.windbot && ((type === '' && (room.random_type === settings.modules.random_duel.default_type || settings.modules.random_duel.blank_pass_modes[room.random_type])) || room.random_type === type) && (0 < (ref = room.get_playing_player().length) && ref < max_player) && (settings.modules.random_duel.no_rematch_check || room.get_host() === null || room.get_host().ip !== ROOM_players_oppentlist[player_ip]) && (playerbanned === room.deprecated || type === 'T'); return room && room.random_type !== '' && !room.disconnector && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && !room.windbot && ((type === '' && (room.random_type === settings.modules.random_duel.default_type || settings.modules.random_duel.blank_pass_modes[room.random_type])) || room.random_type === type) && (0 < (ref = room.get_playing_player().length) && ref < max_player) && (settings.modules.random_duel.no_rematch_check || room.get_host() === null || room.get_host().ip !== ROOM_players_oppentlist[player_ip]) && (playerbanned === room.deprecated || type === 'T');
}); });
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 (memory_usage < 90 && !(settings.modules.max_rooms_count && rooms_count >= settings.modules.max_rooms_count)) { } else if (memory_usage < 95 && !(settings.modules.max_rooms_count && rooms_count >= settings.modules.max_rooms_count)) {
type = type ? type : settings.modules.random_duel.default_type; type = type ? type : settings.modules.random_duel.default_type;
name = type + ',RANDOM#' + Math.floor(Math.random() * 100000); name = type + ',RANDOM#' + Math.floor(Math.random() * 100000);
result = new Room(name); result = new Room(name);
...@@ -1333,7 +1347,7 @@ ...@@ -1333,7 +1347,7 @@
dinfo.timeout = tmot; dinfo.timeout = tmot;
disconnect_list[CLIENT_get_authorize_key(client)] = dinfo; disconnect_list[CLIENT_get_authorize_key(client)] = dinfo;
//console.log("#{client.name} ${disconnect_from_game}") //console.log("#{client.name} ${disconnect_from_game}")
ygopro.stoc_send_chat_to_room(room, `${client.name} \${disconnect_from_game}` + (error ? `: ${error}` : '')); ygopro.stoc_send_chat_to_room(room, `${room.getMaskedPlayerName(client)} \${disconnect_from_game}` + (error ? `: ${error}` : ''));
if (client.time_confirm_required) { if (client.time_confirm_required) {
client.time_confirm_required = false; client.time_confirm_required = false;
ygopro.ctos_send(client.server, 'TIME_CONFIRM'); ygopro.ctos_send(client.server, 'TIME_CONFIRM');
...@@ -1485,8 +1499,9 @@ ...@@ -1485,8 +1499,9 @@
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref[j]; player = ref[j];
ygopro.stoc_send(client, 'HS_PLAYER_ENTER', { ygopro.stoc_send(client, 'HS_PLAYER_ENTER', {
name: player.name, name: room.getMaskedPlayerName(player, old_client),
pos: player.pos pos: player.pos,
padding: 0
}); });
} }
}; };
...@@ -1564,7 +1579,7 @@ ...@@ -1564,7 +1579,7 @@
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}")
ygopro.stoc_send_chat_to_room(room, `${client.name} \${reconnect_to_game}`); ygopro.stoc_send_chat_to_room(room, `${room.getMaskedPlayerName(client)} \${reconnect_to_game}`);
CLIENT_reconnect_unregister(client, true); CLIENT_reconnect_unregister(client, true);
}; };
...@@ -1926,6 +1941,13 @@ ...@@ -1926,6 +1941,13 @@
this.hostinfo.auto_death = 40; this.hostinfo.auto_death = 40;
} }
} }
if (rule.match(/(^|,|,)(30EX|SIDEINS)(,|,|$)/)) {
this.hostinfo.sideins = true;
}
if (rule.match(/(^|,|,)(BO5|BESTOF5)(,|,|$)/)) {
this.hostinfo.mode = 1;
this.hostinfo.bo5 = true;
}
if (settings.modules.tournament_mode.enable_recover && (param = rule.match(/(^|,|,)(RC|RECOVER)(\d*)T(\d*)(,|,|$)/))) { if (settings.modules.tournament_mode.enable_recover && (param = rule.match(/(^|,|,)(RC|RECOVER)(\d*)T(\d*)(,|,|$)/))) {
this.recovered = true; this.recovered = true;
this.recovering = true; this.recovering = true;
...@@ -1951,8 +1973,15 @@ ...@@ -1951,8 +1973,15 @@
} }
spawn(firstSeed) { spawn(firstSeed) {
var e, i, j, l, param, seeds; var duel_rule_flags, e, i, j, l, param, seeds;
param = [0, this.hostinfo.lflist, this.hostinfo.rule, this.hostinfo.mode, this.hostinfo.duel_rule, (this.hostinfo.no_check_deck ? 'T' : 'F'), (this.hostinfo.no_shuffle_deck ? 'T' : 'F'), this.hostinfo.start_lp, this.hostinfo.start_hand, this.hostinfo.draw_count, this.hostinfo.time_limit, this.hostinfo.replay_mode]; duel_rule_flags = this.hostinfo.duel_rule & 0xf;
if (this.hostinfo.sideins) {
duel_rule_flags |= 0x10;
}
if (this.hostinfo.bo5) {
duel_rule_flags |= 0x20;
}
param = [0, this.hostinfo.lflist, this.hostinfo.rule, this.hostinfo.mode, duel_rule_flags, (this.hostinfo.no_check_deck ? 'T' : 'F'), (this.hostinfo.no_shuffle_deck ? 'T' : 'F'), this.hostinfo.start_lp, this.hostinfo.start_hand, this.hostinfo.draw_count, this.hostinfo.time_limit, this.hostinfo.replay_mode];
if (firstSeed) { if (firstSeed) {
param.push(firstSeed); param.push(firstSeed);
seeds = getSeedTimet(2); seeds = getSeedTimet(2);
...@@ -2028,20 +2057,21 @@ ...@@ -2028,20 +2057,21 @@
} }
delete() { delete() {
var end_time, formatted_replays, index, j, len, log_rep_id, name, player_datas, recorder_buffer, ref, ref1, repbuf, replay_id, room_name, score, score_array, score_form; var end_time, formatted_replays, index, j, len, log_rep_id, name, name_vpass, player_datas, recorder_buffer, ref, ref1, repbuf, replay_id, room_name, score, score_array, score_form;
if (this.deleted) { if (this.deleted) {
return; return;
} }
//log.info 'room-delete', this.name, ROOM_all.length //log.info 'room-delete', this.name, ROOM_all.length
score_array = []; score_array = [];
ref = this.scores; ref = this.scores;
for (name in ref) { for (name_vpass in ref) {
score = ref[name]; score = ref[name_vpass];
name = name_vpass.split('$')[0];
score_form = { score_form = {
name: name.split('$')[0], name: name,
score: score, score: score,
deck: null, deck: null,
name_vpass: name name_vpass: name_vpass
}; };
if (this.decks[name]) { if (this.decks[name]) {
score_form.deck = this.decks[name]; score_form.deck = this.decks[name];
...@@ -2432,7 +2462,7 @@ ...@@ -2432,7 +2462,7 @@
this.kill_bots_with_name(client.name_vpass); this.kill_bots_with_name(client.name_vpass);
} }
if (this.players.length && !(this.windbot && client.is_host && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN) && !(this.arena && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && client.pos <= 3)) { if (this.players.length && !(this.windbot && client.is_host && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN) && !(this.arena && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && client.pos <= 3)) {
left_name = (settings.modules.hide_name && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN ? "********" : client.name); left_name = this.getMaskedPlayerName(client);
ygopro.stoc_send_chat_to_room(this, `${left_name} \${left_game}` + (error ? `: ${error}` : '')); ygopro.stoc_send_chat_to_room(this, `${left_name} \${left_game}` + (error ? `: ${error}` : ''));
if (!this.windbot && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.http.websocket_roomlist) { if (!this.windbot && this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.http.websocket_roomlist) {
roomlist.update(this); roomlist.update(this);
...@@ -2696,13 +2726,23 @@ ...@@ -2696,13 +2726,23 @@
} }
} }
getMaskedPlayerName(player, sight_player) {
if (!settings.modules.hide_name || (sight_player && player === sight_player) || !(this.random_type || this.arena)) {
return player.name;
}
if ((this.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && settings.modules.hide_name === "start") || settings.modules.hide_name === "always") {
return `Player ${player.pos + 1}`;
}
return player.name;
}
}; };
// 网络连接 // 网络连接
netRequestHandler = function(client) { netRequestHandler = function(client) {
var closeHandler, connect_count, dataHandler, server; var closeHandler, connect_count, dataHandler, server;
if (!client.isWs) { if (!client.isWs) {
client.ip = client.remoteAddress; client.ip = client.remoteAddress || '';
} }
client.is_local = client.ip && (client.ip.includes('127.0.0.1') || client.ip.includes(real_windbot_server_ip)); client.is_local = client.ip && (client.ip.includes('127.0.0.1') || client.ip.includes(real_windbot_server_ip));
connect_count = ROOM_connected_ip[client.ip] || 0; connect_count = ROOM_connected_ip[client.ip] || 0;
...@@ -3165,11 +3205,9 @@ ...@@ -3165,11 +3205,9 @@
//console.log(options) //console.log(options)
if (options.rule === 2) { if (options.rule === 2) {
options.lflist = -1; options.lflist = -1;
} else if (options.rule !== 3) {
options.lflist = _.findIndex(lflists, function(list) {
return ((options.rule === 1) === list.tcg) && list.date.isBefore();
});
} }
//else if options.rule != 3
// options.lflist = _.findIndex lflists, (list)-> ((options.rule == 1) == list.tcg) and list.date.isBefore()
room_title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' '); room_title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ');
if (badwordR.level3.test(room_title)) { if (badwordR.level3.test(room_title)) {
log.warn("BAD ROOM NAME LEVEL 3", room_title, client.name, client.ip); log.warn("BAD ROOM NAME LEVEL 3", room_title, client.name, client.ip);
...@@ -3420,7 +3458,7 @@ ...@@ -3420,7 +3458,7 @@
}); });
ygopro.stoc_follow('JOIN_GAME', false, async function(buffer, info, client, server, datas) { ygopro.stoc_follow('JOIN_GAME', false, async function(buffer, info, client, server, datas) {
var j, len, playWords, player, recorder, ref, room, watcher; var j, l, len, len1, playWords, player, recorder, ref, ref1, room, watcher;
//欢迎信息 //欢迎信息
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && !client.reconnecting)) { if (!(room && !client.reconnecting)) {
...@@ -3446,7 +3484,7 @@ ...@@ -3446,7 +3484,7 @@
if (room.welcome2) { if (room.welcome2) {
ygopro.stoc_send_chat(client, room.welcome2, ygopro.constants.COLORS.PINK); ygopro.stoc_send_chat(client, room.welcome2, ygopro.constants.COLORS.PINK);
} }
if (settings.modules.arena_mode.enabled && !client.is_local) { //and not client.score_shown if (settings.modules.arena_mode.enabled && !client.is_local && settings.modules.arena_mode.get_score) { //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
...@@ -3465,12 +3503,18 @@ ...@@ -3465,12 +3503,18 @@
} }
//client.score_shown = true //client.score_shown = true
if (settings.modules.random_duel.record_match_scores && room.random_type === 'M') { if (settings.modules.random_duel.record_match_scores && room.random_type === 'M') {
ygopro.stoc_send_chat_to_room(room, (await ROOM_player_get_score(client)), ygopro.constants.COLORS.GREEN);
ref = room.players; ref = room.players;
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref[j]; player = ref[j];
if (player.pos !== 7) {
ygopro.stoc_send_chat(player, (await ROOM_player_get_score(client, room.getMaskedPlayerName(client, player))), ygopro.constants.COLORS.GREEN);
}
}
ref1 = room.players;
for (l = 0, len1 = ref1.length; l < len1; l++) {
player = ref1[l];
if (player.pos !== 7 && player !== client) { if (player.pos !== 7 && player !== client) {
ygopro.stoc_send_chat(client, (await ROOM_player_get_score(player)), ygopro.constants.COLORS.GREEN); ygopro.stoc_send_chat(client, (await ROOM_player_get_score(player, room.getMaskedPlayerName(player, client))), ygopro.constants.COLORS.GREEN);
} }
} }
} }
...@@ -3506,15 +3550,15 @@ ...@@ -3506,15 +3550,15 @@
ygopro.ctos_send(watcher, 'HS_TOOBSERVER'); ygopro.ctos_send(watcher, 'HS_TOOBSERVER');
}); });
watcher.on('data', function(data) { watcher.on('data', function(data) {
var l, len1, ref1, w; var len2, m, ref2, w;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!room) { if (!room) {
return; return;
} }
room.watcher_buffers.push(data); room.watcher_buffers.push(data);
ref1 = room.watchers; ref2 = room.watchers;
for (l = 0, len1 = ref1.length; l < len1; l++) { for (m = 0, len2 = ref2.length; m < len2; m++) {
w = ref1[l]; w = ref2[m];
if (w) { //a WTF fix if (w) { //a WTF fix
ygopro.helper.send(w, data); ygopro.helper.send(w, data);
} }
...@@ -3665,7 +3709,7 @@ ...@@ -3665,7 +3709,7 @@
} }
} }
} }
if (client.surrend_confirm) { if (client.surrend_confirm && (r_player & 0x2) === 0) {
client.surrend_confirm = false; client.surrend_confirm = false;
ygopro.stoc_send_chat(client, "${surrender_canceled}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${surrender_canceled}", ygopro.constants.COLORS.BABYBLUE);
} }
...@@ -4036,15 +4080,14 @@ ...@@ -4036,15 +4080,14 @@
ygopro.stoc_follow('HS_PLAYER_ENTER', true, async function(buffer, info, client, server, datas) { ygopro.stoc_follow('HS_PLAYER_ENTER', true, async function(buffer, info, client, server, datas) {
var pos, room, struct; var pos, room, struct;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (!(room && settings.modules.hide_name && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN)) { if (room && (room.random_type || room.arena) && settings.modules.hide_name && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN) {
return false; pos = info.pos;
} if (pos < 4 && pos !== client.pos) {
pos = info.pos; struct = ygopro.structs.get("STOC_HS_PlayerEnter");
if (pos < 4 && pos !== client.pos) { struct._setBuff(buffer);
struct = ygopro.structs.get("STOC_HS_PlayerEnter"); struct.set("name", "Player " + (pos + 1));
struct._setBuff(buffer); buffer = struct.buffer;
struct.set("name", "********"); }
buffer = struct.buffer;
} }
return false; return false;
}); });
...@@ -4214,7 +4257,7 @@ ...@@ -4214,7 +4257,7 @@
if (!(player)) { if (!(player)) {
continue; continue;
} }
display_name = (settings.modules.hide_name && player !== room.waiting_for_player ? "********" : room.waiting_for_player.name); display_name = room.getMaskedPlayerName(player, room.waiting_for_player);
ygopro.stoc_send_chat(player, `${room.waiting_for_player_time <= 9 ? ' ' : ''}${room.waiting_for_player_time}\${kick_count_down_arena_part1} ${display_name} \${kick_count_down_arena_part2}`, room.waiting_for_player_time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE); ygopro.stoc_send_chat(player, `${room.waiting_for_player_time <= 9 ? ' ' : ''}${room.waiting_for_player_time}\${kick_count_down_arena_part1} ${display_name} \${kick_count_down_arena_part2}`, room.waiting_for_player_time <= 9 ? ygopro.constants.COLORS.RED : ygopro.constants.COLORS.LIGHTBLUE);
} }
} }
...@@ -4334,14 +4377,15 @@ ...@@ -4334,14 +4377,15 @@
client.side_tcount = null; client.side_tcount = null;
} }
} }
if (settings.modules.hide_name && room.duel_count === 0) { if (settings.modules.hide_name === "start" && room.duel_count === 0) {
ref1 = room.get_playing_player(); ref1 = room.get_playing_player();
for (l = 0, len1 = ref1.length; l < len1; l++) { for (l = 0, len1 = ref1.length; l < len1; l++) {
player = ref1[l]; player = ref1[l];
if (player !== client) { if (player !== client) {
ygopro.stoc_send(client, 'HS_PLAYER_ENTER', { ygopro.stoc_send(client, 'HS_PLAYER_ENTER', {
name: player.name, name: player.name,
pos: player.pos pos: player.pos,
padding: 0
}); });
} }
} }
...@@ -4421,7 +4465,7 @@ ...@@ -4421,7 +4465,7 @@
return true; return true;
} }
if (room.hostinfo.mode === 2) { if (room.hostinfo.mode === 2) {
if (!client.surrend_confirm && !CLIENT_get_partner(client).closed && !CLIENT_get_partner(client).is_local) { if (!client.surrend_confirm && !CLIENT_get_partner(client).isClosed && !CLIENT_get_partner(client).is_local) {
sur_player = CLIENT_get_partner(client); sur_player = CLIENT_get_partner(client);
ygopro.stoc_send_chat(sur_player, "${surrender_confirm_tag}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(sur_player, "${surrender_confirm_tag}", ygopro.constants.COLORS.BABYBLUE);
ygopro.stoc_send_chat(client, "${surrender_confirm_sent}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${surrender_confirm_sent}", ygopro.constants.COLORS.BABYBLUE);
...@@ -4429,7 +4473,7 @@ ...@@ -4429,7 +4473,7 @@
ref = [client, sur_player]; ref = [client, sur_player];
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref[j]; player = ref[j];
ygopro.stoc_send(client, 'TEAMMATE_SURRENDER'); ygopro.stoc_send(player, 'TEAMMATE_SURRENDER');
} }
return true; return true;
} }
...@@ -4492,7 +4536,7 @@ ...@@ -4492,7 +4536,7 @@
ygopro.ctos_send(client.server, 'SURRENDER'); ygopro.ctos_send(client.server, 'SURRENDER');
} else { } else {
sur_player = CLIENT_get_partner(client); sur_player = CLIENT_get_partner(client);
if (!sur_player || sur_player.closed || sur_player.is_local) { if (!sur_player || sur_player.isClosed || sur_player.is_local) {
sur_player = client; sur_player = client;
} }
if (room.hostinfo.mode === 2 && sur_player !== client) { if (room.hostinfo.mode === 2 && sur_player !== client) {
...@@ -4501,7 +4545,7 @@ ...@@ -4501,7 +4545,7 @@
ref = [client, sur_player]; ref = [client, sur_player];
for (j = 0, len = ref.length; j < len; j++) { for (j = 0, len = ref.length; j < len; j++) {
player = ref[j]; player = ref[j];
ygopro.stoc_send(client, 'TEAMMATE_SURRENDER'); ygopro.stoc_send(player, 'TEAMMATE_SURRENDER');
} }
} else { } else {
ygopro.stoc_send_chat(client, "${surrender_confirm}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${surrender_confirm}", ygopro.constants.COLORS.BABYBLUE);
...@@ -4765,6 +4809,10 @@ ...@@ -4765,6 +4809,10 @@
} }
return cancel; return cancel;
} }
if (room.random_type && settings.modules.random_duel.disable_chat) {
ygopro.stoc_send_chat(client, "${chat_disabled}", ygopro.constants.COLORS.BABYBLUE);
return true;
}
if (client.abuse_count >= 5 || CLIENT_is_banned_by_mc(client)) { if (client.abuse_count >= 5 || CLIENT_is_banned_by_mc(client)) {
log.warn("BANNED CHAT", client.name, client.ip, msg); log.warn("BANNED CHAT", client.name, client.ip, msg);
ygopro.stoc_send_chat(client, "${banned_chat_tip}" + (client.ban_mc && client.ban_mc.message ? ": " + client.ban_mc.message : ""), ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${banned_chat_tip}" + (client.ban_mc && client.ban_mc.message ? ": " + client.ban_mc.message : ""), ygopro.constants.COLORS.RED);
......
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