Commit 1396cf30 authored by 神楽坂玲奈's avatar 神楽坂玲奈

auto lflist

parent 54869740
...@@ -12,7 +12,6 @@ ...@@ -12,7 +12,6 @@
"enable_random_duel": false, "enable_random_duel": false,
"mycard_auth": "https://ygobbs.com", "mycard_auth": "https://ygobbs.com",
"post_start_watching": true, "post_start_watching": true,
"TCG_banlist_id": 8,
"enable_TCG_as_default": false, "enable_TCG_as_default": false,
"http": { "http": {
"port": 7922, "port": 7922,
......
...@@ -9,21 +9,23 @@ roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist ...@@ -9,21 +9,23 @@ roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist
bunyan = require 'bunyan' bunyan = require 'bunyan'
moment = require 'moment' moment = require 'moment'
#redis = require 'redis' #redis = require 'redis'
moment.locale('zh-cn', { relativeTime : { moment.locale('zh-cn', {
future : '%s内', relativeTime: {
past : '%s前', future: '%s内',
s : '%d秒', past: '%s前',
m : '1分钟', s: '%d秒',
mm : '%d分钟', m: '1分钟',
h : '1小时', mm: '%d分钟',
hh : '%d小时', h: '1小时',
d : '1天', hh: '%d小时',
dd : '%d天', d: '1天',
M : '1个月', dd: '%d天',
MM : '%d个月', M: '1个月',
y : '1年', MM: '%d个月',
yy : '%d年' y: '1年',
}}) yy: '%d年'
}
})
log = bunyan.createLogger name: "mycard-room" log = bunyan.createLogger name: "mycard-room"
#redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port #redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
...@@ -58,16 +60,16 @@ class Room ...@@ -58,16 +60,16 @@ class Room
@ban_player: (name, ip, reason)-> @ban_player: (name, ip, reason)->
bannedplayer = _.find Room.players_banned, (bannedplayer)-> bannedplayer = _.find Room.players_banned, (bannedplayer)->
ip==bannedplayer.ip ip == bannedplayer.ip
if bannedplayer if bannedplayer
bannedplayer.count=bannedplayer.count+1 bannedplayer.count = bannedplayer.count + 1
bantime=if bannedplayer.count > 3 then Math.pow(2,bannedplayer.count-3)*2 else 0 bantime = if bannedplayer.count > 3 then Math.pow(2, bannedplayer.count - 3) * 2 else 0
bannedplayer.time=if moment()<bannedplayer.time then moment(bannedplayer.time).add(bantime,'m') else moment().add(bantime,'m') bannedplayer.time = if moment() < bannedplayer.time then moment(bannedplayer.time).add(bantime, 'm') else moment().add(bantime, 'm')
bannedplayer.reasons.push(reason) if not _.find bannedplayer.reasons, (bannedreason)-> bannedplayer.reasons.push(reason) if not _.find bannedplayer.reasons, (bannedreason)->
bannedreason==reason bannedreason == reason
bannedplayer.need_tip=true; bannedplayer.need_tip = true;
else else
bannedplayer={"ip": ip, "time": moment(), "count": 1, "reasons": [reason], "need_tip": true} bannedplayer = {"ip": ip, "time": moment(), "count": 1, "reasons": [reason], "need_tip": true}
Room.players_banned.push(bannedplayer) Room.players_banned.push(bannedplayer)
log.info("banned", name, ip, reason, bannedplayer.count) log.info("banned", name, ip, reason, bannedplayer.count)
return return
...@@ -77,41 +79,41 @@ class Room ...@@ -77,41 +79,41 @@ class Room
return @find_or_create_random(name.toUpperCase(), player_ip) return @find_or_create_random(name.toUpperCase(), player_ip)
if room = @find_by_name(name) if room = @find_by_name(name)
return room return room
else if get_memory_usage()>=90 else if get_memory_usage() >= 90
return null return null
else else
return new Room(name) return new Room(name)
@find_or_create_random: (type, player_ip)-> @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
if bannedplayer.count > 6 and moment()<bannedplayer.time if bannedplayer.count > 6 and moment() < bannedplayer.time
return {"error":"因为您近期在游戏中多次#{bannedplayer.reasons.join('、')},您已被禁止使用随机对战功能,将在#{moment(bannedplayer.time).fromNow(true)}后解封"} return {"error": "因为您近期在游戏中多次#{bannedplayer.reasons.join('、')},您已被禁止使用随机对战功能,将在#{moment(bannedplayer.time).fromNow(true)}后解封"}
if bannedplayer.count > 3 and moment()<bannedplayer.time and bannedplayer.need_tip if bannedplayer.count > 3 and moment() < bannedplayer.time and bannedplayer.need_tip
bannedplayer.need_tip=false bannedplayer.need_tip = false
return {"error":"因为您近期在游戏中#{bannedplayer.reasons.join('、')},在#{moment(bannedplayer.time).fromNow(true)}内您随机对战时只能遇到其他违规玩家"} return {"error": "因为您近期在游戏中#{bannedplayer.reasons.join('、')},在#{moment(bannedplayer.time).fromNow(true)}内您随机对战时只能遇到其他违规玩家"}
else if bannedplayer.need_tip else if bannedplayer.need_tip
bannedplayer.need_tip=false bannedplayer.need_tip = false
return {"error":"系统检测到您近期在游戏中#{bannedplayer.reasons.join('、')},若您违规超过3次,将受到惩罚"} return {"error": "系统检测到您近期在游戏中#{bannedplayer.reasons.join('、')},若您违规超过3次,将受到惩罚"}
else if bannedplayer.count > 2 else if bannedplayer.count > 2
bannedplayer.need_tip=true bannedplayer.need_tip = true
max_player = if type == 'T' then 4 else 2 max_player = if type == 'T' then 4 else 2
playerbanned=(bannedplayer and bannedplayer.count > 3 and moment()<bannedplayer.time) playerbanned = (bannedplayer and bannedplayer.count > 3 and moment() < bannedplayer.time)
result = _.find @all, (room)-> result = _.find @all, (room)->
return room.random_type != '' and !room.started and ((type == '' and room.random_type != 'T') or room.random_type == type) and room.get_playing_player().length < max_player and (room.get_host()==null or room.get_host().remoteAddress != Room.players_oppentlist[player_ip]) and (playerbanned == room.deprecated) return room.random_type != '' and !room.started and ((type == '' and room.random_type != 'T') or room.random_type == type) and room.get_playing_player().length < max_player and (room.get_host() == null or room.get_host().remoteAddress != Room.players_oppentlist[player_ip]) and (playerbanned == room.deprecated)
if result if result
result.welcome = '对手已经在等你了,开始决斗吧!' result.welcome = '对手已经在等你了,开始决斗吧!'
#log.info 'found room', player_name #log.info 'found room', player_name
else else
type = if type then type else 'S' type = if type then type else 'S'
name = type + ',RANDOM#' + Math.floor(Math.random()*100000) name = type + ',RANDOM#' + Math.floor(Math.random() * 100000)
result = new Room(name) result = new Room(name)
result.random_type = type result.random_type = type
result.max_player = max_player result.max_player = max_player
result.welcome = '已建立随机对战房间,正在等待对手!' result.welcome = '已建立随机对战房间,正在等待对手!'
result.deprecated=playerbanned result.deprecated = playerbanned
#log.info 'create room', player_name, name #log.info 'create room', player_name, name
return result return result
@find_by_name: (name)-> @find_by_name: (name)->
...@@ -125,12 +127,12 @@ class Room ...@@ -125,12 +127,12 @@ class Room
room.port == port room.port == port
@validate: (name)-> @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]
return true if !client_pass return true if !client_pass
!_.find Room.all, (room)-> !_.find Room.all, (room)->
room_name_and_pass = room.name.split('$',2) room_name_and_pass = room.name.split('$', 2)
room_name = room_name_and_pass[0] room_name = room_name_and_pass[0]
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
...@@ -150,7 +152,7 @@ class Room ...@@ -150,7 +152,7 @@ class Room
Room.all.push this Room.all.push this
@hostinfo ||= @hostinfo ||=
lflist: 0 lflist: (list)-> !list.tcg and list.date.isBefore()
rule: if settings.modules.enable_TCG_as_default then 2 else 0 rule: if settings.modules.enable_TCG_as_default then 2 else 0
mode: 0 mode: 0
enable_priority: false enable_priority: false
...@@ -177,8 +179,8 @@ class Room ...@@ -177,8 +179,8 @@ class Room
@hostinfo.start_hand = parseInt(param[7]) @hostinfo.start_hand = parseInt(param[7])
@hostinfo.draw_count = parseInt(param[8]) @hostinfo.draw_count = parseInt(param[8])
else if (((param = name.match /(.+)#/) != null) and ( (param[1].length<=2 and param[1].match(/(S|N|M|T)(0|1|2|T|A)/i)) or (param[1].match(/^(S|N|M|T)(0|1|2|O|T|A)(0|1|O|T)/i)) ) ) else if (((param = name.match /(.+)#/) != null) and ( (param[1].length <= 2 and param[1].match(/(S|N|M|T)(0|1|2|T|A)/i)) or (param[1].match(/^(S|N|M|T)(0|1|2|O|T|A)(0|1|O|T)/i)) ) )
rule=param[1].toUpperCase() rule = param[1].toUpperCase()
#log.info "C", rule #log.info "C", rule
switch rule.charAt(0) switch rule.charAt(0)
...@@ -200,12 +202,12 @@ class Room ...@@ -200,12 +202,12 @@ class Room
switch rule.charAt(2) switch rule.charAt(2)
when "1","T" when "1","T"
@hostinfo.lflist = settings.modules.TCG_banlist_id @hostinfo.lflist = _.findIndex settings.lflist, (list)-> list.tcg and list.date.isBefore()
else else
@hostinfo.lflist = 0 @hostinfo.lflist = _.findIndex settings.lflist, (list)-> !list.tcg and list.date.isBefore()
if ((param = parseInt(rule.charAt(3).match(/\d/))) >= 0) if ((param = parseInt(rule.charAt(3).match(/\d/))) >= 0)
@hostinfo.time_limit=param*60 @hostinfo.time_limit = param * 60
switch rule.charAt(4) switch rule.charAt(4)
when "T","1" when "T","1"
...@@ -226,16 +228,16 @@ class Room ...@@ -226,16 +228,16 @@ class Room
@hostinfo.no_shuffle_deck = false @hostinfo.no_shuffle_deck = false
if ((param = parseInt(rule.charAt(7).match(/\d/))) > 0) if ((param = parseInt(rule.charAt(7).match(/\d/))) > 0)
@hostinfo.start_lp=param*4000 @hostinfo.start_lp = param * 4000
if ((param = parseInt(rule.charAt(8).match(/\d/))) > 0) if ((param = parseInt(rule.charAt(8).match(/\d/))) > 0)
@hostinfo.start_hand=param @hostinfo.start_hand = param
if ((param = parseInt(rule.charAt(9).match(/\d/))) >= 0) if ((param = parseInt(rule.charAt(9).match(/\d/))) >= 0)
@hostinfo.draw_count=param @hostinfo.draw_count = param
else if ((param = name.match /(.+)#/) != null) else if ((param = name.match /(.+)#/) != null)
rule=param[1].toUpperCase() rule = param[1].toUpperCase()
#log.info "233", rule #log.info "233", rule
if (rule.match /(^|,|,)(M|MATCH)(,|,|$)/) if (rule.match /(^|,|,)(M|MATCH)(,|,|$)/)
...@@ -247,7 +249,7 @@ class Room ...@@ -247,7 +249,7 @@ class Room
if (rule.match /(^|,|,)(TCGONLY|TO)(,|,|$)/) if (rule.match /(^|,|,)(TCGONLY|TO)(,|,|$)/)
@hostinfo.rule = 1 @hostinfo.rule = 1
@hostinfo.lflist = settings.modules.TCG_banlist_id @hostinfo.lflist = _.findIndex settings.lflist, (list)-> list.tcg and list.date.isBefore()
if (rule.match /(^|,|,)(OCGONLY|OO)(,|,|$)/) if (rule.match /(^|,|,)(OCGONLY|OO)(,|,|$)/)
@hostinfo.rule = 0 @hostinfo.rule = 0
...@@ -264,7 +266,7 @@ class Room ...@@ -264,7 +266,7 @@ class Room
if (param = rule.match /(^|,|,)(TIME|TM|TI)(\d+)(,|,|$)/) if (param = rule.match /(^|,|,)(TIME|TM|TI)(\d+)(,|,|$)/)
time_limit = parseInt(param[3]) time_limit = parseInt(param[3])
if (time_limit < 0) then time_limit = 180 if (time_limit < 0) then time_limit = 180
if (time_limit >= 1 and time_limit <= 60) then time_limit = time_limit*60 if (time_limit >= 1 and time_limit <= 60) then time_limit = time_limit * 60
if (time_limit >= 999) then time_limit = 999 if (time_limit >= 999) then time_limit = 999
@hostinfo.time_limit = time_limit @hostinfo.time_limit = time_limit
...@@ -280,7 +282,7 @@ class Room ...@@ -280,7 +282,7 @@ class Room
@hostinfo.draw_count = draw_count @hostinfo.draw_count = draw_count
if (param = rule.match /(^|,|,)(LFLIST|LF)(\d+)(,|,|$)/) if (param = rule.match /(^|,|,)(LFLIST|LF)(\d+)(,|,|$)/)
lflist = parseInt(param[3])-1 lflist = parseInt(param[3]) - 1
@hostinfo.lflist = lflist @hostinfo.lflist = lflist
if (rule.match /(^|,|,)(NOLFLIST|NF)(,|,|$)/) if (rule.match /(^|,|,)(NOLFLIST|NF)(,|,|$)/)
...@@ -298,7 +300,9 @@ class Room ...@@ -298,7 +300,9 @@ class Room
if (rule.match /(^|,|,)(IGPRIORITY|PR)(,|,|$)/) if (rule.match /(^|,|,)(IGPRIORITY|PR)(,|,|$)/)
@hostinfo.enable_priority = true @hostinfo.enable_priority = true
param = [0, @hostinfo.lflist, @hostinfo.rule, @hostinfo.mode, (if @hostinfo.enable_priority then 'T' else 'F'), (if @hostinfo.no_check_deck then 'T' else 'F'), (if @hostinfo.no_shuffle_deck then 'T' else 'F'), @hostinfo.start_lp, @hostinfo.start_hand, @hostinfo.draw_count, @hostinfo.time_limit] param = [0, @hostinfo.lflist, @hostinfo.rule, @hostinfo.mode, (if @hostinfo.enable_priority then 'T' else 'F'),
(if @hostinfo.no_check_deck then 'T' else 'F'), (if @hostinfo.no_shuffle_deck then 'T' else 'F'),
@hostinfo.start_lp, @hostinfo.start_hand, @hostinfo.draw_count, @hostinfo.time_limit]
try try
@process = spawn './ygopro', param, {cwd: settings.ygopro_path} @process = spawn './ygopro', param, {cwd: settings.ygopro_path}
...@@ -312,7 +316,7 @@ class Room ...@@ -312,7 +316,7 @@ class Room
roomlist.create(this) if !@private and settings.modules.enable_websocket_roomlist roomlist.create(this) if !@private and settings.modules.enable_websocket_roomlist
@port = parseInt data @port = parseInt data
_.each @players, (player)=> _.each @players, (player)=>
player.server.connect @port, '127.0.0.1',=> player.server.connect @port, '127.0.0.1', =>
player.server.write buffer for buffer in player.pre_establish_buffers player.server.write buffer for buffer in player.pre_establish_buffers
player.established = true player.established = true
player.pre_establish_buffers = [] player.pre_establish_buffers = []
...@@ -320,19 +324,21 @@ class Room ...@@ -320,19 +324,21 @@ class Room
return return
console.log @windbot console.log @windbot
if @windbot if @windbot
spawn 'mono', ['WindBot.exe'], {cwd: 'windbot', env: { spawn 'mono', ['WindBot.exe'], {
YGOPRO_VERSION: settings.version cwd: 'windbot', env: {
YGOPRO_HOST: '127.0.0.1' YGOPRO_VERSION: settings.version
YGOPRO_PORT: @port YGOPRO_HOST: '127.0.0.1'
YGOPRO_NAME: @windbot.name YGOPRO_PORT: @port
YGOPRO_DECK: @windbot.deck YGOPRO_NAME: @windbot.name
YGOPRO_DIALOG: @windbot.dialog YGOPRO_DECK: @windbot.deck
}} YGOPRO_DIALOG: @windbot.dialog
}
}
return return
catch catch
@error = "建立房间失败,请重试" @error = "建立房间失败,请重试"
delete: -> delete: ->
#积分 #积分
return if @deleted return if @deleted
#log.info 'room-delete', this.name, Room.all.length #log.info 'room-delete', this.name, Room.all.length
### ###
...@@ -366,30 +372,30 @@ class Room ...@@ -366,30 +372,30 @@ class Room
return return
get_playing_player: -> get_playing_player: ->
playing_player=[] playing_player = []
_.each @players, (player)=> _.each @players, (player)=>
if player.pos < 4 then playing_player.push player if player.pos < 4 then playing_player.push player
return return
return playing_player return playing_player
get_host: -> get_host: ->
host_player=null host_player = null
_.each @players, (player)=> _.each @players, (player)=>
if player.is_host then host_player=player if player.is_host then host_player = player
return return
return host_player return host_player
connect: (client)-> connect: (client)->
@players.push client @players.push client
client.ip=client.remoteAddress client.ip = client.remoteAddress
if @random_type if @random_type
host_player=@get_host() host_player = @get_host()
if host_player && (host_player != client) if host_player && (host_player != client)
#进来时已经有人在等待了,互相记录为匹配过 #进来时已经有人在等待了,互相记录为匹配过
Room.players_oppentlist[host_player.remoteAddress] = client.remoteAddress Room.players_oppentlist[host_player.remoteAddress] = client.remoteAddress
Room.players_oppentlist[client.remoteAddress] = host_player.remoteAddress Room.players_oppentlist[client.remoteAddress] = host_player.remoteAddress
else else
#第一个玩家刚进来,还没就位 #第一个玩家刚进来,还没就位
Room.players_oppentlist[client.remoteAddress] = null Room.players_oppentlist[client.remoteAddress] = null
if @established if @established
...@@ -406,17 +412,17 @@ class Room ...@@ -406,17 +412,17 @@ class Room
ygopro.stoc_send_chat_to_room this, "#{client.name} #{'退出了观战'}#{if error then ": #{error}" else ''}" ygopro.stoc_send_chat_to_room this, "#{client.name} #{'退出了观战'}#{if error then ": #{error}" else ''}"
index = _.indexOf(@watchers, client) index = _.indexOf(@watchers, client)
@watchers.splice(index, 1) unless index == -1 @watchers.splice(index, 1) unless index == -1
#client.room = null #client.room = null
else else
index = _.indexOf(@players, client) index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1 @players.splice(index, 1) unless index == -1
#log.info(@started,@disconnector,client.room.random_type) #log.info(@started,@disconnector,client.room.random_type)
if @started and @disconnector!='server' and client.room.random_type if @started and @disconnector != 'server' and client.room.random_type
Room.ban_player(client.name, client.ip, "强退") Room.ban_player(client.name, client.ip, "强退")
if @players.length if @players.length
ygopro.stoc_send_chat_to_room this, "#{client.name} #{'离开了游戏'}#{if error then ": #{error}" else ''}" ygopro.stoc_send_chat_to_room this, "#{client.name} #{'离开了游戏'}#{if error then ": #{error}" else ''}"
roomlist.update(this) if !@private and !@started and settings.modules.enable_websocket_roomlist roomlist.update(this) if !@private and !@started and settings.modules.enable_websocket_roomlist
#client.room = null #client.room = null
else else
@process.kill() @process.kill()
#client.room = null #client.room = null
......
...@@ -204,7 +204,9 @@ ...@@ -204,7 +204,9 @@
this.welcome = ''; this.welcome = '';
Room.all.push(this); Room.all.push(this);
this.hostinfo || (this.hostinfo = { this.hostinfo || (this.hostinfo = {
lflist: 0, lflist: function(list) {
return !list.tcg && list.date.isBefore();
},
rule: settings.modules.enable_TCG_as_default ? 2 : 0, rule: settings.modules.enable_TCG_as_default ? 2 : 0,
mode: 0, mode: 0,
enable_priority: false, enable_priority: false,
...@@ -259,10 +261,14 @@ ...@@ -259,10 +261,14 @@
switch (rule.charAt(2)) { switch (rule.charAt(2)) {
case "1": case "1":
case "T": case "T":
this.hostinfo.lflist = settings.modules.TCG_banlist_id; this.hostinfo.lflist = _.findIndex(settings.lflist, function(list) {
return list.tcg && list.date.isBefore();
});
break; break;
default: default:
this.hostinfo.lflist = 0; this.hostinfo.lflist = _.findIndex(settings.lflist, function(list) {
return !list.tcg && list.date.isBefore();
});
} }
if ((param = parseInt(rule.charAt(3).match(/\d/))) >= 0) { if ((param = parseInt(rule.charAt(3).match(/\d/))) >= 0) {
this.hostinfo.time_limit = param * 60; this.hostinfo.time_limit = param * 60;
...@@ -311,7 +317,9 @@ ...@@ -311,7 +317,9 @@
} }
if (rule.match(/(^|,|,)(TCGONLY|TO)(,|,|$)/)) { if (rule.match(/(^|,|,)(TCGONLY|TO)(,|,|$)/)) {
this.hostinfo.rule = 1; this.hostinfo.rule = 1;
this.hostinfo.lflist = settings.modules.TCG_banlist_id; this.hostinfo.lflist = _.findIndex(settings.lflist, function(list) {
return list.tcg && list.date.isBefore();
});
} }
if (rule.match(/(^|,|,)(OCGONLY|OO)(,|,|$)/)) { if (rule.match(/(^|,|,)(OCGONLY|OO)(,|,|$)/)) {
this.hostinfo.rule = 0; this.hostinfo.rule = 0;
......
Subproject commit 58be174a410a1595e36105dc3ba6951ae70815ee Subproject commit 1da1c4fbbb8dedf2c8655d9055e417b85548e1cf
...@@ -28,8 +28,11 @@ moment = require 'moment' ...@@ -28,8 +28,11 @@ moment = require 'moment'
settings = require './config.json' settings = require './config.json'
settings.BANNED_user = [] settings.BANNED_user = []
settings.BANNED_IP = [] settings.BANNED_IP = []
settings.modules.hang_timeout=90 settings.modules.hang_timeout = 90
settings.version = parseInt(fs.readFileSync('ygopro/gframe/game.cpp', 'utf8').match(/PRO_VERSION = ([x\d]+)/)[1], '16') settings.version = parseInt(fs.readFileSync('ygopro/gframe/game.cpp', 'utf8').match(/PRO_VERSION = ([x\d]+)/)[1], '16')
lflist = (for list in fs.readFileSync('ygopro/lflist.conf', 'utf8').match(/![\d\.]+(?: TCG)?/g)
matched = list.match(/!([\d\.]+)(?: (TCG))?/)
{date: moment(matched[1]), tcg: !!matched[2]})
#组件 #组件
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
...@@ -74,7 +77,7 @@ net.createServer (client) -> ...@@ -74,7 +77,7 @@ net.createServer (client) ->
#释放处理 #释放处理
client.on 'close', (had_error) -> client.on 'close', (had_error) ->
#log.info "client closed", client.name, had_error #log.info "client closed", client.name, had_error
tribute(client) tribute(client)
unless client.closed unless client.closed
client.closed = true client.closed = true
...@@ -83,7 +86,7 @@ net.createServer (client) -> ...@@ -83,7 +86,7 @@ net.createServer (client) ->
return return
client.on 'error', (error)-> client.on 'error', (error)->
#log.info "client error", client.name, error #log.info "client error", client.name, error
tribute(client) tribute(client)
unless client.closed unless client.closed
client.closed = error client.closed = error
...@@ -96,7 +99,7 @@ net.createServer (client) -> ...@@ -96,7 +99,7 @@ net.createServer (client) ->
return return
server.on 'close', (had_error) -> server.on 'close', (had_error) ->
#log.info "server closed", client.name, had_error #log.info "server closed", client.name, had_error
tribute(server) tribute(server)
client.room.disconnector = 'server' client.room.disconnector = 'server'
server.closed = true unless server.closed server.closed = true unless server.closed
...@@ -106,7 +109,7 @@ net.createServer (client) -> ...@@ -106,7 +109,7 @@ net.createServer (client) ->
return return
server.on 'error', (error)-> server.on 'error', (error)->
#log.info "server error", client.name, error #log.info "server error", client.name, error
tribute(server) tribute(server)
client.room.disconnector = 'server' client.room.disconnector = 'server'
server.closed = error server.closed = error
...@@ -161,10 +164,10 @@ net.createServer (client) -> ...@@ -161,10 +164,10 @@ net.createServer (client) ->
break break
else else
if ctos_buffer.length >= 2 + ctos_message_length if ctos_buffer.length >= 2 + ctos_message_length
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto] #console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
cancel = false cancel = false
if ygopro.ctos_follows[ctos_proto] if ygopro.ctos_follows[ctos_proto]
b = ctos_buffer.slice(3, ctos_message_length-1+3) b = ctos_buffer.slice(3, ctos_message_length - 1 + 3)
if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]] if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]
struct._setBuff(b) struct._setBuff(b)
if ygopro.ctos_follows[ctos_proto].synchronous if ygopro.ctos_follows[ctos_proto].synchronous
...@@ -182,8 +185,8 @@ net.createServer (client) -> ...@@ -182,8 +185,8 @@ net.createServer (client) ->
looplimit++ looplimit++
#log.info(looplimit) #log.info(looplimit)
if looplimit>800 if looplimit > 800
log.info("error ctos",client.name) log.info("error ctos", client.name)
server.end() server.end()
break break
...@@ -220,7 +223,7 @@ net.createServer (client) -> ...@@ -220,7 +223,7 @@ net.createServer (client) ->
break break
else else
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]
stanzas = stoc_proto stanzas = stoc_proto
if ygopro.stoc_follows[stoc_proto] if ygopro.stoc_follows[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3) b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
...@@ -238,8 +241,8 @@ net.createServer (client) -> ...@@ -238,8 +241,8 @@ net.createServer (client) ->
looplimit++ looplimit++
#log.info(looplimit) #log.info(looplimit)
if looplimit>800 if looplimit > 800
log.info("error stoc",client.name) log.info("error stoc", client.name)
server.end() server.end()
break break
return return
...@@ -251,19 +254,19 @@ net.createServer (client) -> ...@@ -251,19 +254,19 @@ net.createServer (client) ->
#功能模块 #功能模块
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)-> ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
name=info.name.split("$")[0]; name = info.name.split("$")[0];
struct = ygopro.structs["CTOS_PlayerInfo"] struct = ygopro.structs["CTOS_PlayerInfo"]
struct._setBuff(buffer) struct._setBuff(buffer)
struct.set("name",name) struct.set("name", name)
buffer = struct.buffer buffer = struct.buffer
client.name = name client.name = name
return false return false
ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#log.info info #log.info info
if settings.modules.stop if settings.modules.stop
ygopro.stoc_send_chat(client,settings.modules.stop, 11) ygopro.stoc_send_chat(client, settings.modules.stop, 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -305,16 +308,16 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -305,16 +308,16 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
### ###
else if info.version != settings.version else if info.version != settings.version
ygopro.stoc_send_chat(client,settings.modules.update, 11) ygopro.stoc_send_chat(client, settings.modules.update, 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 4 msg: 4
code: settings.version code: settings.version
} }
client.end() client.end()
else if !info.pass.length and !settings.modules.enable_random_duel else if !info.pass.length and !settings.modules.enable_random_duel
ygopro.stoc_send_chat(client,"房间名为空,请填写主机密码", 11) ygopro.stoc_send_chat(client, "房间名为空,请填写主机密码", 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -327,8 +330,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -327,8 +330,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
windbot = _.sample _.filter settings.modules.windbot, (w)-> windbot = _.sample _.filter settings.modules.windbot, (w)->
w.name == name or w.deck == name w.name == name or w.deck == name
if !windbot if !windbot
ygopro.stoc_send_chat(client,'主机密码不正确 (Invalid Windbot Name)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Invalid Windbot Name)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -344,10 +347,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -344,10 +347,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
client.room.connect(client) client.room.connect(client)
else if info.pass.length and settings.modules.mycard_auth else if info.pass.length and settings.modules.mycard_auth
ygopro.stoc_send_chat(client,'正在读取用户信息...', 11) ygopro.stoc_send_chat(client, '正在读取用户信息...', 11)
if info.pass.length <= 8 if info.pass.length <= 8
ygopro.stoc_send_chat(client,'主机密码不正确 (Invalid Length)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Invalid Length)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -357,8 +360,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -357,8 +360,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
buffer = new Buffer(info.pass[0...8], 'base64') buffer = new Buffer(info.pass[0...8], 'base64')
if buffer.length != 6 if buffer.length != 6
ygopro.stoc_send_chat(client,'主机密码不正确 (Invalid Payload Length)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Invalid Payload Length)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -373,9 +376,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -373,9 +376,9 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
finish = (buffer)-> finish = (buffer)->
action = buffer.readUInt8(1) >> 4 action = buffer.readUInt8(1) >> 4
if buffer != decrypted_buffer and action in [1,2,4] if buffer != decrypted_buffer and action in [1, 2, 4]
ygopro.stoc_send_chat(client,'主机密码不正确 (Unauthorized)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Unauthorized)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -388,10 +391,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -388,10 +391,10 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
# 4 join match # 4 join match
switch action switch action
when 1,2 when 1,2
name = crypto.createHash('md5').update(info.pass + client.name).digest('base64')[0...10].replace('+','-').replace('/', '_'); name = crypto.createHash('md5').update(info.pass + client.name).digest('base64')[0...10].replace('+', '-').replace('/', '_');
if Room.find_by_name(name) if Room.find_by_name(name)
ygopro.stoc_send_chat(client,'主机密码不正确 (Already Existed)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Already Existed)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -413,6 +416,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -413,6 +416,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
start_hand: opt3 >> 4 start_hand: opt3 >> 4
draw_count: opt3 & 0xF draw_count: opt3 & 0xF
} }
@hostinfo.lflist = _.findIndex settings.lflist, (list)-> ((rule == 1) == list.tcg) and list.date.isBefore()
room = new Room(name, options) room = new Room(name, options)
room.title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ') room.title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ')
room.private = action == 2 room.private = action == 2
...@@ -420,8 +424,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -420,8 +424,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
name = info.pass.slice(8) name = info.pass.slice(8)
room = Room.find_by_name(name) room = Room.find_by_name(name)
if(!room) if(!room)
ygopro.stoc_send_chat(client,'主机密码不正确 (Not Found)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Not Found)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -431,8 +435,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -431,8 +435,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
room = Room.find_or_create_by_name('M#' + info.pass.slice(8)) room = Room.find_or_create_by_name('M#' + info.pass.slice(8))
room.private = true room.private = true
else else
ygopro.stoc_send_chat(client,'主机密码不正确 (Invalid Action)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Invalid Action)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -444,7 +448,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -444,7 +448,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
if id = users_cache[client.name] if id = users_cache[client.name]
secret = id % 65535 + 1; secret = id % 65535 + 1;
decrypted_buffer = new Buffer(6) decrypted_buffer = new Buffer(6)
for i in [0,2,4] for i in [0, 2, 4]
decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i) decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i)
if check(decrypted_buffer) if check(decrypted_buffer)
return finish(decrypted_buffer) return finish(decrypted_buffer)
...@@ -458,42 +462,42 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -458,42 +462,42 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
api_username: client.name, api_username: client.name,
skip_track_visit: true skip_track_visit: true
json: true json: true
, (error, response, body)-> , (error, response, body)->
if body and body.user if body and body.user
secret = body.user.id % 65535 + 1; secret = body.user.id % 65535 + 1;
decrypted_buffer = new Buffer(6) decrypted_buffer = new Buffer(6)
for i in [0,2,4] for i in [0, 2, 4]
decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i) decrypted_buffer.writeUInt16LE(buffer.readUInt16LE(i) ^ secret, i)
if check(decrypted_buffer) if check(decrypted_buffer)
buffer = decrypted_buffer buffer = decrypted_buffer
# buffer != decrypted_buffer ==> auth failed # buffer != decrypted_buffer ==> auth failed
if !check(buffer) if !check(buffer)
ygopro.stoc_send_chat(client,'主机密码不正确 (Checksum Failed)', 11) ygopro.stoc_send_chat(client, '主机密码不正确 (Checksum Failed)', 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
return return
users_cache[client.name] = body.user.id users_cache[client.name] = body.user.id
finish(buffer) finish(buffer)
else if info.pass.length && !Room.validate(info.pass) else if info.pass.length && !Room.validate(info.pass)
#ygopro.stoc_send client, 'ERROR_MSG',{ #ygopro.stoc_send client, 'ERROR_MSG',{
# msg: 1 # msg: 1
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示 # code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
#} #}
ygopro.stoc_send_chat(client,"房间密码不正确", 11) ygopro.stoc_send_chat(client, "房间密码不正确", 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
else if client.name == '[INCORRECT]' #模拟用户验证 else if client.name == '[INCORRECT]' #模拟用户验证
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -502,8 +506,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -502,8 +506,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else if _.indexOf(settings.BANNED_user, client.name) > -1 #账号被封 else if _.indexOf(settings.BANNED_user, client.name) > -1 #账号被封
settings.BANNED_IP.push(client.remoteAddress) settings.BANNED_IP.push(client.remoteAddress)
log.info("BANNED USER LOGIN", client.name, client.remoteAddress) log.info("BANNED USER LOGIN", client.name, client.remoteAddress)
ygopro.stoc_send_chat(client,"您的账号已被封禁", 11) ygopro.stoc_send_chat(client, "您的账号已被封禁", 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
...@@ -511,33 +515,33 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -511,33 +515,33 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else if _.indexOf(settings.BANNED_IP, client.remoteAddress) > -1 #IP被封 else if _.indexOf(settings.BANNED_IP, client.remoteAddress) > -1 #IP被封
log.info("BANNED IP LOGIN", client.name, client.remoteAddress) log.info("BANNED IP LOGIN", client.name, client.remoteAddress)
ygopro.stoc_send_chat(client,"您的账号已被封禁", 11) ygopro.stoc_send_chat(client, "您的账号已被封禁", 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
else else
#log.info 'join_game',info.pass, client.name #log.info 'join_game',info.pass, client.name
room = Room.find_or_create_by_name(info.pass, client.remoteAddress) room = Room.find_or_create_by_name(info.pass, client.remoteAddress)
if !room if !room
ygopro.stoc_send_chat(client,"服务器已经爆满,请稍候再试", 11) ygopro.stoc_send_chat(client, "服务器已经爆满,请稍候再试", 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
else if room.error else if room.error
ygopro.stoc_send_chat(client, room.error, 11) ygopro.stoc_send_chat(client, room.error, 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
else if room.started else if room.started
if settings.modules.post_start_watching if settings.modules.post_start_watching
client.room=room client.room = room
client.is_post_watcher = true client.is_post_watcher = true
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战" ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
client.room.watchers.push client client.room.watchers.push client
...@@ -545,19 +549,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -545,19 +549,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
for buffer in client.room.watcher_buffers for buffer in client.room.watcher_buffers
client.write buffer client.write buffer
else else
ygopro.stoc_send_chat(client,"决斗已开始,不允许观战", 11) ygopro.stoc_send_chat(client, "决斗已开始,不允许观战", 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG', {
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
else else
client.room=room client.room = room
client.room.connect(client) client.room.connect(client)
return return
ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#欢迎信息 #欢迎信息
return unless client.room return unless client.room
if settings.modules.welcome if settings.modules.welcome
ygopro.stoc_send_chat client, settings.modules.welcome ygopro.stoc_send_chat client, settings.modules.welcome
...@@ -586,7 +590,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -586,7 +590,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
return return
watcher.on 'error', (error)-> watcher.on 'error', (error)->
#log.error "watcher error", error #log.error "watcher error", error
return return
return return
...@@ -596,23 +600,23 @@ if settings.modules.dialogues ...@@ -596,23 +600,23 @@ if settings.modules.dialogues
request request
url: settings.modules.dialogues url: settings.modules.dialogues
json: true json: true
, (error, response, body)-> , (error, response, body)->
if _.isString body if _.isString body
log.warn "dialogues bad json", body log.warn "dialogues bad json", body
else if error or !body else if error or !body
log.warn 'dialogues error', error, response log.warn 'dialogues error', error, response
else else
#log.info "dialogues loaded", _.size body #log.info "dialogues loaded", _.size body
dialogues = body dialogues = body
return return
ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
msg = buffer.readInt8(0) msg = buffer.readInt8(0)
if msg>=10 and msg<30 #SELECT开头的消息 if msg >= 10 and msg < 30 #SELECT开头的消息
client.room.waiting_for_player=client client.room.waiting_for_player = client
client.room.last_active_time=moment() client.room.last_active_time = moment()
#log.info("#{ygopro.constants.MSG[msg]}等待#{client.room.waiting_for_player.name}") #log.info("#{ygopro.constants.MSG[msg]}等待#{client.room.waiting_for_player.name}")
#log.info 'MSG', ygopro.constants.MSG[msg] #log.info 'MSG', ygopro.constants.MSG[msg]
if ygopro.constants.MSG[msg] == 'START' if ygopro.constants.MSG[msg] == 'START'
...@@ -620,7 +624,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ...@@ -620,7 +624,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
client.is_first = !(playertype & 0xf); client.is_first = !(playertype & 0xf);
client.lp = client.room.hostinfo.start_lp client.lp = client.room.hostinfo.start_lp
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}") #ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}")
### ###
if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
...@@ -672,7 +676,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ...@@ -672,7 +676,7 @@ ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)-> ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server)->
return unless client.room return unless client.room
for player in client.room.players for player in client.room.players
if player and player.pos==info.pos and player != client if player and player.pos == info.pos and player != client
ygopro.stoc_send_chat_to_room client.room, "#{player.name} 被请出了房间", 11 ygopro.stoc_send_chat_to_room client.room, "#{player.name} 被请出了房间", 11
return false return false
...@@ -691,22 +695,22 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> ...@@ -691,22 +695,22 @@ ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
if pos < client.room.max_player if pos < client.room.max_player
client.room.ready_player_count_without_host = 0 client.room.ready_player_count_without_host = 0
for player in client.room.players for player in client.room.players
if player.pos==pos if player.pos == pos
player.is_ready = is_ready player.is_ready = is_ready
unless player.is_host unless player.is_host
client.room.ready_player_count_without_host+=player.is_ready client.room.ready_player_count_without_host += player.is_ready
if client.room.ready_player_count_without_host >= client.room.max_player - 1 if client.room.ready_player_count_without_host >= client.room.max_player - 1
#log.info "all ready" #log.info "all ready"
setTimeout (()->wait_room_start(client.room,20);return), 1000 setTimeout (()-> wait_room_start(client.room, 20);return), 1000
return return
wait_room_start = (room,time)-> wait_room_start = (room, time)->
unless !room or room.started or room.ready_player_count_without_host < room.max_player - 1 unless !room or room.started or room.ready_player_count_without_host < room.max_player - 1
time-=1 time -= 1
if time if time
unless time % 5 unless time % 5
ygopro.stoc_send_chat_to_room room, "#{if time <= 9 then ' ' else ''}#{time}秒后房主若不开始游戏将被请出房间", if time <= 9 then 11 else 8 ygopro.stoc_send_chat_to_room room, "#{if time <= 9 then ' ' else ''}#{time}秒后房主若不开始游戏将被请出房间", if time <= 9 then 11 else 8
setTimeout (()->wait_room_start(room,time);return), 1000 setTimeout (()-> wait_room_start(room, time);return), 1000
else else
for player in room.players for player in room.players
if player and player.is_host if player and player.is_host
...@@ -734,10 +738,10 @@ if settings.modules.tips ...@@ -734,10 +738,10 @@ if settings.modules.tips
request request
url: settings.modules.tips url: settings.modules.tips
json: true json: true
, (error, response, body)-> , (error, response, body)->
tips = body tips = body
#log.info "tips loaded", tips.length #log.info "tips loaded", tips.length
return return
if settings.modules.mycard_auth and process.env.MYCARD_AUTH_DATABASE if settings.modules.mycard_auth and process.env.MYCARD_AUTH_DATABASE
pg = require('pg'); pg = require('pg');
...@@ -759,7 +763,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ...@@ -759,7 +763,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client.room.dueling_players = [] client.room.dueling_players = []
for player in client.room.players when player.pos != 7 for player in client.room.players when player.pos != 7
client.room.dueling_players[player.pos] = player client.room.dueling_players[player.pos] = player
client.room.player_datas.push ip:player.remoteAddress, name:player.name client.room.player_datas.push ip: player.remoteAddress, name: player.name
if client.room.windbot if client.room.windbot
client.room.dueling_players[1 - player.pos] = {} client.room.dueling_players[1 - player.pos] = {}
if settings.modules.tips if settings.modules.tips
...@@ -767,8 +771,8 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ...@@ -767,8 +771,8 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
return return
ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
cancel = _.startsWith(_.trim(info.msg),"/") cancel = _.startsWith(_.trim(info.msg), "/")
client.room.last_active_time=moment() unless cancel or not client.room.random_type client.room.last_active_time = moment() unless cancel or not client.room.random_type
switch _.trim(info.msg) switch _.trim(info.msg)
when '/ping' when '/ping'
execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)-> execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)->
...@@ -779,21 +783,21 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ...@@ -779,21 +783,21 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
if line.indexOf('rtt') != -1 if line.indexOf('rtt') != -1
ygopro.stoc_send_chat_to_room client.room, line ygopro.stoc_send_chat_to_room client.room, line
else else
#log.warn 'ping', stdout #log.warn 'ping', stdout
ygopro.stoc_send_chat_to_room client.room, stdout ygopro.stoc_send_chat_to_room client.room, stdout
return return
when '/help' when '/help'
ygopro.stoc_send_chat(client,"YGOSrv233 指令帮助") ygopro.stoc_send_chat(client, "YGOSrv233 指令帮助")
ygopro.stoc_send_chat(client,"/help 显示这个帮助信息") ygopro.stoc_send_chat(client, "/help 显示这个帮助信息")
ygopro.stoc_send_chat(client,"/roomname 显示当前房间的名字") ygopro.stoc_send_chat(client, "/roomname 显示当前房间的名字")
ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips ygopro.stoc_send_chat(client, "/tip 显示一条提示") if settings.modules.tips
when '/tip' when '/tip'
ygopro.stoc_send_random_tip(client) if settings.modules.tips ygopro.stoc_send_random_tip(client) if settings.modules.tips
when '/roomname' when '/roomname'
ygopro.stoc_send_chat(client,"您当前的房间名是 " + client.room.name) if client.room ygopro.stoc_send_chat(client, "您当前的房间名是 " + client.room.name) if client.room
when '/test' when '/test'
ygopro.stoc_send_hint_card_to_room(client.room, 2333365) ygopro.stoc_send_hint_card_to_room(client.room, 2333365)
...@@ -801,58 +805,58 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)-> ...@@ -801,58 +805,58 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
return cancel return cancel
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)-> ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
#log.info info #log.info info
main = (info.deckbuf[i] for i in [0...info.mainc]) main = (info.deckbuf[i] for i in [0...info.mainc])
side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec]) side = (info.deckbuf[i] for i in [info.mainc...info.mainc + info.sidec])
client.main = main client.main = main
client.side = side client.side = side
return return
ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server)-> ygopro.ctos_follow 'RESPONSE', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type return unless client.room and client.room.random_type
client.room.last_active_time=moment() client.room.last_active_time = moment()
return return
ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)-> ygopro.ctos_follow 'HAND_RESULT', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type return unless client.room and client.room.random_type
if client.is_host if client.is_host
client.room.waiting_for_player=client.room.waiting_for_player2 client.room.waiting_for_player = client.room.waiting_for_player2
client.room.last_active_time=moment().subtract(settings.modules.hang_timeout-19, 's') client.room.last_active_time = moment().subtract(settings.modules.hang_timeout - 19, 's')
return return
ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server)-> ygopro.ctos_follow 'TP_RESULT', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type return unless client.room and client.room.random_type
client.room.last_active_time=moment() client.room.last_active_time = moment()
return return
ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)-> ygopro.stoc_follow 'SELECT_HAND', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type return unless client.room and client.room.random_type
if client.is_host if client.is_host
client.room.waiting_for_player=client client.room.waiting_for_player = client
else else
client.room.waiting_for_player2=client client.room.waiting_for_player2 = client
client.room.last_active_time=moment().subtract(settings.modules.hang_timeout-19, 's') client.room.last_active_time = moment().subtract(settings.modules.hang_timeout - 19, 's')
return return
ygopro.stoc_follow 'SELECT_TP', false, (buffer, info, client, server)-> ygopro.stoc_follow 'SELECT_TP', false, (buffer, info, client, server)->
return unless client.room and client.room.random_type return unless client.room and client.room.random_type
client.room.waiting_for_player=client client.room.waiting_for_player = client
client.room.last_active_time=moment() client.room.last_active_time = moment()
return return
setInterval ()-> setInterval ()->
for room in Room.all when room and room.started and room.random_type and room.last_active_time and room.waiting_for_player for room in Room.all when room and room.started and room.random_type and room.last_active_time and room.waiting_for_player
time_passed=Math.floor((moment()-room.last_active_time) / 1000) time_passed = Math.floor((moment() - room.last_active_time) / 1000)
#log.info time_passed #log.info time_passed
if time_passed >= settings.modules.hang_timeout if time_passed >= settings.modules.hang_timeout
room.last_active_time=moment() room.last_active_time = moment()
Room.ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "挂机") Room.ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "挂机")
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} 被系统请出了房间", 11) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} 被系统请出了房间", 11)
room.waiting_for_player.server.end() room.waiting_for_player.server.end()
else if time_passed >= (settings.modules.hang_timeout-20) and not (time_passed % 10) else if time_passed >= (settings.modules.hang_timeout - 20) and not (time_passed % 10)
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} 已经很久没有操作了,若继续挂机,将于#{settings.modules.hang_timeout-time_passed}秒后被请出房间", 11) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} 已经很久没有操作了,若继续挂机,将于#{settings.modules.hang_timeout - time_passed}秒后被请出房间", 11)
return return
,1000 , 1000
#http #http
if settings.modules.http if settings.modules.http
...@@ -865,13 +869,13 @@ if settings.modules.http ...@@ -865,13 +869,13 @@ if settings.modules.http
if u.pathname == '/api/getrooms' if u.pathname == '/api/getrooms'
if u.query.pass and !pass_validated if u.query.pass and !pass_validated
response.writeHead(200); response.writeHead(200);
response.end(u.query.callback+'( {"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]} );') response.end(u.query.callback + '( {"rooms":[{"roomid":"0","roomname":"密码错误","needpass":"true"}]} );')
else else
response.writeHead(200); response.writeHead(200);
roomsjson = JSON.stringify rooms: (for room in Room.all when room.established roomsjson = JSON.stringify rooms: (for room in Room.all when room.established
pid: room.process.pid.toString(), pid: room.process.pid.toString(),
roomid: room.port.toString(), roomid: room.port.toString(),
roomname: if pass_validated then room.name else room.name.split('$',2)[0], roomname: if pass_validated then room.name else room.name.split('$', 2)[0],
needpass: (room.name.indexOf('$') != -1).toString(), needpass: (room.name.indexOf('$') != -1).toString(),
users: (for player in room.players when player.pos? users: (for player in room.players when player.pos?
id: (-1).toString(), id: (-1).toString(),
...@@ -880,36 +884,36 @@ if settings.modules.http ...@@ -880,36 +884,36 @@ if settings.modules.http
), ),
istart: if room.started then 'start' else 'wait' istart: if room.started then 'start' else 'wait'
) )
response.end(u.query.callback+"( " + roomsjson + " );") response.end(u.query.callback + "( " + roomsjson + " );")
else if u.pathname == '/api/message' else if u.pathname == '/api/message'
if !pass_validated if !pass_validated
response.writeHead(200); response.writeHead(200);
response.end(u.query.callback+"( '密码错误', 0 );"); response.end(u.query.callback + "( '密码错误', 0 );");
return return
if u.query.shout if u.query.shout
for room in Room.all for room in Room.all
ygopro.stoc_send_chat_to_room(room, u.query.shout, 16) ygopro.stoc_send_chat_to_room(room, u.query.shout, 16)
response.writeHead(200) response.writeHead(200)
response.end(u.query.callback+"( 'shout ok', '" + u.query.shout + "' );") response.end(u.query.callback + "( 'shout ok', '" + u.query.shout + "' );")
else if u.query.stop else if u.query.stop
if u.query.stop == 'false' if u.query.stop == 'false'
u.query.stop=false u.query.stop = false
settings.modules.stop = u.query.stop settings.modules.stop = u.query.stop
response.writeHead(200) response.writeHead(200)
response.end(u.query.callback+"( 'stop ok', '" + u.query.stop + "' );") response.end(u.query.callback + "( 'stop ok', '" + u.query.stop + "' );")
else if u.query.welcome else if u.query.welcome
settings.modules.welcome = u.query.welcome settings.modules.welcome = u.query.welcome
response.writeHead(200) response.writeHead(200)
response.end(u.query.callback+"( 'welcome ok', '" + u.query.welcome + "' );") response.end(u.query.callback + "( 'welcome ok', '" + u.query.welcome + "' );")
else if u.query.ban else if u.query.ban
settings.BANNED_user.push(u.query.ban) settings.BANNED_user.push(u.query.ban)
response.writeHead(200) response.writeHead(200)
response.end(u.query.callback+"( 'ban ok', '" + u.query.ban + "' );") response.end(u.query.callback + "( 'ban ok', '" + u.query.ban + "' );")
else else
response.writeHead(404); response.writeHead(404);
......
// Generated by CoffeeScript 1.10.0 // Generated by CoffeeScript 1.10.0
(function() { (function() {
var Graveyard, Room, _, bunyan, crypto, debug, dialogues, execFile, fs, http, http_server, https, https_server, log, moment, net, options, os, path, pg, request, requestListener, roomlist, settings, tips, tribute, url, users_cache, wait_room_start, ygopro; var Graveyard, Room, _, bunyan, crypto, debug, dialogues, execFile, fs, http, http_server, https, https_server, lflist, list, log, matched, moment, net, options, os, path, pg, request, requestListener, roomlist, settings, tips, tribute, url, users_cache, wait_room_start, ygopro;
net = require('net'); net = require('net');
...@@ -40,6 +40,21 @@ ...@@ -40,6 +40,21 @@
settings.version = parseInt(fs.readFileSync('ygopro/gframe/game.cpp', 'utf8').match(/PRO_VERSION = ([x\d]+)/)[1], '16'); settings.version = parseInt(fs.readFileSync('ygopro/gframe/game.cpp', 'utf8').match(/PRO_VERSION = ([x\d]+)/)[1], '16');
lflist = (function() {
var k, len, ref, results;
ref = fs.readFileSync('ygopro/lflist.conf', 'utf8').match(/![\d\.]+(?: TCG)?/g);
results = [];
for (k = 0, len = ref.length; k < len; k++) {
list = ref[k];
matched = list.match(/!([\d\.]+)(?: (TCG))?/);
results.push({
date: moment(matched[1]),
tcg: !!matched[2]
});
}
return results;
})();
ygopro = require('./ygopro.js'); ygopro = require('./ygopro.js');
Room = require('./room.js'); Room = require('./room.js');
...@@ -442,6 +457,9 @@ ...@@ -442,6 +457,9 @@
start_hand: opt3 >> 4, start_hand: opt3 >> 4,
draw_count: opt3 & 0xF draw_count: opt3 & 0xF
}; };
this.hostinfo.lflist = _.findIndex(settings.lflist, function(list) {
return ((rule === 1) === list.tcg) && list.date.isBefore();
});
room = new Room(name, options); room = new Room(name, options);
room.title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' '); room.title = info.pass.slice(8).replace(String.fromCharCode(0xFEFF), ' ');
room["private"] = action === 2; room["private"] = action === 2;
......
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