Commit 1094f445 authored by nanahira's avatar nanahira

Merge branch 'plugins' into plugin_koishi

parents bb24e5ae e8ef0195
# ignore
jsconfig.json
coffeelint.json
.vscode/
password.json
config.*.json
config.user.bak
/bak
/config
/ygopro
/windbot
/decks
/decks_save*
/replays
/node_modules
/ssl
/ygosrv233
/challonge
/logs
/plugins
test*
*.heapsnapshot
*.tmp
*.bak
*.log
*.map
Thumbs.db
ehthumbs.db
Desktop.ini
$RECYCLE.BIN/
.DS_Store
.git* .git*
.dockerignore .dockerignore
Dockerfile* Dockerfile*
......
...@@ -24,6 +24,7 @@ ygopro-2pick ...@@ -24,6 +24,7 @@ ygopro-2pick
/ygosrv233 /ygosrv233
/challonge /challonge
/logs /logs
/plugins
test* test*
*.heapsnapshot *.heapsnapshot
......
...@@ -141,11 +141,11 @@ try ...@@ -141,11 +141,11 @@ try
catch e catch e
log.info e unless e.code == 'ENOENT' log.info e unless e.code == 'ENOENT'
setting_save = (settings) -> setting_save = global.setting_save = (settings) ->
fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2)) fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2))
return return
setting_change = (settings, path, val) -> setting_change = global.setting_change = (settings, path, val) ->
# 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(':')
...@@ -161,7 +161,7 @@ setting_change = (settings, path, val) -> ...@@ -161,7 +161,7 @@ setting_change = (settings, path, val) ->
setting_save(settings) setting_save(settings)
return return
VIP_generate_cdkeys = (key_type, count) -> VIP_generate_cdkeys = global.VIP_generate_cdkeys = (key_type, count) ->
return false unless settings.modules.vip.enabled and vip_info.cdkeys[key_type] return false unless settings.modules.vip.enabled and vip_info.cdkeys[key_type]
for i in [0...count] for i in [0...count]
key = Math.floor(Math.random() * 10000000000000000).toString() key = Math.floor(Math.random() * 10000000000000000).toString()
...@@ -170,7 +170,7 @@ VIP_generate_cdkeys = (key_type, count) -> ...@@ -170,7 +170,7 @@ VIP_generate_cdkeys = (key_type, count) ->
log.info("keys generated", key_type, count, vip_info.cdkeys[key_type].length) log.info("keys generated", key_type, count, vip_info.cdkeys[key_type].length)
return true return true
CLIENT_use_cdkey = (client, pkey) -> CLIENT_use_cdkey = global.CLIENT_use_cdkey = (client, pkey) ->
return 0 unless settings.modules.vip.enabled and pkey return 0 unless settings.modules.vip.enabled and pkey
found_type = null found_type = null
for type,keys of vip_info.cdkeys for type,keys of vip_info.cdkeys
...@@ -204,7 +204,7 @@ CLIENT_use_cdkey = (client, pkey) -> ...@@ -204,7 +204,7 @@ CLIENT_use_cdkey = (client, pkey) ->
setting_save(vip_info) setting_save(vip_info)
return (if new_vip then 1 else 2) return (if new_vip then 1 else 2)
CLIENT_check_vip = (client) -> CLIENT_check_vip = global.CLIENT_check_vip = (client) ->
if !settings.modules.vip.enabled if !settings.modules.vip.enabled
return false return false
if !vip_info.players[client.name] if !vip_info.players[client.name]
...@@ -213,7 +213,7 @@ CLIENT_check_vip = (client) -> ...@@ -213,7 +213,7 @@ CLIENT_check_vip = (client) ->
return false return false
return moment().isSameOrBefore(vip_info.players[client.name].expire_date) return moment().isSameOrBefore(vip_info.players[client.name].expire_date)
CLIENT_send_vip_status = (client, display) -> CLIENT_send_vip_status = global.CLIENT_send_vip_status = (client, display) ->
if !settings.modules.vip.enabled if !settings.modules.vip.enabled
return false return false
if client.vip if client.vip
...@@ -226,7 +226,7 @@ CLIENT_send_vip_status = (client, display) -> ...@@ -226,7 +226,7 @@ CLIENT_send_vip_status = (client, display) ->
else else
ygopro.stoc_send_chat(client, "${vip_expired_part1}" + vip_info.players[client.name].expire_date + "${vip_expired_part2}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${vip_expired_part1}" + vip_info.players[client.name].expire_date + "${vip_expired_part2}", ygopro.constants.COLORS.RED)
concat_name = (name, num) -> concat_name = global.concat_name = (name, num) ->
if !name[num] if !name[num]
return null return null
res = name[num] res = name[num]
...@@ -248,7 +248,7 @@ catch ...@@ -248,7 +248,7 @@ catch
config = {} config = {}
settings = global.settings = merge(default_config, config, { arrayMerge: (destination, source) -> source }) settings = global.settings = merge(default_config, config, { arrayMerge: (destination, source) -> source })
auth = require './ygopro-auth.js' auth = global.auth = require './ygopro-auth.js'
#import old configs #import old configs
imported = false imported = false
...@@ -316,45 +316,45 @@ if imported ...@@ -316,45 +316,45 @@ if imported
# 读取数据 # 读取数据
default_data = loadJSON('./data/default_data.json') default_data = loadJSON('./data/default_data.json')
try try
tips = loadJSON('./config/tips.json') tips = global.tips = loadJSON('./config/tips.json')
if !tips.tips_zh if !tips.tips_zh
tips.tips_zh = [] tips.tips_zh = []
setting_save(tips); setting_save(tips);
catch catch
tips = default_data.tips tips = global.tips = default_data.tips
setting_save(tips) setting_save(tips)
try try
words = loadJSON('./config/words.json') words = global.words = loadJSON('./config/words.json')
catch catch
words = default_data.words words = global.words = default_data.words
setting_save(words) setting_save(words)
try try
dialogues = loadJSON('./config/dialogues.json') dialogues = global.dialogues = loadJSON('./config/dialogues.json')
if !dialogues.dialogues_custom if !dialogues.dialogues_custom
dialogues.dialogues_custom = {} dialogues.dialogues_custom = {}
setting_save(dialogues); setting_save(dialogues);
catch catch
dialogues = default_data.dialogues dialogues = global.dialogues = default_data.dialogues
setting_save(dialogues) setting_save(dialogues)
try try
badwords = loadJSON('./config/badwords.json') badwords = global.badwords = loadJSON('./config/badwords.json')
catch catch
badwords = default_data.badwords badwords = global.badwords = default_data.badwords
setting_save(badwords) setting_save(badwords)
try try
duel_log = loadJSON('./config/duel_log.json') duel_log = global.duel_log = loadJSON('./config/duel_log.json')
catch catch
duel_log = default_data.duel_log duel_log = global.duel_log = default_data.duel_log
setting_save(duel_log) setting_save(duel_log)
try try
chat_color = loadJSON('./config/chat_color.json') chat_color = global.chat_color = loadJSON('./config/chat_color.json')
catch catch
chat_color = default_data.chat_color chat_color = global.chat_color = default_data.chat_color
setting_save(chat_color) setting_save(chat_color)
try try
vip_info = loadJSON('./config/vip_info.json') vip_info = global.vip_info = loadJSON('./config/vip_info.json')
catch catch
vip_info = default_data.vip_info vip_info = global.vip_info = default_data.vip_info
setting_save(vip_info) setting_save(vip_info)
try try
...@@ -365,7 +365,7 @@ catch ...@@ -365,7 +365,7 @@ catch
#settings.version = settings.version_default #settings.version = settings.version_default
log.info "ygopro version 0x"+settings.version.toString(16), "(from config)" log.info "ygopro version 0x"+settings.version.toString(16), "(from config)"
# load the lflist of current date # load the lflist of current date
lflists = [] lflists = global.lflists = []
# expansions/lflist # expansions/lflist
try try
for list in fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g) for list in fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g)
...@@ -401,14 +401,14 @@ if settings.modules.windbot.enabled ...@@ -401,14 +401,14 @@ if settings.modules.windbot.enabled
if settings.modules.heartbeat_detection.enabled if settings.modules.heartbeat_detection.enabled
long_resolve_cards = loadJSON('./data/long_resolve_cards.json') long_resolve_cards = global.long_resolve_cards = loadJSON('./data/long_resolve_cards.json')
if settings.modules.pre_release_compat.enabled if settings.modules.pre_release_compat.enabled
sqlite3 = require('sqlite3').verbose() sqlite3 = require('sqlite3').verbose()
# 组件 # 组件
ygopro = require './ygopro.js' ygopro = global.ygopro = require './ygopro.js'
roomlist = require './roomlist.js' if settings.modules.http.websocket_roomlist roomlist = global.roomlist = require './roomlist.js' if settings.modules.http.websocket_roomlist
if settings.modules.i18n.auto_pick if settings.modules.i18n.auto_pick
geoip = require('geoip-country-lite') geoip = require('geoip-country-lite')
...@@ -528,8 +528,8 @@ if settings.modules.vip.enabled ...@@ -528,8 +528,8 @@ if settings.modules.vip.enabled
VIP_generate_cdkeys(k, settings.modules.vip.generate_count) VIP_generate_cdkeys(k, settings.modules.vip.generate_count)
# 获取可用内存 # 获取可用内存
memory_usage = 0 memory_usage = global.memory_usage = 0
get_memory_usage = ()-> get_memory_usage = get_memory_usage = ()->
prc_free = exec("free") prc_free = exec("free")
prc_free.stdout.on 'data', (data)-> prc_free.stdout.on 'data', (data)->
lines = data.toString().split(/\n/g) lines = data.toString().split(/\n/g)
...@@ -551,17 +551,17 @@ get_memory_usage = ()-> ...@@ -551,17 +551,17 @@ get_memory_usage = ()->
get_memory_usage() get_memory_usage()
setInterval(get_memory_usage, 3000) setInterval(get_memory_usage, 3000)
Cloud_replay_ids = [] Cloud_replay_ids = global.Cloud_replay_ids = []
ROOM_all = [] ROOM_all = global.ROOM_all = []
ROOM_players_oppentlist = {} ROOM_players_oppentlist = global.ROOM_players_oppentlist = {}
ROOM_players_banned = [] ROOM_players_banned = global.ROOM_players_banned = []
ROOM_players_scores = {} ROOM_players_scores = global.ROOM_players_scores = {}
ROOM_connected_ip = {} ROOM_connected_ip = global.ROOM_connected_ip = {}
ROOM_bad_ip = {} ROOM_bad_ip = global.ROOM_bad_ip = {}
# ban a user manually and permanently # ban a user manually and permanently
ban_user = (name) -> ban_user = global.ban_user = (name) ->
settings.ban.banned_user.push(name) settings.ban.banned_user.push(name)
setting_save(settings) setting_save(settings)
bad_ip=0 bad_ip=0
...@@ -578,7 +578,7 @@ ban_user = (name) -> ...@@ -578,7 +578,7 @@ ban_user = (name) ->
return return
# automatically ban user to use random duel # automatically ban user to use random duel
ROOM_ban_player = (name, ip, reason, countadd = 1)-> ROOM_ban_player = global.ROOM_ban_player = (name, ip, reason, countadd = 1)->
return if settings.modules.test_mode.no_ban_player return if settings.modules.test_mode.no_ban_player
bannedplayer = _.find ROOM_players_banned, (bannedplayer)-> bannedplayer = _.find ROOM_players_banned, (bannedplayer)->
ip == bannedplayer.ip ip == bannedplayer.ip
...@@ -595,28 +595,28 @@ ROOM_ban_player = (name, ip, reason, countadd = 1)-> ...@@ -595,28 +595,28 @@ 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_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}
ROOM_players_scores[name].win = ROOM_players_scores[name].win + 1 ROOM_players_scores[name].win = ROOM_players_scores[name].win + 1
ROOM_players_scores[name].combo = ROOM_players_scores[name].combo + 1 ROOM_players_scores[name].combo = ROOM_players_scores[name].combo + 1
return return
ROOM_player_lose = (name)-> ROOM_player_lose = global.ROOM_player_lose = (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}
ROOM_players_scores[name].lose = ROOM_players_scores[name].lose + 1 ROOM_players_scores[name].lose = ROOM_players_scores[name].lose + 1
ROOM_players_scores[name].combo = 0 ROOM_players_scores[name].combo = 0
return return
ROOM_player_flee = (name)-> ROOM_player_flee = global.ROOM_player_flee = (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}
ROOM_players_scores[name].flee = ROOM_players_scores[name].flee + 1 ROOM_players_scores[name].flee = ROOM_players_scores[name].flee + 1
ROOM_players_scores[name].combo = 0 ROOM_players_scores[name].combo = 0
return return
ROOM_player_get_score = (player)-> ROOM_player_get_score = global.ROOM_player_get_score = (player)->
name = player.name_vpass name = player.name_vpass
score = ROOM_players_scores[name] score = ROOM_players_scores[name]
if !score if !score
...@@ -653,7 +653,7 @@ if settings.modules.random_duel.post_match_scores ...@@ -653,7 +653,7 @@ if settings.modules.random_duel.post_match_scores
return return
, 60000) , 60000)
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()
if settings.modules.windbot.enabled and (uname[0...2] == 'AI' or (!settings.modules.random_duel.enabled and uname == '')) if settings.modules.windbot.enabled and (uname[0...2] == 'AI' or (!settings.modules.random_duel.enabled and uname == ''))
return ROOM_find_or_create_ai(name) return ROOM_find_or_create_ai(name)
...@@ -666,7 +666,7 @@ ROOM_find_or_create_by_name = (name, player_ip)-> ...@@ -666,7 +666,7 @@ ROOM_find_or_create_by_name = (name, player_ip)->
else else
return new Room(name) return new Room(name)
ROOM_find_or_create_random = (type, player_ip)-> ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_ip)->
bannedplayer = _.find ROOM_players_banned, (bannedplayer)-> bannedplayer = _.find ROOM_players_banned, (bannedplayer)->
return player_ip == bannedplayer.ip return player_ip == bannedplayer.ip
if bannedplayer if bannedplayer
...@@ -706,7 +706,7 @@ ROOM_find_or_create_random = (type, player_ip)-> ...@@ -706,7 +706,7 @@ ROOM_find_or_create_random = (type, player_ip)->
if result.random_type=='M' then result.welcome = result.welcome + '\n${random_duel_enter_room_match}' if result.random_type=='M' then result.welcome = result.welcome + '\n${random_duel_enter_room_match}'
return result return result
ROOM_find_or_create_ai = (name)-> ROOM_find_or_create_ai = global.ROOM_find_or_create_ai = (name)->
if name == '' if name == ''
name = 'AI' name = 'AI'
namea = name.split('#') namea = name.split('#')
...@@ -734,21 +734,25 @@ ROOM_find_or_create_ai = (name)-> ...@@ -734,21 +734,25 @@ ROOM_find_or_create_ai = (name)->
result.private = true result.private = true
return result return result
ROOM_find_by_name = (name)-> ROOM_find_by_name = global.ROOM_find_by_name = (name)->
result = _.find ROOM_all, (room)-> result = _.find ROOM_all, (room)->
return room and room.name == name return room and room.name == name
return result return result
ROOM_find_by_title = (title)-> ROOM_find_by_title = global.ROOM_find_by_title = (title)->
result = _.find ROOM_all, (room)-> result = _.find ROOM_all, (room)->
return room and room.title == title return room and room.title == title
return result return result
ROOM_find_by_port = (port)-> ROOM_find_by_port = global.ROOM_find_by_port = (port)->
_.find ROOM_all, (room)-> _.find ROOM_all, (room)->
return room and room.port == port return room and room.port == port
ROOM_validate = (name)-> ROOM_find_by_pid = global.ROOM_find_by_pid = (pid)->
_.find ROOM_all, (room)->
return room and room.process_pid == pid
ROOM_validate = global.ROOM_validate = (name)->
client_name_and_pass = name.split('$', 2) client_name_and_pass = name.split('$', 2)
client_name = client_name_and_pass[0] client_name = client_name_and_pass[0]
client_pass = client_name_and_pass[1] client_pass = client_name_and_pass[1]
...@@ -760,7 +764,7 @@ ROOM_validate = (name)-> ...@@ -760,7 +764,7 @@ ROOM_validate = (name)->
room_pass = room_name_and_pass[1] room_pass = room_name_and_pass[1]
client_name == room_name and client_pass != room_pass client_name == room_name and client_pass != room_pass
ROOM_unwelcome = (room, bad_player, reason)-> ROOM_unwelcome = global.ROOM_unwelcome = (room, bad_player, reason)->
return unless room return unless room
for player in room.players for player in room.players
if player and player == bad_player if player and player == bad_player
...@@ -770,7 +774,7 @@ ROOM_unwelcome = (room, bad_player, reason)-> ...@@ -770,7 +774,7 @@ ROOM_unwelcome = (room, bad_player, reason)->
ygopro.stoc_send_chat(player, "${unwelcome_tip_part1}#{reason}${unwelcome_tip_part2}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(player, "${unwelcome_tip_part1}#{reason}${unwelcome_tip_part2}", ygopro.constants.COLORS.BABYBLUE)
return return
CLIENT_kick = (client) -> CLIENT_kick = global.CLIENT_kick = (client) ->
if !client if !client
return false return false
client.system_kicked = true client.system_kicked = true
...@@ -781,7 +785,7 @@ CLIENT_kick = (client) -> ...@@ -781,7 +785,7 @@ CLIENT_kick = (client) ->
client.destroy() client.destroy()
return true return true
release_disconnect = (dinfo, reconnected) -> release_disconnect = global.release_disconnect = (dinfo, reconnected) ->
if dinfo.old_client and !reconnected if dinfo.old_client and !reconnected
dinfo.old_client.destroy() dinfo.old_client.destroy()
if dinfo.old_server and !reconnected if dinfo.old_server and !reconnected
...@@ -789,7 +793,7 @@ release_disconnect = (dinfo, reconnected) -> ...@@ -789,7 +793,7 @@ release_disconnect = (dinfo, reconnected) ->
clearTimeout(dinfo.timeout) clearTimeout(dinfo.timeout)
return return
CLIENT_get_authorize_key = (client) -> CLIENT_get_authorize_key = global.CLIENT_get_authorize_key = (client) ->
if !settings.modules.mycard.enabled and client.vpass if !settings.modules.mycard.enabled and client.vpass
return client.name_vpass return client.name_vpass
else if settings.modules.mycard.enabled or settings.modules.tournament_mode.enabled or settings.modules.challonge.enabled or client.is_local else if settings.modules.mycard.enabled or settings.modules.tournament_mode.enabled or settings.modules.challonge.enabled or client.is_local
...@@ -797,7 +801,7 @@ CLIENT_get_authorize_key = (client) -> ...@@ -797,7 +801,7 @@ CLIENT_get_authorize_key = (client) ->
else else
return client.ip + ":" + client.name return client.ip + ":" + client.name
CLIENT_reconnect_unregister = (client, reconnected, exact) -> CLIENT_reconnect_unregister = global.CLIENT_reconnect_unregister = (client, reconnected, exact) ->
if !settings.modules.reconnect.enabled if !settings.modules.reconnect.enabled
return false return false
if disconnect_list[CLIENT_get_authorize_key(client)] if disconnect_list[CLIENT_get_authorize_key(client)]
...@@ -808,7 +812,7 @@ CLIENT_reconnect_unregister = (client, reconnected, exact) -> ...@@ -808,7 +812,7 @@ CLIENT_reconnect_unregister = (client, reconnected, exact) ->
return true return true
return false return false
CLIENT_reconnect_register = (client, room_id, error) -> CLIENT_reconnect_register = global.CLIENT_reconnect_register = (client, room_id, error) ->
room = ROOM_all[room_id] room = ROOM_all[room_id]
if client.had_new_reconnection if client.had_new_reconnection
return false return false
...@@ -839,7 +843,7 @@ CLIENT_reconnect_register = (client, room_id, error) -> ...@@ -839,7 +843,7 @@ CLIENT_reconnect_register = (client, room_id, error) ->
ygopro.ctos_send(client.server, 'SURRENDER') ygopro.ctos_send(client.server, 'SURRENDER')
return true return true
CLIENT_import_data = (client, old_client, room) -> CLIENT_import_data = global.CLIENT_import_data = (client, old_client, room) ->
for player,index in room.players for player,index in room.players
if player == old_client if player == old_client
room.players[index] = client room.players[index] = client
...@@ -856,7 +860,7 @@ CLIENT_import_data = (client, old_client, room) -> ...@@ -856,7 +860,7 @@ CLIENT_import_data = (client, old_client, room) ->
old_client.had_new_reconnection = true old_client.had_new_reconnection = true
return return
SERVER_clear_disconnect = (server) -> SERVER_clear_disconnect = global.SERVER_clear_disconnect = (server) ->
return false unless settings.modules.reconnect.enabled return false unless settings.modules.reconnect.enabled
for k,v of disconnect_list for k,v of disconnect_list
if v and server == v.old_server if v and server == v.old_server
...@@ -865,7 +869,7 @@ SERVER_clear_disconnect = (server) -> ...@@ -865,7 +869,7 @@ SERVER_clear_disconnect = (server) ->
return true return true
return false return false
ROOM_clear_disconnect = (room_id) -> ROOM_clear_disconnect = global.ROOM_clear_disconnect = (room_id) ->
return false unless settings.modules.reconnect.enabled return false unless settings.modules.reconnect.enabled
for k,v of disconnect_list for k,v of disconnect_list
if v and room_id == v.room_id if v and room_id == v.room_id
...@@ -874,7 +878,7 @@ ROOM_clear_disconnect = (room_id) -> ...@@ -874,7 +878,7 @@ ROOM_clear_disconnect = (room_id) ->
return true return true
return false return false
CLIENT_is_player = (client, room) -> CLIENT_is_player = global.CLIENT_is_player = (client, room) ->
is_player = false is_player = false
for player in room.players for player in room.players
if client == player if client == player
...@@ -882,7 +886,7 @@ CLIENT_is_player = (client, room) -> ...@@ -882,7 +886,7 @@ CLIENT_is_player = (client, room) ->
break break
return is_player and client.pos <= 3 return is_player and client.pos <= 3
CLIENT_is_able_to_reconnect = (client, deckbuf) -> CLIENT_is_able_to_reconnect = global.CLIENT_is_able_to_reconnect = (client, deckbuf) ->
unless settings.modules.reconnect.enabled unless settings.modules.reconnect.enabled
return false return false
if client.system_kicked if client.system_kicked
...@@ -898,20 +902,20 @@ CLIENT_is_able_to_reconnect = (client, deckbuf) -> ...@@ -898,20 +902,20 @@ CLIENT_is_able_to_reconnect = (client, deckbuf) ->
return false return false
return true return true
CLIENT_get_kick_reconnect_target = (client, deckbuf) -> CLIENT_get_kick_reconnect_target = global.CLIENT_get_kick_reconnect_target = (client, deckbuf) ->
for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and !room.windbot for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and !room.windbot
for player in room.get_playing_player() when !player.closed and player.name == client.name and (settings.modules.challonge.enabled or player.pass == client.pass) and (settings.modules.mycard.enabled or settings.modules.tournament_mode.enabled or player.ip == client.ip or (client.vpass and client.vpass == player.vpass)) and (!deckbuf or _.isEqual(player.start_deckbuf, deckbuf)) for player in room.get_playing_player() when !player.closed and player.name == client.name and (settings.modules.challonge.enabled or player.pass == client.pass) and (settings.modules.mycard.enabled or settings.modules.tournament_mode.enabled or player.ip == client.ip or (client.vpass and client.vpass == player.vpass)) and (!deckbuf or _.isEqual(player.start_deckbuf, deckbuf))
return player return player
return null return null
CLIENT_is_able_to_kick_reconnect = (client, deckbuf) -> CLIENT_is_able_to_kick_reconnect = global.CLIENT_is_able_to_kick_reconnect = (client, deckbuf) ->
unless settings.modules.reconnect.enabled and settings.modules.reconnect.allow_kick_reconnect unless settings.modules.reconnect.enabled and settings.modules.reconnect.allow_kick_reconnect
return false return false
if !CLIENT_get_kick_reconnect_target(client, deckbuf) if !CLIENT_get_kick_reconnect_target(client, deckbuf)
return false return false
return true return true
CLIENT_send_pre_reconnect_info = (client, room, old_client) -> CLIENT_send_pre_reconnect_info = global.CLIENT_send_pre_reconnect_info = (client, room, old_client) ->
ygopro.stoc_send_chat(client, "${pre_reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${pre_reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE)
ygopro.stoc_send(client, 'JOIN_GAME', room.join_game_buffer) ygopro.stoc_send(client, 'JOIN_GAME', room.join_game_buffer)
req_pos = old_client.pos req_pos = old_client.pos
...@@ -927,7 +931,7 @@ CLIENT_send_pre_reconnect_info = (client, room, old_client) -> ...@@ -927,7 +931,7 @@ CLIENT_send_pre_reconnect_info = (client, room, old_client) ->
}) })
return return
CLIENT_send_reconnect_info = (client, server, room) -> CLIENT_send_reconnect_info = global.CLIENT_send_reconnect_info = (client, server, room) ->
client.reconnecting = true client.reconnecting = true
ygopro.stoc_send_chat(client, "${reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(client, "${reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE)
switch room.duel_stage switch room.duel_stage
...@@ -954,7 +958,7 @@ CLIENT_send_reconnect_info = (client, server, room) -> ...@@ -954,7 +958,7 @@ CLIENT_send_reconnect_info = (client, server, room) ->
break break
return return
CLIENT_pre_reconnect = (client) -> CLIENT_pre_reconnect = global.CLIENT_pre_reconnect = (client) ->
if CLIENT_is_able_to_reconnect(client) if CLIENT_is_able_to_reconnect(client)
dinfo = disconnect_list[CLIENT_get_authorize_key(client)] dinfo = disconnect_list[CLIENT_get_authorize_key(client)]
client.pre_reconnecting = true client.pre_reconnecting = true
...@@ -969,7 +973,7 @@ CLIENT_pre_reconnect = (client) -> ...@@ -969,7 +973,7 @@ CLIENT_pre_reconnect = (client) ->
CLIENT_send_pre_reconnect_info(client, ROOM_all[player.rid], player) CLIENT_send_pre_reconnect_info(client, ROOM_all[player.rid], player)
return return
CLIENT_reconnect = (client) -> CLIENT_reconnect = global.CLIENT_reconnect = (client) ->
if !CLIENT_is_able_to_reconnect(client) if !CLIENT_is_able_to_reconnect(client)
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED)
CLIENT_kick(client) CLIENT_kick(client)
...@@ -995,7 +999,7 @@ CLIENT_reconnect = (client) -> ...@@ -995,7 +999,7 @@ CLIENT_reconnect = (client) ->
CLIENT_reconnect_unregister(client, true) CLIENT_reconnect_unregister(client, true)
return return
CLIENT_kick_reconnect = (client, deckbuf) -> CLIENT_kick_reconnect = global.CLIENT_kick_reconnect = (client, deckbuf) ->
if !CLIENT_is_able_to_kick_reconnect(client) if !CLIENT_is_able_to_kick_reconnect(client)
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED)
CLIENT_kick(client) CLIENT_kick(client)
...@@ -1027,7 +1031,7 @@ CLIENT_kick_reconnect = (client, deckbuf) -> ...@@ -1027,7 +1031,7 @@ CLIENT_kick_reconnect = (client, deckbuf) ->
if settings.modules.reconnect.enabled if settings.modules.reconnect.enabled
disconnect_list = {} # {old_client, old_server, room_id, timeout, deckbuf} disconnect_list = {} # {old_client, old_server, room_id, timeout, deckbuf}
CLIENT_heartbeat_unregister = (client) -> CLIENT_heartbeat_unregister = global.CLIENT_heartbeat_unregister = (client) ->
if !settings.modules.heartbeat_detection.enabled or !client.heartbeat_timeout if !settings.modules.heartbeat_detection.enabled or !client.heartbeat_timeout
return false return false
clearTimeout(client.heartbeat_timeout) clearTimeout(client.heartbeat_timeout)
...@@ -1035,7 +1039,7 @@ CLIENT_heartbeat_unregister = (client) -> ...@@ -1035,7 +1039,7 @@ CLIENT_heartbeat_unregister = (client) ->
#log.info(2, client.name) #log.info(2, client.name)
return true return true
CLIENT_heartbeat_register = (client, send) -> CLIENT_heartbeat_register = global.CLIENT_heartbeat_register = (client, send) ->
if !settings.modules.heartbeat_detection.enabled or client.closed or client.is_post_watcher or client.pre_reconnecting or client.reconnecting or client.waiting_for_last or client.pos > 3 or client.heartbeat_protected if !settings.modules.heartbeat_detection.enabled or client.closed or client.is_post_watcher or client.pre_reconnecting or client.reconnecting or client.waiting_for_last or client.pos > 3 or client.heartbeat_protected
return false return false
if client.heartbeat_timeout if client.heartbeat_timeout
...@@ -1058,10 +1062,10 @@ CLIENT_heartbeat_register = (client, send) -> ...@@ -1058,10 +1062,10 @@ CLIENT_heartbeat_register = (client, send) ->
#log.info(1, client.name) #log.info(1, client.name)
return true return true
CLIENT_is_banned_by_mc = (client) -> CLIENT_is_banned_by_mc = global.CLIENT_is_banned_by_mc = (client) ->
return client.ban_mc and client.ban_mc.banned and moment().isBefore(client.ban_mc.until) return client.ban_mc and client.ban_mc.banned and moment().isBefore(client.ban_mc.until)
CLIENT_get_absolute_pos = (client) -> CLIENT_get_absolute_pos = global.CLIENT_get_absolute_pos = (client) ->
room = ROOM_all[client.rid] room = ROOM_all[client.rid]
if room.hostinfo.mode != 2 or client.pos > 3 if room.hostinfo.mode != 2 or client.pos > 3
return client.pos return client.pos
...@@ -1070,7 +1074,7 @@ CLIENT_get_absolute_pos = (client) -> ...@@ -1070,7 +1074,7 @@ CLIENT_get_absolute_pos = (client) ->
else else
return 1 return 1
CLIENT_get_partner = (client) -> CLIENT_get_partner = global.CLIENT_get_partner = (client) ->
room = ROOM_all[client.rid] room = ROOM_all[client.rid]
if room.hostinfo.mode != 2 or client.pos > 3 if room.hostinfo.mode != 2 or client.pos > 3
return client return client
...@@ -1079,7 +1083,7 @@ CLIENT_get_partner = (client) -> ...@@ -1079,7 +1083,7 @@ CLIENT_get_partner = (client) ->
else else
return room.dueling_players[5 - client.pos] return room.dueling_players[5 - client.pos]
CLIENT_send_replays = (client, room) -> CLIENT_send_replays = global.CLIENT_send_replays = (client, room) ->
return false unless settings.modules.replay_delay and not (settings.modules.tournament_mode.enabled and settings.modules.tournament_mode.replay_safe and settings.modules.tournament_mode.block_replay_to_player) and room.replays.length and room.hostinfo.mode == 1 and !client.replays_sent and !client.closed return false unless settings.modules.replay_delay and not (settings.modules.tournament_mode.enabled and settings.modules.tournament_mode.replay_safe and settings.modules.tournament_mode.block_replay_to_player) and room.replays.length and room.hostinfo.mode == 1 and !client.replays_sent and !client.closed
client.replays_sent = true client.replays_sent = true
i = 0 i = 0
...@@ -1090,7 +1094,7 @@ CLIENT_send_replays = (client, room) -> ...@@ -1090,7 +1094,7 @@ CLIENT_send_replays = (client, room) ->
ygopro.stoc_send(client, "REPLAY", buffer) ygopro.stoc_send(client, "REPLAY", buffer)
return true return true
SOCKET_flush_data = (sk, datas) -> SOCKET_flush_data = global.SOCKET_flush_data = (sk, datas) ->
if !sk or sk.closed if !sk or sk.closed
return false return false
for buffer in datas for buffer in datas
...@@ -1098,7 +1102,7 @@ SOCKET_flush_data = (sk, datas) -> ...@@ -1098,7 +1102,7 @@ SOCKET_flush_data = (sk, datas) ->
datas.splice(0, datas.length) datas.splice(0, datas.length)
return true return true
replace_buffer = (buffer, list, start_pos) -> replace_buffer = global.replace_buffer = (buffer, list, start_pos) ->
found = 0 found = 0
len = buffer.length len = buffer.length
if len < 4 + start_pos if len < 4 + start_pos
...@@ -1796,16 +1800,25 @@ net.createServer (client) -> ...@@ -1796,16 +1800,25 @@ net.createServer (client) ->
cancel = false cancel = false
if settings.modules.reconnect.enabled and client.pre_reconnecting and ygopro.constants.CTOS[ctos_proto] != 'UPDATE_DECK' if settings.modules.reconnect.enabled and client.pre_reconnecting and ygopro.constants.CTOS[ctos_proto] != 'UPDATE_DECK'
cancel = true cancel = true
b = ctos_buffer.slice(3, ctos_message_length - 1 + 3)
info = null
if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]
struct._setBuff(b)
info = _.clone(struct.fields)
if ygopro.ctos_follows_before[ctos_proto] and !cancel
for ctos_event in ygopro.ctos_follows_before[ctos_proto]
result = ctos_event.callback b, info, client, client.server, datas
if result and ctos_event.synchronous
cancel = true
if ygopro.ctos_follows[ctos_proto] and !cancel if ygopro.ctos_follows[ctos_proto] and !cancel
b = ctos_buffer.slice(3, ctos_message_length - 1 + 3) result = ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
info = null if result and ygopro.ctos_follows[ctos_proto].synchronous
if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]] cancel = true
struct._setBuff(b) if ygopro.ctos_follows_after[ctos_proto] and !cancel
info = _.clone(struct.fields) for ctos_event in ygopro.ctos_follows_after[ctos_proto]
if ygopro.ctos_follows[ctos_proto].synchronous result = ctos_event.callback b, info, client, client.server, datas
cancel = ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas if result and ctos_event.synchronous
else cancel = true
ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
datas.push ctos_buffer.slice(0, 2 + ctos_message_length) unless cancel datas.push ctos_buffer.slice(0, 2 + ctos_message_length) unless cancel
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length) ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0 ctos_message_length = 0
...@@ -1864,17 +1877,25 @@ net.createServer (client) -> ...@@ -1864,17 +1877,25 @@ net.createServer (client) ->
if stoc_buffer.length >= 2 + stoc_message_length if stoc_buffer.length >= 2 + stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto] #console.log "STOC", ygopro.constants.STOC[stoc_proto]
cancel = false cancel = false
stanzas = stoc_proto b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
if ygopro.stoc_follows[stoc_proto] info = null
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3) if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
info = null struct._setBuff(b)
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]] info = _.clone(struct.fields)
struct._setBuff(b) if ygopro.stoc_follows_before[stoc_proto] and !cancel
info = _.clone(struct.fields) for stoc_event in ygopro.stoc_follows_before[stoc_proto]
if ygopro.stoc_follows[stoc_proto].synchronous result = stoc_event.callback b, info, server.client, server, datas
cancel = ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas if result and stoc_event.synchronous
else cancel = true
ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas if ygopro.stoc_follows[stoc_proto] and !cancel
result = ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas
if result and ygopro.stoc_follows[stoc_proto].synchronous
cancel = true
if ygopro.stoc_follows_after[stoc_proto] and !cancel
for stoc_event in ygopro.stoc_follows_after[stoc_proto]
result = stoc_event.callback b, info, server.client, server, datas
if result and stoc_event.synchronous
cancel = true
datas.push stoc_buffer.slice(0, 2 + stoc_message_length) unless cancel datas.push stoc_buffer.slice(0, 2 + stoc_message_length) unless cancel
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length) stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0 stoc_message_length = 0
...@@ -2544,7 +2565,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)-> ...@@ -2544,7 +2565,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
return return
# 登场台词 # 登场台词
load_words = () -> load_words = global.load_words = () ->
request request
url: settings.modules.words.get url: settings.modules.words.get
json: true json: true
...@@ -2562,7 +2583,7 @@ load_words = () -> ...@@ -2562,7 +2583,7 @@ load_words = () ->
if settings.modules.words.get if settings.modules.words.get
load_words() load_words()
load_dialogues = () -> load_dialogues = global.load_dialogues = () ->
request request
url: settings.modules.dialogues.get url: settings.modules.dialogues.get
json: true json: true
...@@ -2577,7 +2598,7 @@ load_dialogues = () -> ...@@ -2577,7 +2598,7 @@ load_dialogues = () ->
return return
return return
load_dialogues_custom = () -> load_dialogues_custom = global.load_dialogues_custom = () ->
request request
url: settings.modules.dialogues.get_custom url: settings.modules.dialogues.get_custom
json: true json: true
...@@ -3051,7 +3072,7 @@ ygopro.stoc_send_random_tip_to_room = (room)-> ...@@ -3051,7 +3072,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 = ()-> load_tips = global.load_tips = ()->
request request
url: settings.modules.tips.get url: settings.modules.tips.get
json: true json: true
...@@ -3066,7 +3087,7 @@ load_tips = ()-> ...@@ -3066,7 +3087,7 @@ load_tips = ()->
return return
return return
load_tips_zh = ()-> load_tips_zh = global.load_tips_zh = ()->
request request
url: settings.modules.tips.get_zh url: settings.modules.tips.get_zh
json: true json: true
...@@ -3178,7 +3199,7 @@ ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)-> ...@@ -3178,7 +3199,7 @@ ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)->
return true return true
return false return false
report_to_big_brother = (roomname, sender, ip, level, content, match) -> report_to_big_brother = global.report_to_big_brother = (roomname, sender, ip, level, content, match) ->
return unless settings.modules.big_brother.enabled return unless settings.modules.big_brother.enabled
request.post { url : settings.modules.big_brother.post , form : { request.post { url : settings.modules.big_brother.post , form : {
accesskey: settings.modules.big_brother.accesskey, accesskey: settings.modules.big_brother.accesskey,
...@@ -3878,9 +3899,9 @@ setInterval ()-> ...@@ -3878,9 +3899,9 @@ setInterval ()->
# spawn windbot # spawn windbot
windbot_looplimit = 0 windbot_looplimit = 0
windbot_process = null windbot_process = global.windbot_process = null
spawn_windbot = () -> spawn_windbot = global.spawn_windbot = () ->
if /^win/.test(process.platform) if /^win/.test(process.platform)
windbot_bin = 'WindBot.exe' windbot_bin = 'WindBot.exe'
windbot_parameters = [] windbot_parameters = []
...@@ -4240,3 +4261,11 @@ if settings.modules.http ...@@ -4240,3 +4261,11 @@ if settings.modules.http
if settings.modules.http.websocket_roomlist and roomlist if settings.modules.http.websocket_roomlist and roomlist
roomlist.init https_server, ROOM_all roomlist.init https_server, ROOM_all
https_server.listen settings.modules.http.ssl.port https_server.listen settings.modules.http.ssl.port
if not fs.existsSync('./plugins')
fs.mkdirSync('./plugins')
plugin_list = fs.readdirSync("./plugins")
for plugin_filename in plugin_list
plugin_path = "./plugins/" + plugin_filename
require(plugin_path)
// 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_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, SOCKET_flush_data, VIP_generate_cdkeys, _, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, 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, len1, len2, lflists, list, loadJSON, load_dialogues, load_dialogues_custom, load_tips, load_tips_zh, load_words, log, long_resolve_cards, memory_usage, merge, moment, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, oldwords, options, os, path, pgClient, pg_client, pg_query, real_windbot_server_ip, rebooted, redis, redisdb, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, replace_buffer, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, sqlite3, 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_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, SOCKET_flush_data, VIP_generate_cdkeys, _, addCallback, auth, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, chat_color, concat_name, config, cppversion, crypto, date, 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, len1, len2, len3, 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, replace_buffer, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, sqlite3, 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');
...@@ -137,11 +137,11 @@ ...@@ -137,11 +137,11 @@
} }
} }
setting_save = function(settings) { setting_save = global.setting_save = function(settings) {
fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2)); fs.writeFileSync(settings.file, JSON.stringify(settings, null, 2));
}; };
setting_change = function(settings, path, val) { setting_change = global.setting_change = function(settings, path, val) {
var key, target; var key, target;
if (_.isString(val)) { if (_.isString(val)) {
log.info("setting changed", path, val); log.info("setting changed", path, val);
...@@ -161,7 +161,7 @@ ...@@ -161,7 +161,7 @@
setting_save(settings); setting_save(settings);
}; };
VIP_generate_cdkeys = function(key_type, count) { VIP_generate_cdkeys = global.VIP_generate_cdkeys = function(key_type, count) {
var i, j, key, ref; var i, j, key, ref;
if (!(settings.modules.vip.enabled && vip_info.cdkeys[key_type])) { if (!(settings.modules.vip.enabled && vip_info.cdkeys[key_type])) {
return false; return false;
...@@ -175,7 +175,7 @@ ...@@ -175,7 +175,7 @@
return true; return true;
}; };
CLIENT_use_cdkey = function(client, pkey) { CLIENT_use_cdkey = global.CLIENT_use_cdkey = function(client, pkey) {
var current_date, found_type, index, j, key, keys, len1, new_vip, ref, type; var current_date, found_type, index, j, key, keys, len1, new_vip, ref, type;
if (!(settings.modules.vip.enabled && pkey)) { if (!(settings.modules.vip.enabled && pkey)) {
return 0; return 0;
...@@ -229,7 +229,7 @@ ...@@ -229,7 +229,7 @@
return (new_vip ? 1 : 2); return (new_vip ? 1 : 2);
}; };
CLIENT_check_vip = function(client) { CLIENT_check_vip = global.CLIENT_check_vip = function(client) {
if (!settings.modules.vip.enabled) { if (!settings.modules.vip.enabled) {
return false; return false;
} }
...@@ -242,7 +242,7 @@ ...@@ -242,7 +242,7 @@
return moment().isSameOrBefore(vip_info.players[client.name].expire_date); return moment().isSameOrBefore(vip_info.players[client.name].expire_date);
}; };
CLIENT_send_vip_status = function(client, display) { CLIENT_send_vip_status = global.CLIENT_send_vip_status = function(client, display) {
if (!settings.modules.vip.enabled) { if (!settings.modules.vip.enabled) {
return false; return false;
} }
...@@ -259,7 +259,7 @@ ...@@ -259,7 +259,7 @@
} }
}; };
concat_name = function(name, num) { concat_name = global.concat_name = function(name, num) {
var count, res, temp; var count, res, temp;
if (!name[num]) { if (!name[num]) {
return null; return null;
...@@ -292,7 +292,7 @@ ...@@ -292,7 +292,7 @@
} }
}); });
auth = require('./ygopro-auth.js'); auth = global.auth = require('./ygopro-auth.js');
imported = false; imported = false;
...@@ -372,59 +372,59 @@ ...@@ -372,59 +372,59 @@
default_data = loadJSON('./data/default_data.json'); default_data = loadJSON('./data/default_data.json');
try { try {
tips = loadJSON('./config/tips.json'); tips = global.tips = loadJSON('./config/tips.json');
if (!tips.tips_zh) { if (!tips.tips_zh) {
tips.tips_zh = []; tips.tips_zh = [];
setting_save(tips); setting_save(tips);
} }
} catch (error1) { } catch (error1) {
tips = default_data.tips; tips = global.tips = default_data.tips;
setting_save(tips); setting_save(tips);
} }
try { try {
words = loadJSON('./config/words.json'); words = global.words = loadJSON('./config/words.json');
} catch (error1) { } catch (error1) {
words = default_data.words; words = global.words = default_data.words;
setting_save(words); setting_save(words);
} }
try { try {
dialogues = loadJSON('./config/dialogues.json'); dialogues = global.dialogues = loadJSON('./config/dialogues.json');
if (!dialogues.dialogues_custom) { if (!dialogues.dialogues_custom) {
dialogues.dialogues_custom = {}; dialogues.dialogues_custom = {};
setting_save(dialogues); setting_save(dialogues);
} }
} catch (error1) { } catch (error1) {
dialogues = default_data.dialogues; dialogues = global.dialogues = default_data.dialogues;
setting_save(dialogues); setting_save(dialogues);
} }
try { try {
badwords = loadJSON('./config/badwords.json'); badwords = global.badwords = loadJSON('./config/badwords.json');
} catch (error1) { } catch (error1) {
badwords = default_data.badwords; badwords = global.badwords = default_data.badwords;
setting_save(badwords); setting_save(badwords);
} }
try { try {
duel_log = loadJSON('./config/duel_log.json'); duel_log = global.duel_log = loadJSON('./config/duel_log.json');
} catch (error1) { } catch (error1) {
duel_log = default_data.duel_log; duel_log = global.duel_log = default_data.duel_log;
setting_save(duel_log); setting_save(duel_log);
} }
try { try {
chat_color = loadJSON('./config/chat_color.json'); chat_color = global.chat_color = loadJSON('./config/chat_color.json');
} catch (error1) { } catch (error1) {
chat_color = default_data.chat_color; chat_color = global.chat_color = default_data.chat_color;
setting_save(chat_color); setting_save(chat_color);
} }
try { try {
vip_info = loadJSON('./config/vip_info.json'); vip_info = global.vip_info = loadJSON('./config/vip_info.json');
} catch (error1) { } catch (error1) {
vip_info = default_data.vip_info; vip_info = global.vip_info = default_data.vip_info;
setting_save(vip_info); setting_save(vip_info);
} }
...@@ -436,7 +436,7 @@ ...@@ -436,7 +436,7 @@
log.info("ygopro version 0x" + settings.version.toString(16), "(from config)"); log.info("ygopro version 0x" + settings.version.toString(16), "(from config)");
} }
lflists = []; lflists = global.lflists = [];
try { try {
ref = fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g); ref = fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g);
...@@ -495,17 +495,17 @@ ...@@ -495,17 +495,17 @@
} }
if (settings.modules.heartbeat_detection.enabled) { if (settings.modules.heartbeat_detection.enabled) {
long_resolve_cards = loadJSON('./data/long_resolve_cards.json'); long_resolve_cards = global.long_resolve_cards = loadJSON('./data/long_resolve_cards.json');
} }
if (settings.modules.pre_release_compat.enabled) { if (settings.modules.pre_release_compat.enabled) {
sqlite3 = require('sqlite3').verbose(); sqlite3 = require('sqlite3').verbose();
} }
ygopro = require('./ygopro.js'); ygopro = global.ygopro = require('./ygopro.js');
if (settings.modules.http.websocket_roomlist) { if (settings.modules.http.websocket_roomlist) {
roomlist = require('./roomlist.js'); roomlist = global.roomlist = require('./roomlist.js');
} }
if (settings.modules.i18n.auto_pick) { if (settings.modules.i18n.auto_pick) {
...@@ -644,9 +644,9 @@ ...@@ -644,9 +644,9 @@
} }
} }
memory_usage = 0; memory_usage = global.memory_usage = 0;
get_memory_usage = function() { get_memory_usage = get_memory_usage = function() {
var prc_free; var prc_free;
prc_free = exec("free"); prc_free = exec("free");
prc_free.stdout.on('data', function(data) { prc_free.stdout.on('data', function(data) {
...@@ -673,21 +673,21 @@ ...@@ -673,21 +673,21 @@
setInterval(get_memory_usage, 3000); setInterval(get_memory_usage, 3000);
Cloud_replay_ids = []; Cloud_replay_ids = global.Cloud_replay_ids = [];
ROOM_all = []; ROOM_all = global.ROOM_all = [];
ROOM_players_oppentlist = {}; ROOM_players_oppentlist = global.ROOM_players_oppentlist = {};
ROOM_players_banned = []; ROOM_players_banned = global.ROOM_players_banned = [];
ROOM_players_scores = {}; ROOM_players_scores = global.ROOM_players_scores = {};
ROOM_connected_ip = {}; ROOM_connected_ip = global.ROOM_connected_ip = {};
ROOM_bad_ip = {}; ROOM_bad_ip = global.ROOM_bad_ip = {};
ban_user = function(name) { ban_user = global.ban_user = function(name) {
var bad_ip, len3, len4, m, n, player, ref3, room; var bad_ip, len3, len4, m, n, player, ref3, room;
settings.ban.banned_user.push(name); settings.ban.banned_user.push(name);
setting_save(settings); setting_save(settings);
...@@ -712,7 +712,7 @@ ...@@ -712,7 +712,7 @@
} }
}; };
ROOM_ban_player = function(name, ip, reason, countadd) { ROOM_ban_player = global.ROOM_ban_player = function(name, ip, reason, countadd) {
var bannedplayer, bantime; var bannedplayer, bantime;
if (countadd == null) { if (countadd == null) {
countadd = 1; countadd = 1;
...@@ -745,7 +745,7 @@ ...@@ -745,7 +745,7 @@
} }
}; };
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] = {
win: 0, win: 0,
...@@ -758,7 +758,7 @@ ...@@ -758,7 +758,7 @@
ROOM_players_scores[name].combo = ROOM_players_scores[name].combo + 1; ROOM_players_scores[name].combo = ROOM_players_scores[name].combo + 1;
}; };
ROOM_player_lose = function(name) { ROOM_player_lose = global.ROOM_player_lose = function(name) {
if (!ROOM_players_scores[name]) { if (!ROOM_players_scores[name]) {
ROOM_players_scores[name] = { ROOM_players_scores[name] = {
win: 0, win: 0,
...@@ -771,7 +771,7 @@ ...@@ -771,7 +771,7 @@
ROOM_players_scores[name].combo = 0; ROOM_players_scores[name].combo = 0;
}; };
ROOM_player_flee = function(name) { ROOM_player_flee = global.ROOM_player_flee = function(name) {
if (!ROOM_players_scores[name]) { if (!ROOM_players_scores[name]) {
ROOM_players_scores[name] = { ROOM_players_scores[name] = {
win: 0, win: 0,
...@@ -784,7 +784,7 @@ ...@@ -784,7 +784,7 @@
ROOM_players_scores[name].combo = 0; ROOM_players_scores[name].combo = 0;
}; };
ROOM_player_get_score = function(player) { ROOM_player_get_score = global.ROOM_player_get_score = function(player) {
var name, score, total; var name, score, total;
name = player.name_vpass; name = player.name_vpass;
score = ROOM_players_scores[name]; score = ROOM_players_scores[name];
...@@ -833,7 +833,7 @@ ...@@ -833,7 +833,7 @@
}, 60000); }, 60000);
} }
ROOM_find_or_create_by_name = function(name, player_ip) { ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = function(name, player_ip) {
var room, uname; var room, uname;
uname = name.toUpperCase(); uname = name.toUpperCase();
if (settings.modules.windbot.enabled && (uname.slice(0, 2) === 'AI' || (!settings.modules.random_duel.enabled && uname === ''))) { if (settings.modules.windbot.enabled && (uname.slice(0, 2) === 'AI' || (!settings.modules.random_duel.enabled && uname === ''))) {
...@@ -851,7 +851,7 @@ ...@@ -851,7 +851,7 @@
} }
}; };
ROOM_find_or_create_random = function(type, player_ip) { ROOM_find_or_create_random = global.ROOM_find_or_create_random = function(type, player_ip) {
var bannedplayer, max_player, name, playerbanned, result; var bannedplayer, max_player, name, playerbanned, result;
bannedplayer = _.find(ROOM_players_banned, function(bannedplayer) { bannedplayer = _.find(ROOM_players_banned, function(bannedplayer) {
return player_ip === bannedplayer.ip; return player_ip === bannedplayer.ip;
...@@ -900,7 +900,7 @@ ...@@ -900,7 +900,7 @@
return result; return result;
}; };
ROOM_find_or_create_ai = function(name) { ROOM_find_or_create_ai = global.ROOM_find_or_create_ai = function(name) {
var ainame, namea, result, room, uname, windbot; var ainame, namea, result, room, uname, windbot;
if (name === '') { if (name === '') {
name = 'AI'; name = 'AI';
...@@ -939,7 +939,7 @@ ...@@ -939,7 +939,7 @@
return result; return result;
}; };
ROOM_find_by_name = function(name) { ROOM_find_by_name = global.ROOM_find_by_name = function(name) {
var result; var result;
result = _.find(ROOM_all, function(room) { result = _.find(ROOM_all, function(room) {
return room && room.name === name; return room && room.name === name;
...@@ -947,7 +947,7 @@ ...@@ -947,7 +947,7 @@
return result; return result;
}; };
ROOM_find_by_title = function(title) { ROOM_find_by_title = global.ROOM_find_by_title = function(title) {
var result; var result;
result = _.find(ROOM_all, function(room) { result = _.find(ROOM_all, function(room) {
return room && room.title === title; return room && room.title === title;
...@@ -955,13 +955,19 @@ ...@@ -955,13 +955,19 @@
return result; return result;
}; };
ROOM_find_by_port = function(port) { ROOM_find_by_port = global.ROOM_find_by_port = function(port) {
return _.find(ROOM_all, function(room) { return _.find(ROOM_all, function(room) {
return room && room.port === port; return room && room.port === port;
}); });
}; };
ROOM_validate = function(name) { ROOM_find_by_pid = global.ROOM_find_by_pid = function(pid) {
return _.find(ROOM_all, function(room) {
return room && room.process_pid === pid;
});
};
ROOM_validate = global.ROOM_validate = function(name) {
var client_name, client_name_and_pass, client_pass; var client_name, client_name_and_pass, client_pass;
client_name_and_pass = name.split('$', 2); client_name_and_pass = name.split('$', 2);
client_name = client_name_and_pass[0]; client_name = client_name_and_pass[0];
...@@ -981,7 +987,7 @@ ...@@ -981,7 +987,7 @@
}); });
}; };
ROOM_unwelcome = function(room, bad_player, reason) { ROOM_unwelcome = global.ROOM_unwelcome = function(room, bad_player, reason) {
var len3, m, player, ref3; var len3, m, player, ref3;
if (!room) { if (!room) {
return; return;
...@@ -998,7 +1004,7 @@ ...@@ -998,7 +1004,7 @@
} }
}; };
CLIENT_kick = function(client) { CLIENT_kick = global.CLIENT_kick = function(client) {
if (!client) { if (!client) {
return false; return false;
} }
...@@ -1013,7 +1019,7 @@ ...@@ -1013,7 +1019,7 @@
return true; return true;
}; };
release_disconnect = function(dinfo, reconnected) { release_disconnect = global.release_disconnect = function(dinfo, reconnected) {
if (dinfo.old_client && !reconnected) { if (dinfo.old_client && !reconnected) {
dinfo.old_client.destroy(); dinfo.old_client.destroy();
} }
...@@ -1023,7 +1029,7 @@ ...@@ -1023,7 +1029,7 @@
clearTimeout(dinfo.timeout); clearTimeout(dinfo.timeout);
}; };
CLIENT_get_authorize_key = function(client) { CLIENT_get_authorize_key = global.CLIENT_get_authorize_key = function(client) {
if (!settings.modules.mycard.enabled && client.vpass) { if (!settings.modules.mycard.enabled && client.vpass) {
return client.name_vpass; return client.name_vpass;
} else if (settings.modules.mycard.enabled || settings.modules.tournament_mode.enabled || settings.modules.challonge.enabled || client.is_local) { } else if (settings.modules.mycard.enabled || settings.modules.tournament_mode.enabled || settings.modules.challonge.enabled || client.is_local) {
...@@ -1033,7 +1039,7 @@ ...@@ -1033,7 +1039,7 @@
} }
}; };
CLIENT_reconnect_unregister = function(client, reconnected, exact) { CLIENT_reconnect_unregister = global.CLIENT_reconnect_unregister = function(client, reconnected, exact) {
if (!settings.modules.reconnect.enabled) { if (!settings.modules.reconnect.enabled) {
return false; return false;
} }
...@@ -1048,7 +1054,7 @@ ...@@ -1048,7 +1054,7 @@
return false; return false;
}; };
CLIENT_reconnect_register = function(client, room_id, error) { CLIENT_reconnect_register = global.CLIENT_reconnect_register = function(client, room_id, error) {
var dinfo, room, tmot; var dinfo, room, tmot;
room = ROOM_all[room_id]; room = ROOM_all[room_id];
if (client.had_new_reconnection) { if (client.had_new_reconnection) {
...@@ -1080,7 +1086,7 @@ ...@@ -1080,7 +1086,7 @@
return true; return true;
}; };
CLIENT_import_data = function(client, old_client, room) { CLIENT_import_data = global.CLIENT_import_data = function(client, old_client, room) {
var index, key, len3, len4, m, n, player, ref3; var index, key, len3, len4, m, n, player, ref3;
ref3 = room.players; ref3 = room.players;
for (index = m = 0, len3 = ref3.length; m < len3; index = ++m) { for (index = m = 0, len3 = ref3.length; m < len3; index = ++m) {
...@@ -1107,7 +1113,7 @@ ...@@ -1107,7 +1113,7 @@
old_client.had_new_reconnection = true; old_client.had_new_reconnection = true;
}; };
SERVER_clear_disconnect = function(server) { SERVER_clear_disconnect = global.SERVER_clear_disconnect = function(server) {
if (!settings.modules.reconnect.enabled) { if (!settings.modules.reconnect.enabled) {
return false; return false;
} }
...@@ -1122,7 +1128,7 @@ ...@@ -1122,7 +1128,7 @@
return false; return false;
}; };
ROOM_clear_disconnect = function(room_id) { ROOM_clear_disconnect = global.ROOM_clear_disconnect = function(room_id) {
if (!settings.modules.reconnect.enabled) { if (!settings.modules.reconnect.enabled) {
return false; return false;
} }
...@@ -1137,7 +1143,7 @@ ...@@ -1137,7 +1143,7 @@
return false; return false;
}; };
CLIENT_is_player = function(client, room) { CLIENT_is_player = global.CLIENT_is_player = function(client, room) {
var is_player, len3, m, player, ref3; var is_player, len3, m, player, ref3;
is_player = false; is_player = false;
ref3 = room.players; ref3 = room.players;
...@@ -1151,7 +1157,7 @@ ...@@ -1151,7 +1157,7 @@
return is_player && client.pos <= 3; return is_player && client.pos <= 3;
}; };
CLIENT_is_able_to_reconnect = function(client, deckbuf) { CLIENT_is_able_to_reconnect = global.CLIENT_is_able_to_reconnect = function(client, deckbuf) {
var disconnect_info, room; var disconnect_info, room;
if (!settings.modules.reconnect.enabled) { if (!settings.modules.reconnect.enabled) {
return false; return false;
...@@ -1174,7 +1180,7 @@ ...@@ -1174,7 +1180,7 @@
return true; return true;
}; };
CLIENT_get_kick_reconnect_target = function(client, deckbuf) { CLIENT_get_kick_reconnect_target = global.CLIENT_get_kick_reconnect_target = function(client, deckbuf) {
var len3, len4, m, n, player, ref3, room; var len3, len4, m, n, player, ref3, room;
for (m = 0, len3 = ROOM_all.length; m < len3; m++) { for (m = 0, len3 = ROOM_all.length; m < len3; m++) {
room = ROOM_all[m]; room = ROOM_all[m];
...@@ -1191,7 +1197,7 @@ ...@@ -1191,7 +1197,7 @@
return null; return null;
}; };
CLIENT_is_able_to_kick_reconnect = function(client, deckbuf) { CLIENT_is_able_to_kick_reconnect = global.CLIENT_is_able_to_kick_reconnect = function(client, deckbuf) {
if (!(settings.modules.reconnect.enabled && settings.modules.reconnect.allow_kick_reconnect)) { if (!(settings.modules.reconnect.enabled && settings.modules.reconnect.allow_kick_reconnect)) {
return false; return false;
} }
...@@ -1201,7 +1207,7 @@ ...@@ -1201,7 +1207,7 @@
return true; return true;
}; };
CLIENT_send_pre_reconnect_info = function(client, room, old_client) { CLIENT_send_pre_reconnect_info = global.CLIENT_send_pre_reconnect_info = function(client, room, old_client) {
var len3, m, player, ref3, req_pos; var len3, m, player, ref3, req_pos;
ygopro.stoc_send_chat(client, "${pre_reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${pre_reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE);
ygopro.stoc_send(client, 'JOIN_GAME', room.join_game_buffer); ygopro.stoc_send(client, 'JOIN_GAME', room.join_game_buffer);
...@@ -1222,7 +1228,7 @@ ...@@ -1222,7 +1228,7 @@
} }
}; };
CLIENT_send_reconnect_info = function(client, server, room) { CLIENT_send_reconnect_info = global.CLIENT_send_reconnect_info = function(client, server, room) {
client.reconnecting = true; client.reconnecting = true;
ygopro.stoc_send_chat(client, "${reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(client, "${reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE);
switch (room.duel_stage) { switch (room.duel_stage) {
...@@ -1253,7 +1259,7 @@ ...@@ -1253,7 +1259,7 @@
} }
}; };
CLIENT_pre_reconnect = function(client) { CLIENT_pre_reconnect = global.CLIENT_pre_reconnect = function(client) {
var dinfo, player; var dinfo, player;
if (CLIENT_is_able_to_reconnect(client)) { if (CLIENT_is_able_to_reconnect(client)) {
dinfo = disconnect_list[CLIENT_get_authorize_key(client)]; dinfo = disconnect_list[CLIENT_get_authorize_key(client)];
...@@ -1270,7 +1276,7 @@ ...@@ -1270,7 +1276,7 @@
} }
}; };
CLIENT_reconnect = function(client) { CLIENT_reconnect = global.CLIENT_reconnect = function(client) {
var current_old_server, dinfo, room; var current_old_server, dinfo, room;
if (!CLIENT_is_able_to_reconnect(client)) { if (!CLIENT_is_able_to_reconnect(client)) {
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED);
...@@ -1298,7 +1304,7 @@ ...@@ -1298,7 +1304,7 @@
CLIENT_reconnect_unregister(client, true); CLIENT_reconnect_unregister(client, true);
}; };
CLIENT_kick_reconnect = function(client, deckbuf) { CLIENT_kick_reconnect = global.CLIENT_kick_reconnect = function(client, deckbuf) {
var current_old_server, player, room; var current_old_server, player, room;
if (!CLIENT_is_able_to_kick_reconnect(client)) { if (!CLIENT_is_able_to_kick_reconnect(client)) {
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED);
...@@ -1333,7 +1339,7 @@ ...@@ -1333,7 +1339,7 @@
disconnect_list = {}; disconnect_list = {};
} }
CLIENT_heartbeat_unregister = function(client) { CLIENT_heartbeat_unregister = global.CLIENT_heartbeat_unregister = function(client) {
if (!settings.modules.heartbeat_detection.enabled || !client.heartbeat_timeout) { if (!settings.modules.heartbeat_detection.enabled || !client.heartbeat_timeout) {
return false; return false;
} }
...@@ -1342,7 +1348,7 @@ ...@@ -1342,7 +1348,7 @@
return true; return true;
}; };
CLIENT_heartbeat_register = function(client, send) { CLIENT_heartbeat_register = global.CLIENT_heartbeat_register = function(client, send) {
if (!settings.modules.heartbeat_detection.enabled || client.closed || client.is_post_watcher || client.pre_reconnecting || client.reconnecting || client.waiting_for_last || client.pos > 3 || client.heartbeat_protected) { if (!settings.modules.heartbeat_detection.enabled || client.closed || client.is_post_watcher || client.pre_reconnecting || client.reconnecting || client.waiting_for_last || client.pos > 3 || client.heartbeat_protected) {
return false; return false;
} }
...@@ -1369,11 +1375,11 @@ ...@@ -1369,11 +1375,11 @@
return true; return true;
}; };
CLIENT_is_banned_by_mc = function(client) { CLIENT_is_banned_by_mc = global.CLIENT_is_banned_by_mc = function(client) {
return client.ban_mc && client.ban_mc.banned && moment().isBefore(client.ban_mc.until); return client.ban_mc && client.ban_mc.banned && moment().isBefore(client.ban_mc.until);
}; };
CLIENT_get_absolute_pos = function(client) { CLIENT_get_absolute_pos = global.CLIENT_get_absolute_pos = function(client) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (room.hostinfo.mode !== 2 || client.pos > 3) { if (room.hostinfo.mode !== 2 || client.pos > 3) {
...@@ -1385,7 +1391,7 @@ ...@@ -1385,7 +1391,7 @@
} }
}; };
CLIENT_get_partner = function(client) { CLIENT_get_partner = global.CLIENT_get_partner = function(client) {
var room; var room;
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (room.hostinfo.mode !== 2 || client.pos > 3) { if (room.hostinfo.mode !== 2 || client.pos > 3) {
...@@ -1398,7 +1404,7 @@ ...@@ -1398,7 +1404,7 @@
} }
}; };
CLIENT_send_replays = function(client, room) { CLIENT_send_replays = global.CLIENT_send_replays = function(client, room) {
var buffer, i, len3, m, ref3; var buffer, i, len3, m, ref3;
if (!(settings.modules.replay_delay && !(settings.modules.tournament_mode.enabled && settings.modules.tournament_mode.replay_safe && settings.modules.tournament_mode.block_replay_to_player) && room.replays.length && room.hostinfo.mode === 1 && !client.replays_sent && !client.closed)) { if (!(settings.modules.replay_delay && !(settings.modules.tournament_mode.enabled && settings.modules.tournament_mode.replay_safe && settings.modules.tournament_mode.block_replay_to_player) && room.replays.length && room.hostinfo.mode === 1 && !client.replays_sent && !client.closed)) {
return false; return false;
...@@ -1417,7 +1423,7 @@ ...@@ -1417,7 +1423,7 @@
return true; return true;
}; };
SOCKET_flush_data = function(sk, datas) { SOCKET_flush_data = global.SOCKET_flush_data = function(sk, datas) {
var buffer, len3, m; var buffer, len3, m;
if (!sk || sk.closed) { if (!sk || sk.closed) {
return false; return false;
...@@ -1430,7 +1436,7 @@ ...@@ -1430,7 +1436,7 @@
return true; return true;
}; };
replace_buffer = function(buffer, list, start_pos) { replace_buffer = global.replace_buffer = function(buffer, list, start_pos) {
var code, found, i, len, m, ref3, ref4; var code, found, i, len, m, ref3, ref4;
found = 0; found = 0;
len = buffer.length; len = buffer.length;
...@@ -2280,7 +2286,7 @@ ...@@ -2280,7 +2286,7 @@
} }
client.pre_establish_buffers = new Array(); client.pre_establish_buffers = new Array();
client.on('data', function(ctos_buffer) { client.on('data', function(ctos_buffer) {
var b, bad_ip_count, buffer, cancel, ctos_message_length, ctos_proto, datas, info, len3, len4, looplimit, m, n, room, struct; var b, bad_ip_count, buffer, cancel, ctos_event, ctos_message_length, ctos_proto, datas, info, len3, len4, len5, len6, looplimit, m, n, o, p, ref3, ref4, result, room, struct;
if (client.is_post_watcher) { if (client.is_post_watcher) {
room = ROOM_all[client.rid]; room = ROOM_all[client.rid];
if (room && !CLIENT_is_banned_by_mc(client)) { if (room && !CLIENT_is_banned_by_mc(client)) {
...@@ -2314,17 +2320,36 @@ ...@@ -2314,17 +2320,36 @@
if (settings.modules.reconnect.enabled && client.pre_reconnecting && ygopro.constants.CTOS[ctos_proto] !== 'UPDATE_DECK') { if (settings.modules.reconnect.enabled && client.pre_reconnecting && ygopro.constants.CTOS[ctos_proto] !== 'UPDATE_DECK') {
cancel = true; cancel = true;
} }
b = ctos_buffer.slice(3, ctos_message_length - 1 + 3);
info = null;
if (struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]) {
struct._setBuff(b);
info = _.clone(struct.fields);
}
if (ygopro.ctos_follows_before[ctos_proto] && !cancel) {
ref3 = ygopro.ctos_follows_before[ctos_proto];
for (m = 0, len3 = ref3.length; m < len3; m++) {
ctos_event = ref3[m];
result = ctos_event.callback(b, info, client, client.server, datas);
if (result && ctos_event.synchronous) {
cancel = true;
}
}
}
if (ygopro.ctos_follows[ctos_proto] && !cancel) { if (ygopro.ctos_follows[ctos_proto] && !cancel) {
b = ctos_buffer.slice(3, ctos_message_length - 1 + 3); result = ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas);
info = null; if (result && ygopro.ctos_follows[ctos_proto].synchronous) {
if (struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]) { cancel = true;
struct._setBuff(b);
info = _.clone(struct.fields);
} }
if (ygopro.ctos_follows[ctos_proto].synchronous) { }
cancel = ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas); if (ygopro.ctos_follows_after[ctos_proto] && !cancel) {
} else { ref4 = ygopro.ctos_follows_after[ctos_proto];
ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas); for (n = 0, len4 = ref4.length; n < len4; n++) {
ctos_event = ref4[n];
result = ctos_event.callback(b, info, client, client.server, datas);
if (result && ctos_event.synchronous) {
cancel = true;
}
} }
} }
if (!cancel) { if (!cancel) {
...@@ -2357,20 +2382,20 @@ ...@@ -2357,20 +2382,20 @@
return; return;
} }
if (client.established) { if (client.established) {
for (m = 0, len3 = datas.length; m < len3; m++) { for (o = 0, len5 = datas.length; o < len5; o++) {
buffer = datas[m]; buffer = datas[o];
client.server.write(buffer); client.server.write(buffer);
} }
} else { } else {
for (n = 0, len4 = datas.length; n < len4; n++) { for (p = 0, len6 = datas.length; p < len6; p++) {
buffer = datas[n]; buffer = datas[p];
client.pre_establish_buffers.push(buffer); client.pre_establish_buffers.push(buffer);
} }
} }
} }
}); });
server.on('data', function(stoc_buffer) { server.on('data', function(stoc_buffer) {
var b, buffer, cancel, datas, info, len3, looplimit, m, stanzas, stoc_message_length, stoc_proto, struct; var b, buffer, cancel, datas, info, len3, len4, len5, looplimit, m, n, o, ref3, ref4, result, stoc_event, stoc_message_length, stoc_proto, struct;
stoc_message_length = 0; stoc_message_length = 0;
stoc_proto = 0; stoc_proto = 0;
datas = []; datas = [];
...@@ -2395,18 +2420,36 @@ ...@@ -2395,18 +2420,36 @@
} else { } else {
if (stoc_buffer.length >= 2 + stoc_message_length) { if (stoc_buffer.length >= 2 + stoc_message_length) {
cancel = false; cancel = false;
stanzas = stoc_proto; b = stoc_buffer.slice(3, stoc_message_length - 1 + 3);
if (ygopro.stoc_follows[stoc_proto]) { info = null;
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3); if (struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]) {
info = null; struct._setBuff(b);
if (struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]) { info = _.clone(struct.fields);
struct._setBuff(b); }
info = _.clone(struct.fields); if (ygopro.stoc_follows_before[stoc_proto] && !cancel) {
ref3 = ygopro.stoc_follows_before[stoc_proto];
for (m = 0, len3 = ref3.length; m < len3; m++) {
stoc_event = ref3[m];
result = stoc_event.callback(b, info, server.client, server, datas);
if (result && stoc_event.synchronous) {
cancel = true;
}
} }
if (ygopro.stoc_follows[stoc_proto].synchronous) { }
cancel = ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server, datas); if (ygopro.stoc_follows[stoc_proto] && !cancel) {
} else { result = ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server, datas);
ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server, datas); if (result && ygopro.stoc_follows[stoc_proto].synchronous) {
cancel = true;
}
}
if (ygopro.stoc_follows_after[stoc_proto] && !cancel) {
ref4 = ygopro.stoc_follows_after[stoc_proto];
for (n = 0, len4 = ref4.length; n < len4; n++) {
stoc_event = ref4[n];
result = stoc_event.callback(b, info, server.client, server, datas);
if (result && stoc_event.synchronous) {
cancel = true;
}
} }
} }
if (!cancel) { if (!cancel) {
...@@ -2428,8 +2471,8 @@ ...@@ -2428,8 +2471,8 @@
} }
} }
if (server.client && !server.client.closed) { if (server.client && !server.client.closed) {
for (m = 0, len3 = datas.length; m < len3; m++) { for (o = 0, len5 = datas.length; o < len5; o++) {
buffer = datas[m]; buffer = datas[o];
server.client.write(buffer); server.client.write(buffer);
} }
} }
...@@ -3186,7 +3229,7 @@ ...@@ -3186,7 +3229,7 @@
} }
}); });
load_words = function() { load_words = global.load_words = function() {
request({ request({
url: settings.modules.words.get, url: settings.modules.words.get,
json: true json: true
...@@ -3206,7 +3249,7 @@ ...@@ -3206,7 +3249,7 @@
load_words(); load_words();
} }
load_dialogues = function() { load_dialogues = global.load_dialogues = function() {
request({ request({
url: settings.modules.dialogues.get, url: settings.modules.dialogues.get,
json: true json: true
...@@ -3222,7 +3265,7 @@ ...@@ -3222,7 +3265,7 @@
}); });
}; };
load_dialogues_custom = function() { load_dialogues_custom = global.load_dialogues_custom = function() {
request({ request({
url: settings.modules.dialogues.get_custom, url: settings.modules.dialogues.get_custom,
json: true json: true
...@@ -3898,7 +3941,7 @@ ...@@ -3898,7 +3941,7 @@
} }
}; };
load_tips = function() { load_tips = global.load_tips = function() {
request({ request({
url: settings.modules.tips.get, url: settings.modules.tips.get,
json: true json: true
...@@ -3914,7 +3957,7 @@ ...@@ -3914,7 +3957,7 @@
}); });
}; };
load_tips_zh = function() { load_tips_zh = global.load_tips_zh = function() {
request({ request({
url: settings.modules.tips.get_zh, url: settings.modules.tips.get_zh,
json: true json: true
...@@ -4077,7 +4120,7 @@ ...@@ -4077,7 +4120,7 @@
return false; return false;
}); });
report_to_big_brother = function(roomname, sender, ip, level, content, match) { report_to_big_brother = global.report_to_big_brother = function(roomname, sender, ip, level, content, match) {
if (!settings.modules.big_brother.enabled) { if (!settings.modules.big_brother.enabled) {
return; return;
} }
...@@ -5046,9 +5089,9 @@ ...@@ -5046,9 +5089,9 @@
windbot_looplimit = 0; windbot_looplimit = 0;
windbot_process = null; windbot_process = global.windbot_process = null;
spawn_windbot = function() { spawn_windbot = global.spawn_windbot = function() {
var windbot_bin, windbot_parameters; var windbot_bin, windbot_parameters;
if (/^win/.test(process.platform)) { if (/^win/.test(process.platform)) {
windbot_bin = 'WindBot.exe'; windbot_bin = 'WindBot.exe';
...@@ -5497,4 +5540,16 @@ ...@@ -5497,4 +5540,16 @@
} }
} }
if (!fs.existsSync('./plugins')) {
fs.mkdirSync('./plugins');
}
plugin_list = fs.readdirSync("./plugins");
for (m = 0, len3 = plugin_list.length; m < len3; m++) {
plugin_filename = plugin_list[m];
plugin_path = "./plugins/" + plugin_filename;
require(plugin_path);
}
}).call(this); }).call(this);
...@@ -37,26 +37,55 @@ for name, declaration of structs_declaration ...@@ -37,26 +37,55 @@ for name, declaration of structs_declaration
#消息跟踪函数 需要重构, 另暂时只支持异步, 同步没做. #消息跟踪函数 需要重构, 另暂时只支持异步, 同步没做.
@stoc_follows = {} @stoc_follows = {}
@stoc_follows_before = {}
@stoc_follows_after = {}
@ctos_follows = {} @ctos_follows = {}
@ctos_follows_before = {}
@ctos_follows_after = {}
@replace_proto = (proto, tp) ->
if typeof(proto) != "string"
return proto
changed_proto = proto
for key, value of @constants[tp]
if value == proto
changed_proto = key
break
throw "unknown proto" if !@constants[tp][changed_proto]
return changed_proto
@stoc_follow = (proto, synchronous, callback)-> @stoc_follow = (proto, synchronous, callback)->
if typeof proto == 'string' changed_proto = @replace_proto(proto, "STOC")
for key, value of @constants.STOC @stoc_follows[changed_proto] = {callback: callback, synchronous: synchronous}
if value == proto return
proto = key @stoc_follow_before = (proto, synchronous, callback)->
break changed_proto = @replace_proto(proto, "STOC")
throw "unknown proto" if !@constants.STOC[proto] if !@stoc_follows_before[changed_proto]
@stoc_follows[proto] = {callback: callback, synchronous: synchronous} @stoc_follows_before[changed_proto] = []
@stoc_follows_before[changed_proto].push({callback: callback, synchronous: synchronous})
return
@stoc_follow_after = (proto, synchronous, callback)->
changed_proto = @replace_proto(proto, "STOC")
if !@stoc_follows_after[changed_proto]
@stoc_follows_after[changed_proto] = []
@stoc_follows_after[changed_proto].push({callback: callback, synchronous: synchronous})
return return
@ctos_follow = (proto, synchronous, callback)-> @ctos_follow = (proto, synchronous, callback)->
if typeof proto == 'string' changed_proto = @replace_proto(proto, "CTOS")
for key, value of @constants.CTOS @ctos_follows[changed_proto] = {callback: callback, synchronous: synchronous}
if value == proto return
proto = key @ctos_follow_before = (proto, synchronous, callback)->
break changed_proto = @replace_proto(proto, "CTOS")
throw "unknown proto" if !@constants.CTOS[proto] if !@ctos_follows_before[changed_proto]
@ctos_follows[proto] = {callback: callback, synchronous: synchronous} @ctos_follows_before[changed_proto] = []
@ctos_follows_before[changed_proto].push({callback: callback, synchronous: synchronous})
return
@ctos_follow_after = (proto, synchronous, callback)->
changed_proto = @replace_proto(proto, "CTOS")
if !@ctos_follows_after[changed_proto]
@ctos_follows_after[changed_proto] = []
@ctos_follows_after[changed_proto].push({callback: callback, synchronous: synchronous})
return return
#消息发送函数,至少要把俩合起来.... #消息发送函数,至少要把俩合起来....
@stoc_send = (socket, proto, info)-> @stoc_send = (socket, proto, info)->
...@@ -171,4 +200,4 @@ for name, declaration of structs_declaration ...@@ -171,4 +200,4 @@ for name, declaration of structs_declaration
if client if client
client.system_kicked = true client.system_kicked = true
client.destroy() client.destroy()
return return
\ No newline at end of file
...@@ -58,50 +58,102 @@ ...@@ -58,50 +58,102 @@
this.stoc_follows = {}; this.stoc_follows = {};
this.stoc_follows_before = {};
this.stoc_follows_after = {};
this.ctos_follows = {}; this.ctos_follows = {};
this.stoc_follow = function(proto, synchronous, callback) { this.ctos_follows_before = {};
var key, ref, value;
if (typeof proto === 'string') { this.ctos_follows_after = {};
ref = this.constants.STOC;
for (key in ref) { this.replace_proto = function(proto, tp) {
value = ref[key]; var changed_proto, key, ref, value;
if (value === proto) { if (typeof proto !== "string") {
proto = key; return proto;
break; }
} changed_proto = proto;
} ref = this.constants[tp];
if (!this.constants.STOC[proto]) { for (key in ref) {
throw "unknown proto"; value = ref[key];
if (value === proto) {
changed_proto = key;
break;
} }
} }
this.stoc_follows[proto] = { if (!this.constants[tp][changed_proto]) {
throw "unknown proto";
}
return changed_proto;
};
this.stoc_follow = function(proto, synchronous, callback) {
var changed_proto;
changed_proto = this.replace_proto(proto, "STOC");
this.stoc_follows[changed_proto] = {
callback: callback, callback: callback,
synchronous: synchronous synchronous: synchronous
}; };
}; };
this.ctos_follow = function(proto, synchronous, callback) { this.stoc_follow_before = function(proto, synchronous, callback) {
var key, ref, value; var changed_proto;
if (typeof proto === 'string') { changed_proto = this.replace_proto(proto, "STOC");
ref = this.constants.CTOS; if (!this.stoc_follows_before[changed_proto]) {
for (key in ref) { this.stoc_follows_before[changed_proto] = [];
value = ref[key];
if (value === proto) {
proto = key;
break;
}
}
if (!this.constants.CTOS[proto]) {
throw "unknown proto";
}
} }
this.ctos_follows[proto] = { this.stoc_follows_before[changed_proto].push({
callback: callback,
synchronous: synchronous
});
};
this.stoc_follow_after = function(proto, synchronous, callback) {
var changed_proto;
changed_proto = this.replace_proto(proto, "STOC");
if (!this.stoc_follows_after[changed_proto]) {
this.stoc_follows_after[changed_proto] = [];
}
this.stoc_follows_after[changed_proto].push({
callback: callback,
synchronous: synchronous
});
};
this.ctos_follow = function(proto, synchronous, callback) {
var changed_proto;
changed_proto = this.replace_proto(proto, "CTOS");
this.ctos_follows[changed_proto] = {
callback: callback, callback: callback,
synchronous: synchronous synchronous: synchronous
}; };
}; };
this.ctos_follow_before = function(proto, synchronous, callback) {
var changed_proto;
changed_proto = this.replace_proto(proto, "CTOS");
if (!this.ctos_follows_before[changed_proto]) {
this.ctos_follows_before[changed_proto] = [];
}
this.ctos_follows_before[changed_proto].push({
callback: callback,
synchronous: synchronous
});
};
this.ctos_follow_after = function(proto, synchronous, callback) {
var changed_proto;
changed_proto = this.replace_proto(proto, "CTOS");
if (!this.ctos_follows_after[changed_proto]) {
this.ctos_follows_after[changed_proto] = [];
}
this.ctos_follows_after[changed_proto].push({
callback: callback,
synchronous: synchronous
});
};
this.stoc_send = function(socket, proto, info) { this.stoc_send = function(socket, proto, info) {
var buffer, header, key, ref, struct, value; var buffer, header, key, ref, struct, value;
if (socket.closed) { if (socket.closed) {
......
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