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*
.dockerignore
Dockerfile*
......
......@@ -24,6 +24,7 @@ ygopro-2pick
/ygosrv233
/challonge
/logs
/plugins
test*
*.heapsnapshot
......
......@@ -141,11 +141,11 @@ try
catch e
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))
return
setting_change = (settings, path, val) ->
setting_change = global.setting_change = (settings, path, val) ->
# path should be like "modules:welcome"
log.info("setting changed", path, val) if _.isString(val)
path=path.split(':')
......@@ -161,7 +161,7 @@ setting_change = (settings, path, val) ->
setting_save(settings)
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]
for i in [0...count]
key = Math.floor(Math.random() * 10000000000000000).toString()
......@@ -170,7 +170,7 @@ VIP_generate_cdkeys = (key_type, count) ->
log.info("keys generated", key_type, count, vip_info.cdkeys[key_type].length)
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
found_type = null
for type,keys of vip_info.cdkeys
......@@ -204,7 +204,7 @@ CLIENT_use_cdkey = (client, pkey) ->
setting_save(vip_info)
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
return false
if !vip_info.players[client.name]
......@@ -213,7 +213,7 @@ CLIENT_check_vip = (client) ->
return false
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
return false
if client.vip
......@@ -226,7 +226,7 @@ CLIENT_send_vip_status = (client, display) ->
else
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]
return null
res = name[num]
......@@ -248,7 +248,7 @@ catch
config = {}
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
imported = false
......@@ -316,45 +316,45 @@ if imported
# 读取数据
default_data = loadJSON('./data/default_data.json')
try
tips = loadJSON('./config/tips.json')
tips = global.tips = loadJSON('./config/tips.json')
if !tips.tips_zh
tips.tips_zh = []
setting_save(tips);
catch
tips = default_data.tips
tips = global.tips = default_data.tips
setting_save(tips)
try
words = loadJSON('./config/words.json')
words = global.words = loadJSON('./config/words.json')
catch
words = default_data.words
words = global.words = default_data.words
setting_save(words)
try
dialogues = loadJSON('./config/dialogues.json')
dialogues = global.dialogues = loadJSON('./config/dialogues.json')
if !dialogues.dialogues_custom
dialogues.dialogues_custom = {}
setting_save(dialogues);
catch
dialogues = default_data.dialogues
dialogues = global.dialogues = default_data.dialogues
setting_save(dialogues)
try
badwords = loadJSON('./config/badwords.json')
badwords = global.badwords = loadJSON('./config/badwords.json')
catch
badwords = default_data.badwords
badwords = global.badwords = default_data.badwords
setting_save(badwords)
try
duel_log = loadJSON('./config/duel_log.json')
duel_log = global.duel_log = loadJSON('./config/duel_log.json')
catch
duel_log = default_data.duel_log
duel_log = global.duel_log = default_data.duel_log
setting_save(duel_log)
try
chat_color = loadJSON('./config/chat_color.json')
chat_color = global.chat_color = loadJSON('./config/chat_color.json')
catch
chat_color = default_data.chat_color
chat_color = global.chat_color = default_data.chat_color
setting_save(chat_color)
try
vip_info = loadJSON('./config/vip_info.json')
vip_info = global.vip_info = loadJSON('./config/vip_info.json')
catch
vip_info = default_data.vip_info
vip_info = global.vip_info = default_data.vip_info
setting_save(vip_info)
try
......@@ -365,7 +365,7 @@ catch
#settings.version = settings.version_default
log.info "ygopro version 0x"+settings.version.toString(16), "(from config)"
# load the lflist of current date
lflists = []
lflists = global.lflists = []
# expansions/lflist
try
for list in fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g)
......@@ -401,14 +401,14 @@ if settings.modules.windbot.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
sqlite3 = require('sqlite3').verbose()
# 组件
ygopro = require './ygopro.js'
roomlist = require './roomlist.js' if settings.modules.http.websocket_roomlist
ygopro = global.ygopro = require './ygopro.js'
roomlist = global.roomlist = require './roomlist.js' if settings.modules.http.websocket_roomlist
if settings.modules.i18n.auto_pick
geoip = require('geoip-country-lite')
......@@ -528,8 +528,8 @@ if settings.modules.vip.enabled
VIP_generate_cdkeys(k, settings.modules.vip.generate_count)
# 获取可用内存
memory_usage = 0
get_memory_usage = ()->
memory_usage = global.memory_usage = 0
get_memory_usage = get_memory_usage = ()->
prc_free = exec("free")
prc_free.stdout.on 'data', (data)->
lines = data.toString().split(/\n/g)
......@@ -551,17 +551,17 @@ get_memory_usage = ()->
get_memory_usage()
setInterval(get_memory_usage, 3000)
Cloud_replay_ids = []
Cloud_replay_ids = global.Cloud_replay_ids = []
ROOM_all = []
ROOM_players_oppentlist = {}
ROOM_players_banned = []
ROOM_players_scores = {}
ROOM_connected_ip = {}
ROOM_bad_ip = {}
ROOM_all = global.ROOM_all = []
ROOM_players_oppentlist = global.ROOM_players_oppentlist = {}
ROOM_players_banned = global.ROOM_players_banned = []
ROOM_players_scores = global.ROOM_players_scores = {}
ROOM_connected_ip = global.ROOM_connected_ip = {}
ROOM_bad_ip = global.ROOM_bad_ip = {}
# ban a user manually and permanently
ban_user = (name) ->
ban_user = global.ban_user = (name) ->
settings.ban.banned_user.push(name)
setting_save(settings)
bad_ip=0
......@@ -578,7 +578,7 @@ ban_user = (name) ->
return
# 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
bannedplayer = _.find ROOM_players_banned, (bannedplayer)->
ip == bannedplayer.ip
......@@ -595,28 +595,28 @@ ROOM_ban_player = (name, ip, reason, countadd = 1)->
#log.info("banned", name, ip, reason, bannedplayer.count)
return
ROOM_player_win = (name)->
ROOM_player_win = global.ROOM_player_win = (name)->
if !ROOM_players_scores[name]
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].combo = ROOM_players_scores[name].combo + 1
return
ROOM_player_lose = (name)->
ROOM_player_lose = global.ROOM_player_lose = (name)->
if !ROOM_players_scores[name]
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].combo = 0
return
ROOM_player_flee = (name)->
ROOM_player_flee = global.ROOM_player_flee = (name)->
if !ROOM_players_scores[name]
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].combo = 0
return
ROOM_player_get_score = (player)->
ROOM_player_get_score = global.ROOM_player_get_score = (player)->
name = player.name_vpass
score = ROOM_players_scores[name]
if !score
......@@ -653,7 +653,7 @@ if settings.modules.random_duel.post_match_scores
return
, 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()
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)
......@@ -666,7 +666,7 @@ ROOM_find_or_create_by_name = (name, player_ip)->
else
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)->
return player_ip == bannedplayer.ip
if bannedplayer
......@@ -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}'
return result
ROOM_find_or_create_ai = (name)->
ROOM_find_or_create_ai = global.ROOM_find_or_create_ai = (name)->
if name == ''
name = 'AI'
namea = name.split('#')
......@@ -734,21 +734,25 @@ ROOM_find_or_create_ai = (name)->
result.private = true
return result
ROOM_find_by_name = (name)->
ROOM_find_by_name = global.ROOM_find_by_name = (name)->
result = _.find ROOM_all, (room)->
return room and room.name == name
return result
ROOM_find_by_title = (title)->
ROOM_find_by_title = global.ROOM_find_by_title = (title)->
result = _.find ROOM_all, (room)->
return room and room.title == title
return result
ROOM_find_by_port = (port)->
ROOM_find_by_port = global.ROOM_find_by_port = (port)->
_.find ROOM_all, (room)->
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 = client_name_and_pass[0]
client_pass = client_name_and_pass[1]
......@@ -760,7 +764,7 @@ ROOM_validate = (name)->
room_pass = room_name_and_pass[1]
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
for player in room.players
if player and player == bad_player
......@@ -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)
return
CLIENT_kick = (client) ->
CLIENT_kick = global.CLIENT_kick = (client) ->
if !client
return false
client.system_kicked = true
......@@ -781,7 +785,7 @@ CLIENT_kick = (client) ->
client.destroy()
return true
release_disconnect = (dinfo, reconnected) ->
release_disconnect = global.release_disconnect = (dinfo, reconnected) ->
if dinfo.old_client and !reconnected
dinfo.old_client.destroy()
if dinfo.old_server and !reconnected
......@@ -789,7 +793,7 @@ release_disconnect = (dinfo, reconnected) ->
clearTimeout(dinfo.timeout)
return
CLIENT_get_authorize_key = (client) ->
CLIENT_get_authorize_key = global.CLIENT_get_authorize_key = (client) ->
if !settings.modules.mycard.enabled and client.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
......@@ -797,7 +801,7 @@ CLIENT_get_authorize_key = (client) ->
else
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
return false
if disconnect_list[CLIENT_get_authorize_key(client)]
......@@ -808,7 +812,7 @@ CLIENT_reconnect_unregister = (client, reconnected, exact) ->
return true
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]
if client.had_new_reconnection
return false
......@@ -839,7 +843,7 @@ CLIENT_reconnect_register = (client, room_id, error) ->
ygopro.ctos_send(client.server, 'SURRENDER')
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
if player == old_client
room.players[index] = client
......@@ -856,7 +860,7 @@ CLIENT_import_data = (client, old_client, room) ->
old_client.had_new_reconnection = true
return
SERVER_clear_disconnect = (server) ->
SERVER_clear_disconnect = global.SERVER_clear_disconnect = (server) ->
return false unless settings.modules.reconnect.enabled
for k,v of disconnect_list
if v and server == v.old_server
......@@ -865,7 +869,7 @@ SERVER_clear_disconnect = (server) ->
return true
return false
ROOM_clear_disconnect = (room_id) ->
ROOM_clear_disconnect = global.ROOM_clear_disconnect = (room_id) ->
return false unless settings.modules.reconnect.enabled
for k,v of disconnect_list
if v and room_id == v.room_id
......@@ -874,7 +878,7 @@ ROOM_clear_disconnect = (room_id) ->
return true
return false
CLIENT_is_player = (client, room) ->
CLIENT_is_player = global.CLIENT_is_player = (client, room) ->
is_player = false
for player in room.players
if client == player
......@@ -882,7 +886,7 @@ CLIENT_is_player = (client, room) ->
break
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
return false
if client.system_kicked
......@@ -898,20 +902,20 @@ CLIENT_is_able_to_reconnect = (client, deckbuf) ->
return false
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 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 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
return false
if !CLIENT_get_kick_reconnect_target(client, deckbuf)
return false
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(client, 'JOIN_GAME', room.join_game_buffer)
req_pos = old_client.pos
......@@ -927,7 +931,7 @@ CLIENT_send_pre_reconnect_info = (client, room, old_client) ->
})
return
CLIENT_send_reconnect_info = (client, server, room) ->
CLIENT_send_reconnect_info = global.CLIENT_send_reconnect_info = (client, server, room) ->
client.reconnecting = true
ygopro.stoc_send_chat(client, "${reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE)
switch room.duel_stage
......@@ -954,7 +958,7 @@ CLIENT_send_reconnect_info = (client, server, room) ->
break
return
CLIENT_pre_reconnect = (client) ->
CLIENT_pre_reconnect = global.CLIENT_pre_reconnect = (client) ->
if CLIENT_is_able_to_reconnect(client)
dinfo = disconnect_list[CLIENT_get_authorize_key(client)]
client.pre_reconnecting = true
......@@ -969,7 +973,7 @@ CLIENT_pre_reconnect = (client) ->
CLIENT_send_pre_reconnect_info(client, ROOM_all[player.rid], player)
return
CLIENT_reconnect = (client) ->
CLIENT_reconnect = global.CLIENT_reconnect = (client) ->
if !CLIENT_is_able_to_reconnect(client)
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED)
CLIENT_kick(client)
......@@ -995,7 +999,7 @@ CLIENT_reconnect = (client) ->
CLIENT_reconnect_unregister(client, true)
return
CLIENT_kick_reconnect = (client, deckbuf) ->
CLIENT_kick_reconnect = global.CLIENT_kick_reconnect = (client, deckbuf) ->
if !CLIENT_is_able_to_kick_reconnect(client)
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED)
CLIENT_kick(client)
......@@ -1027,7 +1031,7 @@ CLIENT_kick_reconnect = (client, deckbuf) ->
if settings.modules.reconnect.enabled
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
return false
clearTimeout(client.heartbeat_timeout)
......@@ -1035,7 +1039,7 @@ CLIENT_heartbeat_unregister = (client) ->
#log.info(2, client.name)
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
return false
if client.heartbeat_timeout
......@@ -1058,10 +1062,10 @@ CLIENT_heartbeat_register = (client, send) ->
#log.info(1, client.name)
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)
CLIENT_get_absolute_pos = (client) ->
CLIENT_get_absolute_pos = global.CLIENT_get_absolute_pos = (client) ->
room = ROOM_all[client.rid]
if room.hostinfo.mode != 2 or client.pos > 3
return client.pos
......@@ -1070,7 +1074,7 @@ CLIENT_get_absolute_pos = (client) ->
else
return 1
CLIENT_get_partner = (client) ->
CLIENT_get_partner = global.CLIENT_get_partner = (client) ->
room = ROOM_all[client.rid]
if room.hostinfo.mode != 2 or client.pos > 3
return client
......@@ -1079,7 +1083,7 @@ CLIENT_get_partner = (client) ->
else
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
client.replays_sent = true
i = 0
......@@ -1090,7 +1094,7 @@ CLIENT_send_replays = (client, room) ->
ygopro.stoc_send(client, "REPLAY", buffer)
return true
SOCKET_flush_data = (sk, datas) ->
SOCKET_flush_data = global.SOCKET_flush_data = (sk, datas) ->
if !sk or sk.closed
return false
for buffer in datas
......@@ -1098,7 +1102,7 @@ SOCKET_flush_data = (sk, datas) ->
datas.splice(0, datas.length)
return true
replace_buffer = (buffer, list, start_pos) ->
replace_buffer = global.replace_buffer = (buffer, list, start_pos) ->
found = 0
len = buffer.length
if len < 4 + start_pos
......@@ -1796,16 +1800,25 @@ net.createServer (client) ->
cancel = false
if settings.modules.reconnect.enabled and client.pre_reconnecting and ygopro.constants.CTOS[ctos_proto] != 'UPDATE_DECK'
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
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[ctos_proto].synchronous
cancel = ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
else
ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
result = ygopro.ctos_follows[ctos_proto].callback b, info, client, client.server, datas
if result and ygopro.ctos_follows[ctos_proto].synchronous
cancel = true
if ygopro.ctos_follows_after[ctos_proto] and !cancel
for ctos_event in ygopro.ctos_follows_after[ctos_proto]
result = ctos_event.callback b, info, client, client.server, datas
if result and ctos_event.synchronous
cancel = true
datas.push ctos_buffer.slice(0, 2 + ctos_message_length) unless cancel
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0
......@@ -1864,17 +1877,25 @@ net.createServer (client) ->
if stoc_buffer.length >= 2 + stoc_message_length
#console.log "STOC", ygopro.constants.STOC[stoc_proto]
cancel = false
stanzas = stoc_proto
if ygopro.stoc_follows[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
info = null
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
struct._setBuff(b)
info = _.clone(struct.fields)
if ygopro.stoc_follows[stoc_proto].synchronous
cancel = ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas
else
ygopro.stoc_follows[stoc_proto].callback b, info, server.client, server, datas
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
info = null
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
struct._setBuff(b)
info = _.clone(struct.fields)
if ygopro.stoc_follows_before[stoc_proto] and !cancel
for stoc_event in ygopro.stoc_follows_before[stoc_proto]
result = stoc_event.callback b, info, server.client, server, datas
if result and stoc_event.synchronous
cancel = true
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
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0
......@@ -2544,7 +2565,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server, datas)->
return
# 登场台词
load_words = () ->
load_words = global.load_words = () ->
request
url: settings.modules.words.get
json: true
......@@ -2562,7 +2583,7 @@ load_words = () ->
if settings.modules.words.get
load_words()
load_dialogues = () ->
load_dialogues = global.load_dialogues = () ->
request
url: settings.modules.dialogues.get
json: true
......@@ -2577,7 +2598,7 @@ load_dialogues = () ->
return
return
load_dialogues_custom = () ->
load_dialogues_custom = global.load_dialogues_custom = () ->
request
url: settings.modules.dialogues.get_custom
json: true
......@@ -3051,7 +3072,7 @@ ygopro.stoc_send_random_tip_to_room = (room)->
ygopro.stoc_send_random_tip(player)
return
load_tips = ()->
load_tips = global.load_tips = ()->
request
url: settings.modules.tips.get
json: true
......@@ -3066,7 +3087,7 @@ load_tips = ()->
return
return
load_tips_zh = ()->
load_tips_zh = global.load_tips_zh = ()->
request
url: settings.modules.tips.get_zh
json: true
......@@ -3178,7 +3199,7 @@ ygopro.ctos_follow 'SURRENDER', true, (buffer, info, client, server, datas)->
return true
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
request.post { url : settings.modules.big_brother.post , form : {
accesskey: settings.modules.big_brother.accesskey,
......@@ -3878,9 +3899,9 @@ setInterval ()->
# spawn windbot
windbot_looplimit = 0
windbot_process = null
windbot_process = global.windbot_process = null
spawn_windbot = () ->
spawn_windbot = global.spawn_windbot = () ->
if /^win/.test(process.platform)
windbot_bin = 'WindBot.exe'
windbot_parameters = []
......@@ -4240,3 +4261,11 @@ if settings.modules.http
if settings.modules.http.websocket_roomlist and roomlist
roomlist.init https_server, ROOM_all
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
(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');
......@@ -137,11 +137,11 @@
}
}
setting_save = function(settings) {
setting_save = global.setting_save = function(settings) {
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;
if (_.isString(val)) {
log.info("setting changed", path, val);
......@@ -161,7 +161,7 @@
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;
if (!(settings.modules.vip.enabled && vip_info.cdkeys[key_type])) {
return false;
......@@ -175,7 +175,7 @@
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;
if (!(settings.modules.vip.enabled && pkey)) {
return 0;
......@@ -229,7 +229,7 @@
return (new_vip ? 1 : 2);
};
CLIENT_check_vip = function(client) {
CLIENT_check_vip = global.CLIENT_check_vip = function(client) {
if (!settings.modules.vip.enabled) {
return false;
}
......@@ -242,7 +242,7 @@
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) {
return false;
}
......@@ -259,7 +259,7 @@
}
};
concat_name = function(name, num) {
concat_name = global.concat_name = function(name, num) {
var count, res, temp;
if (!name[num]) {
return null;
......@@ -292,7 +292,7 @@
}
});
auth = require('./ygopro-auth.js');
auth = global.auth = require('./ygopro-auth.js');
imported = false;
......@@ -372,59 +372,59 @@
default_data = loadJSON('./data/default_data.json');
try {
tips = loadJSON('./config/tips.json');
tips = global.tips = loadJSON('./config/tips.json');
if (!tips.tips_zh) {
tips.tips_zh = [];
setting_save(tips);
}
} catch (error1) {
tips = default_data.tips;
tips = global.tips = default_data.tips;
setting_save(tips);
}
try {
words = loadJSON('./config/words.json');
words = global.words = loadJSON('./config/words.json');
} catch (error1) {
words = default_data.words;
words = global.words = default_data.words;
setting_save(words);
}
try {
dialogues = loadJSON('./config/dialogues.json');
dialogues = global.dialogues = loadJSON('./config/dialogues.json');
if (!dialogues.dialogues_custom) {
dialogues.dialogues_custom = {};
setting_save(dialogues);
}
} catch (error1) {
dialogues = default_data.dialogues;
dialogues = global.dialogues = default_data.dialogues;
setting_save(dialogues);
}
try {
badwords = loadJSON('./config/badwords.json');
badwords = global.badwords = loadJSON('./config/badwords.json');
} catch (error1) {
badwords = default_data.badwords;
badwords = global.badwords = default_data.badwords;
setting_save(badwords);
}
try {
duel_log = loadJSON('./config/duel_log.json');
duel_log = global.duel_log = loadJSON('./config/duel_log.json');
} catch (error1) {
duel_log = default_data.duel_log;
duel_log = global.duel_log = default_data.duel_log;
setting_save(duel_log);
}
try {
chat_color = loadJSON('./config/chat_color.json');
chat_color = global.chat_color = loadJSON('./config/chat_color.json');
} catch (error1) {
chat_color = default_data.chat_color;
chat_color = global.chat_color = default_data.chat_color;
setting_save(chat_color);
}
try {
vip_info = loadJSON('./config/vip_info.json');
vip_info = global.vip_info = loadJSON('./config/vip_info.json');
} catch (error1) {
vip_info = default_data.vip_info;
vip_info = global.vip_info = default_data.vip_info;
setting_save(vip_info);
}
......@@ -436,7 +436,7 @@
log.info("ygopro version 0x" + settings.version.toString(16), "(from config)");
}
lflists = [];
lflists = global.lflists = [];
try {
ref = fs.readFileSync('ygopro/expansions/lflist.conf', 'utf8').match(/!.*/g);
......@@ -495,17 +495,17 @@
}
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) {
sqlite3 = require('sqlite3').verbose();
}
ygopro = require('./ygopro.js');
ygopro = global.ygopro = require('./ygopro.js');
if (settings.modules.http.websocket_roomlist) {
roomlist = require('./roomlist.js');
roomlist = global.roomlist = require('./roomlist.js');
}
if (settings.modules.i18n.auto_pick) {
......@@ -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;
prc_free = exec("free");
prc_free.stdout.on('data', function(data) {
......@@ -673,21 +673,21 @@
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;
settings.ban.banned_user.push(name);
setting_save(settings);
......@@ -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;
if (countadd == null) {
countadd = 1;
......@@ -745,7 +745,7 @@
}
};
ROOM_player_win = function(name) {
ROOM_player_win = global.ROOM_player_win = function(name) {
if (!ROOM_players_scores[name]) {
ROOM_players_scores[name] = {
win: 0,
......@@ -758,7 +758,7 @@
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]) {
ROOM_players_scores[name] = {
win: 0,
......@@ -771,7 +771,7 @@
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]) {
ROOM_players_scores[name] = {
win: 0,
......@@ -784,7 +784,7 @@
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;
name = player.name_vpass;
score = ROOM_players_scores[name];
......@@ -833,7 +833,7 @@
}, 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;
uname = name.toUpperCase();
if (settings.modules.windbot.enabled && (uname.slice(0, 2) === 'AI' || (!settings.modules.random_duel.enabled && uname === ''))) {
......@@ -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;
bannedplayer = _.find(ROOM_players_banned, function(bannedplayer) {
return player_ip === bannedplayer.ip;
......@@ -900,7 +900,7 @@
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;
if (name === '') {
name = 'AI';
......@@ -939,7 +939,7 @@
return result;
};
ROOM_find_by_name = function(name) {
ROOM_find_by_name = global.ROOM_find_by_name = function(name) {
var result;
result = _.find(ROOM_all, function(room) {
return room && room.name === name;
......@@ -947,7 +947,7 @@
return result;
};
ROOM_find_by_title = function(title) {
ROOM_find_by_title = global.ROOM_find_by_title = function(title) {
var result;
result = _.find(ROOM_all, function(room) {
return room && room.title === title;
......@@ -955,13 +955,19 @@
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 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;
client_name_and_pass = name.split('$', 2);
client_name = client_name_and_pass[0];
......@@ -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;
if (!room) {
return;
......@@ -998,7 +1004,7 @@
}
};
CLIENT_kick = function(client) {
CLIENT_kick = global.CLIENT_kick = function(client) {
if (!client) {
return false;
}
......@@ -1013,7 +1019,7 @@
return true;
};
release_disconnect = function(dinfo, reconnected) {
release_disconnect = global.release_disconnect = function(dinfo, reconnected) {
if (dinfo.old_client && !reconnected) {
dinfo.old_client.destroy();
}
......@@ -1023,7 +1029,7 @@
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) {
return client.name_vpass;
} else if (settings.modules.mycard.enabled || settings.modules.tournament_mode.enabled || settings.modules.challonge.enabled || client.is_local) {
......@@ -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) {
return false;
}
......@@ -1048,7 +1054,7 @@
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;
room = ROOM_all[room_id];
if (client.had_new_reconnection) {
......@@ -1080,7 +1086,7 @@
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;
ref3 = room.players;
for (index = m = 0, len3 = ref3.length; m < len3; index = ++m) {
......@@ -1107,7 +1113,7 @@
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) {
return false;
}
......@@ -1122,7 +1128,7 @@
return false;
};
ROOM_clear_disconnect = function(room_id) {
ROOM_clear_disconnect = global.ROOM_clear_disconnect = function(room_id) {
if (!settings.modules.reconnect.enabled) {
return false;
}
......@@ -1137,7 +1143,7 @@
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;
is_player = false;
ref3 = room.players;
......@@ -1151,7 +1157,7 @@
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;
if (!settings.modules.reconnect.enabled) {
return false;
......@@ -1174,7 +1180,7 @@
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;
for (m = 0, len3 = ROOM_all.length; m < len3; m++) {
room = ROOM_all[m];
......@@ -1191,7 +1197,7 @@
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)) {
return false;
}
......@@ -1201,7 +1207,7 @@
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;
ygopro.stoc_send_chat(client, "${pre_reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE);
ygopro.stoc_send(client, 'JOIN_GAME', room.join_game_buffer);
......@@ -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;
ygopro.stoc_send_chat(client, "${reconnecting_to_room}", ygopro.constants.COLORS.BABYBLUE);
switch (room.duel_stage) {
......@@ -1253,7 +1259,7 @@
}
};
CLIENT_pre_reconnect = function(client) {
CLIENT_pre_reconnect = global.CLIENT_pre_reconnect = function(client) {
var dinfo, player;
if (CLIENT_is_able_to_reconnect(client)) {
dinfo = disconnect_list[CLIENT_get_authorize_key(client)];
......@@ -1270,7 +1276,7 @@
}
};
CLIENT_reconnect = function(client) {
CLIENT_reconnect = global.CLIENT_reconnect = function(client) {
var current_old_server, dinfo, room;
if (!CLIENT_is_able_to_reconnect(client)) {
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED);
......@@ -1298,7 +1304,7 @@
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;
if (!CLIENT_is_able_to_kick_reconnect(client)) {
ygopro.stoc_send_chat(client, "${reconnect_failed}", ygopro.constants.COLORS.RED);
......@@ -1333,7 +1339,7 @@
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) {
return false;
}
......@@ -1342,7 +1348,7 @@
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) {
return false;
}
......@@ -1369,11 +1375,11 @@
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);
};
CLIENT_get_absolute_pos = function(client) {
CLIENT_get_absolute_pos = global.CLIENT_get_absolute_pos = function(client) {
var room;
room = ROOM_all[client.rid];
if (room.hostinfo.mode !== 2 || client.pos > 3) {
......@@ -1385,7 +1391,7 @@
}
};
CLIENT_get_partner = function(client) {
CLIENT_get_partner = global.CLIENT_get_partner = function(client) {
var room;
room = ROOM_all[client.rid];
if (room.hostinfo.mode !== 2 || client.pos > 3) {
......@@ -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;
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;
......@@ -1417,7 +1423,7 @@
return true;
};
SOCKET_flush_data = function(sk, datas) {
SOCKET_flush_data = global.SOCKET_flush_data = function(sk, datas) {
var buffer, len3, m;
if (!sk || sk.closed) {
return false;
......@@ -1430,7 +1436,7 @@
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;
found = 0;
len = buffer.length;
......@@ -2280,7 +2286,7 @@
}
client.pre_establish_buffers = new Array();
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) {
room = ROOM_all[client.rid];
if (room && !CLIENT_is_banned_by_mc(client)) {
......@@ -2314,17 +2320,36 @@
if (settings.modules.reconnect.enabled && client.pre_reconnecting && ygopro.constants.CTOS[ctos_proto] !== 'UPDATE_DECK') {
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) {
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);
result = ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas);
if (result && ygopro.ctos_follows[ctos_proto].synchronous) {
cancel = true;
}
if (ygopro.ctos_follows[ctos_proto].synchronous) {
cancel = ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas);
} else {
ygopro.ctos_follows[ctos_proto].callback(b, info, client, client.server, datas);
}
if (ygopro.ctos_follows_after[ctos_proto] && !cancel) {
ref4 = ygopro.ctos_follows_after[ctos_proto];
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) {
......@@ -2357,20 +2382,20 @@
return;
}
if (client.established) {
for (m = 0, len3 = datas.length; m < len3; m++) {
buffer = datas[m];
for (o = 0, len5 = datas.length; o < len5; o++) {
buffer = datas[o];
client.server.write(buffer);
}
} else {
for (n = 0, len4 = datas.length; n < len4; n++) {
buffer = datas[n];
for (p = 0, len6 = datas.length; p < len6; p++) {
buffer = datas[p];
client.pre_establish_buffers.push(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_proto = 0;
datas = [];
......@@ -2395,18 +2420,36 @@
} else {
if (stoc_buffer.length >= 2 + stoc_message_length) {
cancel = false;
stanzas = stoc_proto;
if (ygopro.stoc_follows[stoc_proto]) {
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3);
info = null;
if (struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]) {
struct._setBuff(b);
info = _.clone(struct.fields);
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3);
info = null;
if (struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]) {
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);
} else {
ygopro.stoc_follows[stoc_proto].callback(b, info, server.client, server, datas);
}
if (ygopro.stoc_follows[stoc_proto] && !cancel) {
result = 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) {
......@@ -2428,8 +2471,8 @@
}
}
if (server.client && !server.client.closed) {
for (m = 0, len3 = datas.length; m < len3; m++) {
buffer = datas[m];
for (o = 0, len5 = datas.length; o < len5; o++) {
buffer = datas[o];
server.client.write(buffer);
}
}
......@@ -3186,7 +3229,7 @@
}
});
load_words = function() {
load_words = global.load_words = function() {
request({
url: settings.modules.words.get,
json: true
......@@ -3206,7 +3249,7 @@
load_words();
}
load_dialogues = function() {
load_dialogues = global.load_dialogues = function() {
request({
url: settings.modules.dialogues.get,
json: true
......@@ -3222,7 +3265,7 @@
});
};
load_dialogues_custom = function() {
load_dialogues_custom = global.load_dialogues_custom = function() {
request({
url: settings.modules.dialogues.get_custom,
json: true
......@@ -3898,7 +3941,7 @@
}
};
load_tips = function() {
load_tips = global.load_tips = function() {
request({
url: settings.modules.tips.get,
json: true
......@@ -3914,7 +3957,7 @@
});
};
load_tips_zh = function() {
load_tips_zh = global.load_tips_zh = function() {
request({
url: settings.modules.tips.get_zh,
json: true
......@@ -4077,7 +4120,7 @@
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) {
return;
}
......@@ -5046,9 +5089,9 @@
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;
if (/^win/.test(process.platform)) {
windbot_bin = 'WindBot.exe';
......@@ -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);
......@@ -37,26 +37,55 @@ for name, declaration of structs_declaration
#消息跟踪函数 需要重构, 另暂时只支持异步, 同步没做.
@stoc_follows = {}
@stoc_follows_before = {}
@stoc_follows_after = {}
@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)->
if typeof proto == 'string'
for key, value of @constants.STOC
if value == proto
proto = key
break
throw "unknown proto" if !@constants.STOC[proto]
@stoc_follows[proto] = {callback: callback, synchronous: synchronous}
changed_proto = @replace_proto(proto, "STOC")
@stoc_follows[changed_proto] = {callback: callback, synchronous: synchronous}
return
@stoc_follow_before = (proto, synchronous, callback)->
changed_proto = @replace_proto(proto, "STOC")
if !@stoc_follows_before[changed_proto]
@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
@ctos_follow = (proto, synchronous, callback)->
if typeof proto == 'string'
for key, value of @constants.CTOS
if value == proto
proto = key
break
throw "unknown proto" if !@constants.CTOS[proto]
@ctos_follows[proto] = {callback: callback, synchronous: synchronous}
changed_proto = @replace_proto(proto, "CTOS")
@ctos_follows[changed_proto] = {callback: callback, synchronous: synchronous}
return
@ctos_follow_before = (proto, synchronous, callback)->
changed_proto = @replace_proto(proto, "CTOS")
if !@ctos_follows_before[changed_proto]
@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
#消息发送函数,至少要把俩合起来....
@stoc_send = (socket, proto, info)->
......@@ -171,4 +200,4 @@ for name, declaration of structs_declaration
if client
client.system_kicked = true
client.destroy()
return
\ No newline at end of file
return
......@@ -58,50 +58,102 @@
this.stoc_follows = {};
this.stoc_follows_before = {};
this.stoc_follows_after = {};
this.ctos_follows = {};
this.stoc_follow = function(proto, synchronous, callback) {
var key, ref, value;
if (typeof proto === 'string') {
ref = this.constants.STOC;
for (key in ref) {
value = ref[key];
if (value === proto) {
proto = key;
break;
}
}
if (!this.constants.STOC[proto]) {
throw "unknown proto";
this.ctos_follows_before = {};
this.ctos_follows_after = {};
this.replace_proto = function(proto, tp) {
var changed_proto, key, ref, value;
if (typeof proto !== "string") {
return proto;
}
changed_proto = proto;
ref = this.constants[tp];
for (key in ref) {
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,
synchronous: synchronous
};
};
this.ctos_follow = function(proto, synchronous, callback) {
var key, ref, value;
if (typeof proto === 'string') {
ref = this.constants.CTOS;
for (key in ref) {
value = ref[key];
if (value === proto) {
proto = key;
break;
}
}
if (!this.constants.CTOS[proto]) {
throw "unknown proto";
}
this.stoc_follow_before = function(proto, synchronous, callback) {
var changed_proto;
changed_proto = this.replace_proto(proto, "STOC");
if (!this.stoc_follows_before[changed_proto]) {
this.stoc_follows_before[changed_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,
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) {
var buffer, header, key, ref, struct, value;
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