Commit 9c4b7ccc authored by 神楽坂玲奈's avatar 神楽坂玲奈

fix

parent 1657f74c
#标准库 #标准库
net = require 'net' net = require 'net'
http = require 'http' http = require 'http'
url = require 'url' url = require 'url'
path = require 'path' path = require 'path'
fs = require 'fs' fs = require 'fs'
execFile = require('child_process').execFile execFile = require('child_process').execFile
#三方库 #三方库
_ = require 'underscore' _ = require 'underscore'
_.str = require 'underscore.string' _.str = require 'underscore.string'
_.mixin(_.str.exports()); _.mixin(_.str.exports());
Inotify = require('inotify').Inotify Inotify = require('inotify').Inotify
request = require 'request' request = require 'request'
bunyan = require 'bunyan' bunyan = require 'bunyan'
#配置文件 #配置文件
settings = require './config.json' settings = require './config.json'
#组件 #组件
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
mycard = require './mycard.js' mycard = require './mycard.js'
Room = require './room.js' Room = require './room.js'
User = require './user.js' if settings.modules.database User = require './user.js' if settings.modules.database
Deck = require './deck.js' if settings.modules.database Deck = require './deck.js' if settings.modules.database
victories = require './victories.json' victories = require './victories.json'
#debug模式 端口号+1 #debug模式 端口号+1
debug = false debug = false
log = null log = null
if process.argv[2] == '--debug' if process.argv[2] == '--debug'
settings.port++ settings.port++
settings.modules.http.port++ if settings.modules.http settings.modules.http.port++ if settings.modules.http
log = bunyan.createLogger name: "mycard-debug" log = bunyan.createLogger name: "mycard-debug"
else else
log = bunyan.createLogger name: "mycard" log = bunyan.createLogger name: "mycard"
#网络连接 #网络连接
net.createServer (client) -> net.createServer (client) ->
server = new net.Socket() server = new net.Socket()
client.server = server client.server = server
#释放处理 #释放处理
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
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed unless client.closed
client.closed = true client.closed = true
client.room.disconnect(client) if client.room client.room.disconnect(client) if client.room
server.end() server.end()
client.on 'error', (error)-> client.on 'error', (error)->
log.info "client error", client.name, error log.info "client error", client.name, error
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed unless client.closed
client.closed = error client.closed = error
client.room.disconnect(client, error) if client.room client.room.disconnect(client, error) if client.room
server.end() server.end()
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
server.closed = true unless server.closed server.closed = true unless server.closed
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed unless client.closed
ygopro.stoc_send_chat(client, "服务器关闭了连接") ygopro.stoc_send_chat(client, "服务器关闭了连接")
client.end() client.end()
server.on 'error', (error)-> server.on 'error', (error)->
log.info "server error", client.name, error log.info "server error", client.name, error
server.closed = error server.closed = error
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
unless client.closed unless client.closed
ygopro.stoc_send_chat(client, "服务器错误: #{error}") ygopro.stoc_send_chat(client, "服务器错误: #{error}")
client.end() client.end()
#需要重构 #需要重构
#客户端到服务端(ctos)协议分析 #客户端到服务端(ctos)协议分析
ctos_buffer = new Buffer(0) ctos_buffer = new Buffer(0)
ctos_message_length = 0 ctos_message_length = 0
ctos_proto = 0 ctos_proto = 0
client.pre_establish_buffers = new Array() client.pre_establish_buffers = new Array()
client.on 'data', (data) -> client.on 'data', (data) ->
if client.is_post_watcher if client.is_post_watcher
client.room.watcher.write data client.room.watcher.write data
else else
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学 ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
if client.established if client.established
server.write data server.write data
else else
client.pre_establish_buffers.push data client.pre_establish_buffers.push data
while true while true
if ctos_message_length == 0 if ctos_message_length == 0
if ctos_buffer.length >= 2 if ctos_buffer.length >= 2
ctos_message_length = ctos_buffer.readUInt16LE(0) ctos_message_length = ctos_buffer.readUInt16LE(0)
else else
break break
else if ctos_proto == 0 else if ctos_proto == 0
if ctos_buffer.length >= 3 if ctos_buffer.length >= 3
ctos_proto = ctos_buffer.readUInt8(2) ctos_proto = ctos_buffer.readUInt8(2)
else else
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]
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)
ygopro.ctos_follows[ctos_proto].callback b, _.clone(struct.fields), client, server ygopro.ctos_follows[ctos_proto].callback b, _.clone(struct.fields), client, server
else else
ygopro.ctos_follows[ctos_proto].callback b, null, client, server ygopro.ctos_follows[ctos_proto].callback b, null, client, server
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length) ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0 ctos_message_length = 0
ctos_proto = 0 ctos_proto = 0
else else
break break
#服务端到客户端(stoc) #服务端到客户端(stoc)
stoc_buffer = new Buffer(0) stoc_buffer = new Buffer(0)
stoc_message_length = 0 stoc_message_length = 0
stoc_proto = 0 stoc_proto = 0
server.on 'data', (data)-> server.on 'data', (data)->
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学 stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
#unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous #unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
client.write data client.write data
while true while true
if stoc_message_length == 0 if stoc_message_length == 0
if stoc_buffer.length >= 2 if stoc_buffer.length >= 2
stoc_message_length = stoc_buffer.readUInt16LE(0) stoc_message_length = stoc_buffer.readUInt16LE(0)
else else
break break
else if stoc_proto == 0 else if stoc_proto == 0
if stoc_buffer.length >= 3 if stoc_buffer.length >= 3
stoc_proto = stoc_buffer.readUInt8(2) stoc_proto = stoc_buffer.readUInt8(2)
else else
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]
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)
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]] if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
struct._setBuff(b) struct._setBuff(b)
ygopro.stoc_follows[stoc_proto].callback b, _.clone(struct.fields), client, server ygopro.stoc_follows[stoc_proto].callback b, _.clone(struct.fields), client, server
else else
ygopro.stoc_follows[stoc_proto].callback b, null, client, server ygopro.stoc_follows[stoc_proto].callback b, null, client, server
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length) stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
stoc_message_length = 0 stoc_message_length = 0
stoc_proto = 0 stoc_proto = 0
else else
break break
.listen settings.port, -> .listen settings.port, ->
log.info "server started", settings.ip, settings.port log.info "server started", settings.ip, settings.port
#功能模块 #功能模块
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)-> ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
client.name = info.name #在创建room之前暂存 client.name = info.name #在创建room之前暂存
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 info.version != settings.version if info.version != settings.version
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 else if !info.pass.length
ygopro.stoc_send_chat(client,"房间为空,请修改房间名") ygopro.stoc_send_chat(client,"房间为空,请修改房间名")
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.validate(info.pass) else if !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,"房间密码不正确") ygopro.stoc_send_chat(client,"房间密码不正确")
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
} }
client.end() client.end()
else else
log.info 'join_game',info.pass, client.name log.info 'join_game',info.pass, client.name
client.room = Room.find_or_create_by_name(info.pass) client.room = Room.find_or_create_by_name(info.pass)
if client.room.started if client.room.started
if settings.modules.post_start_watching if settings.modules.post_start_watching
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
for buffer in client.room.watcher_buffers for buffer in client.room.watcher_buffers
client.write buffer client.write buffer
ygopro.stoc_send_chat client, "观战中." ygopro.stoc_send_chat client, "观战中."
else else
ygopro.stoc_send_chat(client,"决斗已开始") ygopro.stoc_send_chat(client,"决斗已开始")
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.connect(client) client.room.connect(client)
###################################################################################################################### ######################################################################################################################
ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
#欢迎信息 #欢迎信息
if settings.modules.welcome if settings.modules.welcome
ygopro.stoc_send_chat client, settings.modules.welcome ygopro.stoc_send_chat client, settings.modules.welcome
if settings.modules.database if settings.modules.database
if _.startsWith(client.room.name, 'M#') if _.startsWith(client.room.name, 'M#')
User.findOne { name: client.name }, (err, user)-> User.findOne { name: client.name }, (err, user)->
if !user if !user
user = new User({name: client.name, points: 0}) user = new User({name: client.name, points: 0})
user.save() user.save()
User.count {points:{$gt:user.points}}, (err, count)-> User.count {points:{$gt:user.points}}, (err, count)->
rank = count + 1 rank = count + 1
ygopro.stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,排名#{rank},这些积分以后正式使用时会重置") ygopro.stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,排名#{rank},这些积分以后正式使用时会重置")
if settings.modules.post_start_watching and !client.room.watcher if settings.modules.post_start_watching and !client.room.watcher
client.room.watcher = watcher = net.connect client.room.port, -> client.room.watcher = watcher = net.connect client.room.port, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', { ygopro.ctos_send watcher, 'PLAYER_INFO', {
name: "the Big Brother" name: "the Big Brother"
} }
ygopro.ctos_send watcher, 'JOIN_GAME', { ygopro.ctos_send watcher, 'JOIN_GAME', {
version: settings.version, version: settings.version,
gameid: 2577, gameid: 2577,
some_unknown_mysterious_fucking_thing: 0 some_unknown_mysterious_fucking_thing: 0
pass: "" pass: ""
} }
ygopro.ctos_send watcher, 'HS_TOOBSERVER' ygopro.ctos_send watcher, 'HS_TOOBSERVER'
watcher.on 'data', (data)-> watcher.on 'data', (data)->
client.room.watcher_buffers.push data client.room.watcher_buffers.push data
for w in client.room.watchers for w in client.room.watchers
w.write data if w #a WTF fix w.write data if w #a WTF fix
watcher.on 'error', (error)-> watcher.on 'error', (error)->
log.error "watcher error", error log.error "watcher error", error
#登场台词 #登场台词
if settings.modules.dialogues if settings.modules.dialogues
dialogues = {} 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
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)
#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'
playertype = buffer.readUInt8(1) playertype = buffer.readUInt8(1)
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)
pos = 1 - pos unless client.is_first or pos == 2 pos = 1 - pos unless client.is_first or pos == 2
reason = buffer.readUInt8(2) reason = buffer.readUInt8(2)
log.info {winner: pos, reason: reason} log.info {winner: pos, reason: reason}
client.room.duels.push {winner: pos, reason: reason} client.room.duels.push {winner: pos, reason: reason}
#lp跟踪 #lp跟踪
if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val client.room.dueling_players[pos].lp -= val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}") #ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if 0 < client.room.dueling_players[pos].lp <= 100 if 0 < client.room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!") ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!")
if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp += val client.room.dueling_players[pos].lp += val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}") #ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp = val client.room.dueling_players[pos].lp = val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}") #ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}")
if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host
pos = buffer.readUInt8(1) pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2) val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp -= val client.room.dueling_players[pos].lp -= val
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}") #ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}")
if 0 < client.room.dueling_players[pos].lp <= 100 if 0 < client.room.dueling_players[pos].lp <= 100
ygopro.stoc_send_chat_to_room(client.room, "背水一战!") ygopro.stoc_send_chat_to_room(client.room, "背水一战!")
#登场台词 #登场台词
if settings.modules.dialogues if settings.modules.dialogues
if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING' if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING'
card = buffer.readUInt32LE(1) card = buffer.readUInt32LE(1)
if dialogues[card] if dialogues[card]
for line in _.lines dialogues[card][Math.floor(Math.random() * dialogues[card].length)] for line in _.lines dialogues[card][Math.floor(Math.random() * dialogues[card].length)]
ygopro.stoc_send_chat client, line ygopro.stoc_send_chat client, line
### ###
#房间管理 #房间管理
ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)-> ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
#console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}" #console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}"
#room = client.room #room = client.room
#if !room #if !room
# console.log "[WARN]player_enter: can't find room by player #{client.player}" # console.log "[WARN]player_enter: can't find room by player #{client.player}"
# return # return
#room.pos_name[info.pos] = info.name #room.pos_name[info.pos] = info.name
ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
#client.ready = info.status & 0xF != 0 #client.ready = info.status & 0xF != 0
#client.pos = info.status >> 4 #client.pos = info.status >> 4
#console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}" #console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
### ###
ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)-> ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)->
selftype = info.type & 0xf; selftype = info.type & 0xf;
is_host = ((info.type >> 4) & 0xf) != 0; is_host = ((info.type >> 4) & 0xf) != 0;
client.is_host = is_host client.is_host = is_host
client.pos = selftype client.pos = selftype
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host #console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
#tip #tip
ygopro.stoc_send_random_tip = (client)-> ygopro.stoc_send_random_tip = (client)->
ygopro.stoc_send_chat client, "Tip: " + tips[Math.floor(Math.random() * tips.length)] if tips ygopro.stoc_send_chat client, "Tip: " + tips[Math.floor(Math.random() * tips.length)] if tips
tips = null tips = null
request if settings.modules.tips
url: settings.modules.tips request
json: true url: settings.modules.tips
, (error, response, body)-> json: true
tips = body , (error, response, body)->
log.info "tips loaded", tips.length tips = body
log.info "tips loaded", tips.length
ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
unless client.room.started #first start ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client.room.started = true unless client.room.started #first start
client.room.duels = [] client.room.started = true
client.room.dueling_players = [] client.room.duels = []
for player in client.room.players when player.pos != 7 client.room.dueling_players = []
client.room.dueling_players[player.pos] = player for player in client.room.players when player.pos != 7
if !player.main client.room.dueling_players[player.pos] = player
log.error 'WTF', client if !player.main
else log.error 'WTF', client
player.deck = mycard.load_card_usages_from_cards(player.main, player.side) else
player.deck = mycard.load_card_usages_from_cards(player.main, player.side)
if !client.room.dueling_players[0] or !client.room.dueling_players[1]
log.error 'incomplete room', client.room.dueling_players, client.room.players if !client.room.dueling_players[0] or !client.room.dueling_players[1]
log.error 'incomplete room', client.room.dueling_players, client.room.players
if settings.modules.tips
ygopro.stoc_send_random_tip(client) if settings.modules.tips
ygopro.stoc_send_random_tip(client)
ygopro.ctos_follow 'CHAT', false, (buffer, info, client, server)->
switch _.trim(info.msg) ygopro.ctos_follow 'CHAT', false, (buffer, info, client, server)->
when '/ping' switch _.trim(info.msg)
execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)-> when '/ping'
if error execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)->
ygopro.stoc_send_chat_to_room client.room, error if error
else ygopro.stoc_send_chat_to_room client.room, error
line = _.lines(stdout)[2] else
if line.indexOf('rtt') != -1 line = _.lines(stdout)[2]
ygopro.stoc_send_chat_to_room client.room, line if line.indexOf('rtt') != -1
else ygopro.stoc_send_chat_to_room client.room, line
log.warn 'ping', stdout else
ygopro.stoc_send_chat_to_room client.room, stdout log.warn 'ping', stdout
when '/ranktop' ygopro.stoc_send_chat_to_room client.room, stdout
if settings.modules.database when '/ranktop'
User.find null, null, { sort: { points : -1 }, limit: 8 }, (err, users)-> if settings.modules.database
if err User.find null, null, { sort: { points : -1 }, limit: 8 }, (err, users)->
return log.error 'ranktop', err if err
for index, user of users return log.error 'ranktop', err
ygopro.stoc_send_chat client, [parseInt(index)+1, user.points, user.name].join(' ') for index, user of users
ygopro.stoc_send_chat client, [parseInt(index)+1, user.points, user.name].join(' ')
when '/help'
ygopro.stoc_send_chat(client,"Mycard MatchServer 指令帮助") when '/help'
ygopro.stoc_send_chat(client,"/help 显示这个帮助信息") ygopro.stoc_send_chat(client,"Mycard MatchServer 指令帮助")
ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips ygopro.stoc_send_chat(client,"/help 显示这个帮助信息")
ygopro.stoc_send_chat(client,"/senddeck 发送自己的卡组") ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips
when '/tip' ygopro.stoc_send_chat(client,"/senddeck 发送自己的卡组")
ygopro.stoc_send_random_tip(client) if settings.modules.tips when '/tip'
#发送卡组 ygopro.stoc_send_random_tip(client) if settings.modules.tips
when '/senddeck' #发送卡组
if client.deck? when '/senddeck'
ygopro.stoc_send_chat(client, "正在读取卡组信息... ") if client.deck?
mycard.deck_url_short client.name, client.deck, (url)-> ygopro.stoc_send_chat(client, "正在读取卡组信息... ")
ygopro.stoc_send_chat_to_room(client.room, "卡组链接: " + url) mycard.deck_url_short client.name, client.deck, (url)->
else ygopro.stoc_send_chat_to_room(client.room, "卡组链接: " + url)
ygopro.stoc_send_chat_to_room(client.room, "读取卡组信息失败") else
when '/admin showroom' ygopro.stoc_send_chat_to_room(client.room, "读取卡组信息失败")
log.info client.room when '/admin showroom'
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)-> log.info client.room
log.info info ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
main = (info.deckbuf[i] for i in [0...info.mainc]) log.info info
side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec]) main = (info.deckbuf[i] for i in [0...info.mainc])
client.main = main side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec])
client.side = side client.main = main
client.side = side
if settings.modules.skip_empty_side
ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)-> if settings.modules.skip_empty_side
if not _.any(client.deck, (card_usage)->card_usage.side) ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'UPDATE_DECK', { if not _.any(client.deck, (card_usage)->card_usage.side)
mainc: client.main.length, ygopro.ctos_send server, 'UPDATE_DECK', {
sidec: 0, mainc: client.main.length,
deckbuf: client.main sidec: 0,
} deckbuf: client.main
ygopro.stoc_send_chat client, '等待更换副卡组中...' }
ygopro.stoc_send_chat client, '等待更换副卡组中...'
###
# 开包大战 ###
# 开包大战
packs_weighted_cards = {}
for pack, cards of require './packs.json' packs_weighted_cards = {}
packs_weighted_cards[pack] = [] for pack, cards of require './packs.json'
for card in cards packs_weighted_cards[pack] = []
for i in [0..card.count] for card in cards
packs_weighted_cards[pack].push card.card for i in [0..card.count]
packs_weighted_cards[pack].push card.card
console.log packs_weighted_cards
console.log packs_weighted_cards
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'HS_NOTREADY' ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
ygopro.ctos_send server, 'HS_NOTREADY'
deck = []
for pack in client.player deck = []
for i in [0...5] for pack in client.player
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)] for i in [0...5]
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
ygopro.ctos_send server, 'UPDATE_DECK', {
mainc: deck.length, ygopro.ctos_send server, 'UPDATE_DECK', {
sidec: 0, mainc: deck.length,
deckbuf: deck sidec: 0,
} deckbuf: deck
ygopro.ctos_send server, 'HS_READY' }
ygopro.ctos_send server, 'HS_READY'
###
###
#http
if settings.modules.http #http
level_points = require './level_points.json' if settings.modules.http
waiting = [[]] level_points = require './level_points.json'
for i of level_points waiting = [[]]
waiting.push [] for i of level_points
waiting.push []
log.info 'level_points loaded', level_points
http.createServer (request, response)-> log.info 'level_points loaded', level_points
#http://122.0.65.70:7922/?operation=getroomjson http.createServer (request, response)->
url = url.parse(request.url) #http://122.0.65.70:7922/?operation=getroomjson
#log.info url url = url.parse(request.url)
if url.pathname == '/count.json' #log.info url
response.writeHead(200); if url.pathname == '/count.json'
response.end(Room.all.length.toString()) response.writeHead(200);
else if url.pathname == '/match' response.end(Room.all.length.toString())
if request.headers['authorization'] else if url.pathname == '/match'
[name, password] = new Buffer(request.headers['authorization'].split(/\s+/).pop() ? '','base64').toString().split(':') if request.headers['authorization']
User.findOne { name: name }, (err, user)-> [name, password] = new Buffer(request.headers['authorization'].split(/\s+/).pop() ? '','base64').toString().split(':')
if !user User.findOne { name: name }, (err, user)->
user = new User({name: name, points: 0, elo: 1400}) if !user
user.save() user = new User({name: name, points: 0, elo: 1400})
level = level_points.length user.save()
for index, points of level_points level = level_points.length
if user.points < points for index, points of level_points
level = index if user.points < points
break level = index
response.allowance = 0 break
waiting[level].push response response.allowance = 0
request.on 'close', ()-> waiting[level].push response
index = waiting[level].indexOf(response) request.on 'close', ()->
waiting[level].splice(index, 1) unless index == -1 index = waiting[level].indexOf(response)
else waiting[level].splice(index, 1) unless index == -1
#log.info 'unauth match' else
#response.writeHead(401); #log.info 'unauth match'
#response.end("请更新mycard到1.2.8版本"); #response.writeHead(401);
level = 1 #response.end("请更新mycard到1.2.8版本");
response.allowance = 0 level = 1
waiting[level].push response response.allowance = 0
request.on 'close', ()-> waiting[level].push response
index = waiting[level].indexOf(response) request.on 'close', ()->
waiting[level].splice(index, 1) unless index == -1 index = waiting[level].indexOf(response)
waiting[level].splice(index, 1) unless index == -1
else if url.pathname == '/rooms.json'
response.writeHead(404); else if url.pathname == '/rooms.json'
response.end(); response.writeHead(404);
else if url.query == 'operation=getroomjson' response.end();
response.writeHead(200); else if url.query == 'operation=getroomjson'
response.end JSON.stringify rooms: (for room in Room.all when room.established response.writeHead(200);
roomid: room.port.toString(), response.end JSON.stringify rooms: (for room in Room.all when room.established
roomname: room.name.split('$',2)[0], roomid: room.port.toString(),
needpass: (room.name.indexOf('$') != -1).toString(), roomname: room.name.split('$',2)[0],
users: (for player in room.players when player.pos? needpass: (room.name.indexOf('$') != -1).toString(),
id: (-1).toString(), users: (for player in room.players when player.pos?
name: player.name, id: (-1).toString(),
pos: player.pos name: player.name,
), pos: player.pos
istart: if room.started then "start" else "wait" ),
) istart: if room.started then "start" else "wait"
else )
response.writeHead(404); else
response.end(); response.writeHead(404);
.listen settings.modules.http.port response.end();
.listen settings.modules.http.port
setInterval ()->
for level in [level_points.length..0] setInterval ()->
for index, player of waiting[level] for level in [level_points.length..0]
opponent_level = null for index, player of waiting[level]
opponent = _.find waiting[level], (opponent)-> opponent_level = null
log.info opponent,player opponent = _.find waiting[level], (opponent)->
opponent isnt player log.info opponent,player
log.info '--------1--------', waiting, opponent opponent isnt player
log.info '--------1--------', waiting, opponent
if opponent
opponent_level = level if opponent
else if player.allowance > 0 opponent_level = level
for displacement in [1..player.allowance] else if player.allowance > 0
if level+displacement <= level_points.length for displacement in [1..player.allowance]
opponent = waiting[level+displacement][0] if level+displacement <= level_points.length
if opponent opponent = waiting[level+displacement][0]
opponent_level = level+displacement if opponent
break opponent_level = level+displacement
if level-displacement >= 0 break
opponent = waiting[level-displacement][0] if level-displacement >= 0
if opponent opponent = waiting[level-displacement][0]
opponent_level = level-displacement if opponent
break opponent_level = level-displacement
break
if opponent
if waiting[level].indexOf(player) == -1 or waiting[opponent_level].indexOf(opponent) == -1 if opponent
log.info waiting, player, level, opponent, opponent_level if waiting[level].indexOf(player) == -1 or waiting[opponent_level].indexOf(opponent) == -1
throw 'WTF' log.info waiting, player, level, opponent, opponent_level
waiting[level].splice(waiting[level].indexOf(player), 1) throw 'WTF'
waiting[opponent_level].splice(waiting[opponent_level].indexOf(opponent), 1) waiting[level].splice(waiting[level].indexOf(player), 1)
index-- waiting[opponent_level].splice(waiting[opponent_level].indexOf(opponent), 1)
index--
room = "mycard://#{settings.ip}:#{settings.port}/M##{_.uniqueId()}$#{_.random(999)}"
log.info 'matched', room room = "mycard://#{settings.ip}:#{settings.port}/M##{_.uniqueId()}$#{_.random(999)}"
headers = {"Access-Control-Allow-Origin":"*","Content-Type": "text/plain"} log.info 'matched', room
player.writeHead(200, headers) headers = {"Access-Control-Allow-Origin":"*","Content-Type": "text/plain"}
player.end room player.writeHead(200, headers)
opponent.writeHead(200, headers) player.end room
opponent.end room opponent.writeHead(200, headers)
opponent.end room
else
player.allowance++ else
player.allowance++
, 2000
, 2000
#清理90s没活动的房间
inotify = new Inotify() #清理90s没活动的房间
inotify.addWatch inotify = new Inotify()
path: 'ygocore/replay', inotify.addWatch
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY, path: 'ygocore/replay',
callback: (event)-> watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY,
mask = event.mask callback: (event)->
if event.name mask = event.mask
port = parseInt path.basename(event.name, '.yrp') if event.name
room = Room.find_by_port port port = parseInt path.basename(event.name, '.yrp')
if room room = Room.find_by_port port
if mask & Inotify.IN_CREATE if room
else if mask & Inotify.IN_CLOSE_WRITE if mask & Inotify.IN_CREATE
fs.unlink path.join('ygocore/replay'), (err)-> else if mask & Inotify.IN_CLOSE_WRITE
else if mask & Inotify.IN_MODIFY fs.unlink path.join('ygocore/replay'), (err)->
room.alive = true else if mask & Inotify.IN_MODIFY
else room.alive = true
log.error "event without filename" else
log.error "event without filename"
setInterval ()->
for room in Room.all setInterval ()->
if room.alive for room in Room.all
room.alive = false if room.alive
else room.alive = false
log.info "kill room", room.port else
log.info "kill room", room.port
for player in room.players
ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed for player in room.players
room.process.kill() ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed
room.process.kill()
, 900000 , 900000
\ No newline at end of file
...@@ -464,13 +464,15 @@ ...@@ -464,13 +464,15 @@
tips = null; tips = null;
request({ if (settings.modules.tips) {
url: settings.modules.tips, request({
json: true url: settings.modules.tips,
}, function(error, response, body) { json: true
tips = body; }, function(error, response, body) {
return log.info("tips loaded", tips.length); tips = body;
}); return log.info("tips loaded", tips.length);
});
}
ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server) { ygopro.stoc_follow('DUEL_START', false, function(buffer, info, client, server) {
var player, _i, _len, _ref; var player, _i, _len, _ref;
......
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
"ygopro-server.coffee" "ygopro-server.coffee"
], ],
"names": [], "names": [],
"mappings": "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" "mappings": "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"
} }
\ No newline at end of file
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