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,40 +79,40 @@ class Room ...@@ -77,40 +79,40 @@ 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
...@@ -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'], {
cwd: 'windbot', env: {
YGOPRO_VERSION: settings.version YGOPRO_VERSION: settings.version
YGOPRO_HOST: '127.0.0.1' YGOPRO_HOST: '127.0.0.1'
YGOPRO_PORT: @port YGOPRO_PORT: @port
YGOPRO_NAME: @windbot.name YGOPRO_NAME: @windbot.name
YGOPRO_DECK: @windbot.deck YGOPRO_DECK: @windbot.deck
YGOPRO_DIALOG: @windbot.dialog 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)
...@@ -462,7 +466,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -462,7 +466,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
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
...@@ -470,8 +474,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -470,8 +474,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
# 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
} }
...@@ -481,19 +485,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -481,19 +485,19 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
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
...@@ -602,16 +606,16 @@ if settings.modules.dialogues ...@@ -602,16 +606,16 @@ if settings.modules.dialogues
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]
...@@ -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
...@@ -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