Commit cc1f556d authored by 神楽坂玲奈's avatar 神楽坂玲奈

websocket support init

parent aca7c5e3
{ {
"name": "ygopro-server", "name": "ygopro-server",
"version": "2.1.0", "version": "2.1.0",
"description": "a server for ygopro", "description": "a server for ygopro",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/mycard/ygopro-server.git" "url": "https://github.com/mycard/ygopro-server.git"
}, },
"keywords": [ "keywords": [
"mycard", "mycard",
"ygopro", "ygopro",
"server" "server"
], ],
"author": "zh99998 <zh99998@gmail.com>", "author": "zh99998 <zh99998@gmail.com>",
"dependencies": { "dependencies": {
"underscore": "*", "underscore": "*",
"underscore.string": "*", "underscore.string": "*",
"freeport": "*", "freeport": "*",
"inotify": "*", "inotify": "*",
"request": "*", "request": "*",
"mongoose": "*", "mongoose": "*",
"bunyan": "*" "bunyan": "*",
}, "websocket": "~1.0.8"
"license": "GPLv3", },
"main": "ygopro-server.js", "license": "GPLv3",
"scripts": { "main": "ygopro-server.js",
"start": "forever start mycard-server-match.js", "scripts": {
"build": "coffee -c mycard-server-match.coffee" "start": "forever start mycard-server-match.js",
}, "build": "coffee -c mycard-server-match.coffee"
"engines": { },
"node": "*" "engines": {
} "node": "*"
} }
\ No newline at end of file }
...@@ -54,7 +54,9 @@ class Room ...@@ -54,7 +54,9 @@ class Room
@status = 'starting' @status = 'starting'
@established = false @established = false
@watcher_buffers = [] @watcher_buffers = []
@watcher_stanzas = []
@watchers = [] @watchers = []
@ws_watchers = []
Room.all.push this Room.all.push this
@hostinfo = @hostinfo =
...@@ -218,5 +220,4 @@ class Room ...@@ -218,5 +220,4 @@ class Room
@process.kill() @process.kill()
this.delete() this.delete()
module.exports = Room module.exports = Room
\ No newline at end of file
...@@ -74,7 +74,9 @@ ...@@ -74,7 +74,9 @@
this.status = 'starting'; this.status = 'starting';
this.established = false; this.established = false;
this.watcher_buffers = []; this.watcher_buffers = [];
this.watcher_stanzas = [];
this.watchers = []; this.watchers = [];
this.ws_watchers = [];
Room.all.push(this); Room.all.push(this);
this.hostinfo = { this.hostinfo = {
lflist: 0, lflist: 0,
......
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
"room.coffee" "room.coffee"
], ],
"names": [], "names": [],
"mappings": "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" "mappings": "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"
} }
\ No newline at end of file
#标准库 #标准库
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' WebSocketServer = require('websocket').server
request = require 'request'
bunyan = require 'bunyan'
bunyan = require 'bunyan'
#配置文件
settings = require './config.json' #配置文件
settings = require './config.json'
#组件
ygopro = require './ygopro.js' #组件
mycard = require './mycard.js' ygopro = require './ygopro.js'
Room = require './room.js' mycard = require './mycard.js'
User = require './user.js' if settings.modules.database Room = require './room.js'
Deck = require './deck.js' if settings.modules.database User = require './user.js' if settings.modules.database
Deck = require './deck.js' if settings.modules.database
victories = require './victories.json'
victories = require './victories.json'
#debug模式 端口号+1
debug = false #debug模式 端口号+1
log = null debug = false
if process.argv[2] == '--debug' log = null
settings.port++ if process.argv[2] == '--debug'
settings.modules.http.port++ if settings.modules.http settings.port++
log = bunyan.createLogger name: "mycard-debug" settings.modules.http.port++ if settings.modules.http
else log = bunyan.createLogger name: "mycard-debug"
log = bunyan.createLogger name: "mycard" else
log = bunyan.createLogger name: "mycard"
#网络连接
net.createServer (client) -> #网络连接
server = new net.Socket() net.createServer (client) ->
client.server = server server = new net.Socket()
client.server = server
#释放处理
client.on 'close', (had_error) -> #释放处理
log.info "client closed", client.name, had_error client.on 'close', (had_error) ->
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector log.info "client closed", client.name, had_error
unless client.closed client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
client.closed = true unless client.closed
client.room.disconnect(client) if client.room client.closed = true
server.end() client.room.disconnect(client) if client.room
server.end()
client.on 'error', (error)->
log.info "client error", client.name, error client.on 'error', (error)->
client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector log.info "client error", client.name, error
unless client.closed client.room.disconnector = client if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
client.closed = error unless client.closed
client.room.disconnect(client, error) if client.room client.closed = error
server.end() client.room.disconnect(client, error) if client.room
server.end()
server.on 'close', (had_error) ->
log.info "server closed", client.name, had_error server.on 'close', (had_error) ->
server.closed = true unless server.closed log.info "server closed", client.name, had_error
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector server.closed = true unless server.closed
unless client.closed client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
ygopro.stoc_send_chat(client, "服务器关闭了连接") unless client.closed
client.end() ygopro.stoc_send_chat(client, "服务器关闭了连接")
client.end()
server.on 'error', (error)->
log.info "server error", client.name, error server.on 'error', (error)->
server.closed = error log.info "server error", client.name, error
client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector server.closed = error
unless client.closed client.room.disconnector = 'server' if client.room and client.room.started and client in client.room.dueling_players and !client.room.disconnector
ygopro.stoc_send_chat(client, "服务器错误: #{error}") unless client.closed
client.end() ygopro.stoc_send_chat(client, "服务器错误: #{error}")
client.end()
#需要重构
#客户端到服务端(ctos)协议分析 #需要重构
ctos_buffer = new Buffer(0) #客户端到服务端(ctos)协议分析
ctos_message_length = 0 ctos_buffer = new Buffer(0)
ctos_proto = 0 ctos_message_length = 0
ctos_proto = 0
client.pre_establish_buffers = new Array()
client.pre_establish_buffers = new Array()
client.on 'data', (data) ->
if client.is_post_watcher client.on 'data', (data) ->
client.room.watcher.write data if client.is_post_watcher
else client.room.watcher.write data
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学 else
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
if client.established
server.write data if client.established
else server.write data
client.pre_establish_buffers.push data else
client.pre_establish_buffers.push data
while true
if ctos_message_length == 0 while true
if ctos_buffer.length >= 2 if ctos_message_length == 0
ctos_message_length = ctos_buffer.readUInt16LE(0) if ctos_buffer.length >= 2
else ctos_message_length = ctos_buffer.readUInt16LE(0)
break else
else if ctos_proto == 0 break
if ctos_buffer.length >= 3 else if ctos_proto == 0
ctos_proto = ctos_buffer.readUInt8(2) if ctos_buffer.length >= 3
else ctos_proto = ctos_buffer.readUInt8(2)
break else
else break
if ctos_buffer.length >= 2 + ctos_message_length else
#console.log "CTOS", ygopro.constants.CTOS[ctos_proto] if ctos_buffer.length >= 2 + ctos_message_length
if ygopro.ctos_follows[ctos_proto] #console.log "CTOS", ygopro.constants.CTOS[ctos_proto]
b = ctos_buffer.slice(3, ctos_message_length-1+3) if ygopro.ctos_follows[ctos_proto]
if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]] b = ctos_buffer.slice(3, ctos_message_length-1+3)
struct._setBuff(b) if struct = ygopro.structs[ygopro.proto_structs.CTOS[ygopro.constants.CTOS[ctos_proto]]]
ygopro.ctos_follows[ctos_proto].callback b, _.clone(struct.fields), client, server struct._setBuff(b)
else ygopro.ctos_follows[ctos_proto].callback b, _.clone(struct.fields), client, server
ygopro.ctos_follows[ctos_proto].callback b, null, client, server else
ygopro.ctos_follows[ctos_proto].callback b, null, client, server
ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_message_length = 0 ctos_buffer = ctos_buffer.slice(2 + ctos_message_length)
ctos_proto = 0 ctos_message_length = 0
else ctos_proto = 0
break else
break
#服务端到客户端(stoc)
stoc_buffer = new Buffer(0) #服务端到客户端(stoc)
stoc_message_length = 0 stoc_buffer = new Buffer(0)
stoc_proto = 0 stoc_message_length = 0
stoc_proto = 0
server.on 'data', (data)->
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学 server.on 'data', (data)->
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
client.write data #unless ygopro.stoc_follows[stoc_proto] and ygopro.stoc_follows[stoc_proto].synchronous
client.write data
while true
if stoc_message_length == 0 while true
if stoc_buffer.length >= 2 if stoc_message_length == 0
stoc_message_length = stoc_buffer.readUInt16LE(0) if stoc_buffer.length >= 2
else stoc_message_length = stoc_buffer.readUInt16LE(0)
break else
else if stoc_proto == 0 break
if stoc_buffer.length >= 3 else if stoc_proto == 0
stoc_proto = stoc_buffer.readUInt8(2) if stoc_buffer.length >= 3
else stoc_proto = stoc_buffer.readUInt8(2)
break else
else break
if stoc_buffer.length >= 2 + stoc_message_length else
#console.log "STOC", ygopro.constants.STOC[stoc_proto] if stoc_buffer.length >= 2 + stoc_message_length
if ygopro.stoc_follows[stoc_proto] #console.log "STOC", ygopro.constants.STOC[stoc_proto]
b = stoc_buffer.slice(3, stoc_message_length - 1 + 3) stanzas = stoc_proto
if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]] if ygopro.stoc_follows[stoc_proto]
struct._setBuff(b) b = stoc_buffer.slice(3, stoc_message_length - 1 + 3)
ygopro.stoc_follows[stoc_proto].callback b, _.clone(struct.fields), client, server if struct = ygopro.structs[ygopro.proto_structs.STOC[ygopro.constants.STOC[stoc_proto]]]
else struct._setBuff(b)
ygopro.stoc_follows[stoc_proto].callback b, null, client, server ygopro.stoc_follows[stoc_proto].callback b, _.clone(struct.fields), client, server
else
stoc_buffer = stoc_buffer.slice(2 + stoc_message_length) ygopro.stoc_follows[stoc_proto].callback b, null, client, server
stoc_message_length = 0
stoc_proto = 0 stoc_buffer = stoc_buffer.slice(2 + stoc_message_length)
else stoc_message_length = 0
break stoc_proto = 0
else
.listen settings.port, -> break
log.info "server started", settings.ip, settings.port
.listen settings.port, ->
#功能模块 log.info "server started", settings.ip, settings.port
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)-> #功能模块
client.name = info.name #在创建room之前暂存
ygopro.ctos_follow 'PLAYER_INFO', true, (buffer, info, client, server)->
ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> client.name = info.name #在创建room之前暂存
#log.info info
if info.version != settings.version ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
ygopro.stoc_send client, 'ERROR_MSG',{ #log.info info
msg: 4 if info.version != settings.version
code: settings.version ygopro.stoc_send client, 'ERROR_MSG',{
} msg: 4
client.end() code: settings.version
else if !info.pass.length }
ygopro.stoc_send_chat(client,"房间为空,请修改房间名") client.end()
ygopro.stoc_send client, 'ERROR_MSG',{ else if !info.pass.length
msg: 1 ygopro.stoc_send_chat(client,"房间为空,请修改房间名")
code: 2 ygopro.stoc_send client, 'ERROR_MSG',{
} msg: 1
client.end() code: 2
else if !Room.validate(info.pass) }
#ygopro.stoc_send client, 'ERROR_MSG',{ client.end()
# msg: 1 else if !Room.validate(info.pass)
# code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示 #ygopro.stoc_send client, 'ERROR_MSG',{
#} # msg: 1
ygopro.stoc_send_chat(client,"房间密码不正确") # code: 1 #这返错有问题,直接双ygopro直连怎么都正常,在这里就经常弹不出提示
ygopro.stoc_send client, 'ERROR_MSG',{ #}
msg: 1 ygopro.stoc_send_chat(client,"房间密码不正确")
code: 2 ygopro.stoc_send client, 'ERROR_MSG',{
} msg: 1
client.end() code: 2
}
else if client.name == '[INCORRECT]' #模拟用户验证 client.end()
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1 else if client.name == '[INCORRECT]' #模拟用户验证
code: 2 ygopro.stoc_send client, 'ERROR_MSG',{
} msg: 1
client.end() code: 2
else }
log.info 'join_game',info.pass, client.name client.end()
client.room = Room.find_or_create_by_name(info.pass) else
if client.room.started log.info 'join_game',info.pass, client.name
if settings.modules.post_start_watching client.room = Room.find_or_create_by_name(info.pass)
client.is_post_watcher = true if client.room.started
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战" if settings.modules.post_start_watching
client.room.watchers.push client client.is_post_watcher = true
for buffer in client.room.watcher_buffers ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
client.write buffer client.room.watchers.push client
ygopro.stoc_send_chat client, "观战中." for buffer in client.room.watcher_buffers
else client.write buffer
ygopro.stoc_send_chat(client,"决斗已开始") ygopro.stoc_send_chat client, "观战中."
ygopro.stoc_send client, 'ERROR_MSG',{ else
msg: 1 ygopro.stoc_send_chat(client,"决斗已开始")
code: 2 ygopro.stoc_send client, 'ERROR_MSG',{
} msg: 1
client.end() code: 2
else }
client.room.connect(client) client.end()
else
###################################################################################################################### client.room.connect(client)
ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ######################################################################################################################
#欢迎信息
if settings.modules.welcome ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
ygopro.stoc_send_chat client, settings.modules.welcome #欢迎信息
if settings.modules.database if settings.modules.welcome
if _.startsWith(client.room.name, 'M#') ygopro.stoc_send_chat client, settings.modules.welcome
User.findOne { name: client.name }, (err, user)-> if settings.modules.database
if !user if _.startsWith(client.room.name, 'M#')
user = new User({name: client.name, points: 0}) User.findOne { name: client.name }, (err, user)->
user.save() if !user
User.count {points:{$gt:user.points}}, (err, count)-> user = new User({name: client.name, points: 0})
rank = count + 1 user.save()
ygopro.stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,排名#{rank},这些积分以后正式使用时会重置") User.count {points:{$gt:user.points}}, (err, count)->
rank = count + 1
if settings.modules.post_start_watching and !client.room.watcher ygopro.stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,排名#{rank},这些积分以后正式使用时会重置")
client.room.watcher = watcher = net.connect client.room.port, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', { if settings.modules.post_start_watching and !client.room.watcher
name: "the Big Brother" client.room.watcher = watcher = net.connect client.room.port, ->
} ygopro.ctos_send watcher, 'PLAYER_INFO', {
ygopro.ctos_send watcher, 'JOIN_GAME', { name: "the Big Brother"
version: settings.version, }
gameid: 2577, ygopro.ctos_send watcher, 'JOIN_GAME', {
some_unknown_mysterious_fucking_thing: 0 version: settings.version,
pass: "" gameid: 2577,
} some_unknown_mysterious_fucking_thing: 0
ygopro.ctos_send watcher, 'HS_TOOBSERVER' pass: ""
}
watcher.on 'data', (data)-> ygopro.ctos_send watcher, 'HS_TOOBSERVER'
client.room.watcher_buffers.push data
for w in client.room.watchers watcher.ws_buffer = new Buffer(0)
w.write data if w #a WTF fix watcher.ws_message_length = 0
client.room.watcher_stanzas = []
watcher.on 'error', (error)->
log.error "watcher error", error watcher.on 'data', (data)->
client.room.watcher_buffers.push data
#登场台词 for w in client.room.watchers
if settings.modules.dialogues w.write data if w #a WTF fix
dialogues = {}
request watcher.ws_buffer = Buffer.concat([watcher.ws_buffer, data], watcher.ws_buffer.length + data.length) #buffer的错误使用方式,好孩子不要学
url: settings.modules.dialogues
json: true while true
, (error, response, body)-> if watcher.ws_message_length == 0
if _.isString body if watcher.ws_buffer.length >= 2
log.warn "dialogues bad json", body watcher.ws_message_length = watcher.ws_buffer.readUInt16LE(0)
else if error or !body else
log.warn 'dialogues error', error, response break
else else
log.info "dialogues loaded", _.size body if watcher.ws_buffer.length >= 2 + watcher.ws_message_length
dialogues = body stanza = watcher.ws_buffer.slice(2, watcher.ws_message_length + 2)
for w in client.room.ws_watchers
ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> w.sendBytes stanza if w #a WTF fix
msg = buffer.readInt8(0) client.room.watcher_stanzas.push stanza
#log.info 'MSG', ygopro.constants.MSG[msg]
if ygopro.constants.MSG[msg] == 'START' watcher.ws_buffer = watcher.ws_buffer.slice(2 + watcher.ws_message_length)
playertype = buffer.readUInt8(1) watcher.ws_message_length = 0
client.is_first = !(playertype & 0xf); else
client.lp = client.room.hostinfo.start_lp break
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.name} 初始LP #{client.lp}") watcher.on 'error', (error)->
if ygopro.constants.MSG[msg] == 'WIN' and _.startsWith(client.room.name, 'M#') and client.is_host log.error "watcher error", error
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first or pos == 2 watcher.on 'close', (had_error)->
reason = buffer.readUInt8(2) for w in client.room.ws_watchers
log.info {winner: pos, reason: reason} w.close()
client.room.duels.push {winner: pos, reason: reason}
#lp跟踪 #登场台词
if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host if settings.modules.dialogues
pos = buffer.readUInt8(1) dialogues = {}
pos = 1 - pos unless client.is_first request
val = buffer.readInt32LE(2) url: settings.modules.dialogues
client.room.dueling_players[pos].lp -= val json: true
, (error, response, body)->
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 受到伤害 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}") if _.isString body
if 0 < client.room.dueling_players[pos].lp <= 100 log.warn "dialogues bad json", body
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!") else if error or !body
log.warn 'dialogues error', error, response
if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host else
pos = buffer.readUInt8(1) log.info "dialogues loaded", _.size body
pos = 1 - pos unless client.is_first dialogues = body
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp += val ygopro.stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
msg = buffer.readInt8(0)
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 回复 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}") #log.info 'MSG', ygopro.constants.MSG[msg]
if ygopro.constants.MSG[msg] == 'START'
if ygopro.constants.MSG[msg] == 'LPUPDATE' and client.is_host playertype = buffer.readUInt8(1)
pos = buffer.readUInt8(1) client.is_first = !(playertype & 0xf);
pos = 1 - pos unless client.is_first client.lp = client.room.hostinfo.start_lp
val = buffer.readInt32LE(2)
client.room.dueling_players[pos].lp = val #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
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 的LP变成 #{client.room.dueling_players[pos].lp}") pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first or pos == 2
if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host reason = buffer.readUInt8(2)
pos = buffer.readUInt8(1) log.info {winner: pos, reason: reason}
pos = 1 - pos unless client.is_first client.room.duels.push {winner: pos, reason: reason}
val = buffer.readInt32LE(2) #lp跟踪
client.room.dueling_players[pos].lp -= val if ygopro.constants.MSG[msg] == 'DAMAGE' and client.is_host
pos = buffer.readUInt8(1)
#ygopro.stoc_send_chat_to_room(client.room, "LP跟踪调试信息: #{client.room.dueling_players[pos].name} 支付 #{val},现在的LP为 #{client.room.dueling_players[pos].lp}") pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
if 0 < client.room.dueling_players[pos].lp <= 100 client.room.dueling_players[pos].lp -= val
ygopro.stoc_send_chat_to_room(client.room, "背水一战!")
#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
ygopro.stoc_send_chat_to_room(client.room, "你的生命已经如风中残烛了!")
#登场台词
if settings.modules.dialogues if ygopro.constants.MSG[msg] == 'RECOVER' and client.is_host
if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING' pos = buffer.readUInt8(1)
card = buffer.readUInt32LE(1) pos = 1 - pos unless client.is_first
if dialogues[card] val = buffer.readInt32LE(2)
for line in _.lines dialogues[card][Math.floor(Math.random() * dialogues[card].length)] client.room.dueling_players[pos].lp += val
ygopro.stoc_send_chat client, line
#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
pos = buffer.readUInt8(1)
pos = 1 - pos unless client.is_first
val = buffer.readInt32LE(2)
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_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
#console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}" if ygopro.constants.MSG[msg] == 'PAY_LPCOST' and client.is_host
#room = client.room pos = buffer.readUInt8(1)
#if !room pos = 1 - pos unless client.is_first
# console.log "[WARN]player_enter: can't find room by player #{client.player}" val = buffer.readInt32LE(2)
# return client.room.dueling_players[pos].lp -= val
#room.pos_name[info.pos] = info.name
#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_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
#client.ready = info.status & 0xF != 0 if 0 < client.room.dueling_players[pos].lp <= 100
#client.pos = info.status >> 4 ygopro.stoc_send_chat_to_room(client.room, "背水一战!")
#console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
###
ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)-> #登场台词
selftype = info.type & 0xf; if settings.modules.dialogues
is_host = ((info.type >> 4) & 0xf) != 0; if ygopro.constants.MSG[msg] == 'SUMMONING' or ygopro.constants.MSG[msg] == 'SPSUMMONING'
client.is_host = is_host card = buffer.readUInt32LE(1)
client.pos = selftype if dialogues[card]
#console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host for line in _.lines dialogues[card][Math.floor(Math.random() * dialogues[card].length)]
ygopro.stoc_send_chat client, line
#tip
ygopro.stoc_send_random_tip = (client)->
ygopro.stoc_send_chat client, "Tip: " + tips[Math.floor(Math.random() * tips.length)] if tips
tips = null
if settings.modules.tips
request
url: settings.modules.tips ###
json: true #房间管理
, (error, response, body)-> ygopro.stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
tips = body #console.log "PLAYER_ENTER to #{client.name}: #{info.name}, #{info.pos}"
log.info "tips loaded", tips.length #room = client.room
#if !room
ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> # console.log "[WARN]player_enter: can't find room by player #{client.player}"
unless client.room.started #first start # return
client.room.started = true #room.pos_name[info.pos] = info.name
client.room.duels = []
client.room.dueling_players = [] ygopro.stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
for player in client.room.players when player.pos != 7 #client.ready = info.status & 0xF != 0
client.room.dueling_players[player.pos] = player #client.pos = info.status >> 4
if !player.main #console.log "PLAYER_CHANGE to #{client.name}: #{info.status & 0xF != 0}, #{info.status >> 4}"
log.error 'WTF', client ###
else
player.deck = mycard.load_card_usages_from_cards(player.main, player.side) ygopro.stoc_follow 'TYPE_CHANGE', false, (buffer, info, client, server)->
selftype = info.type & 0xf;
if !client.room.dueling_players[0] or !client.room.dueling_players[1] is_host = ((info.type >> 4) & 0xf) != 0;
log.error 'incomplete room', client.room.dueling_players, client.room.players client.is_host = is_host
client.pos = selftype
if settings.modules.tips #console.log "TYPE_CHANGE to #{client.name}:", info, selftype, is_host
ygopro.stoc_send_random_tip(client)
#tip
ygopro.ctos_follow 'CHAT', false, (buffer, info, client, server)-> ygopro.stoc_send_random_tip = (client)->
switch _.trim(info.msg) ygopro.stoc_send_chat client, "Tip: " + tips[Math.floor(Math.random() * tips.length)] if tips
when '/ping'
execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)-> tips = null
if error if settings.modules.tips
ygopro.stoc_send_chat_to_room client.room, error request
else url: settings.modules.tips
line = _.lines(stdout)[2] json: true
if line.indexOf('rtt') != -1 , (error, response, body)->
ygopro.stoc_send_chat_to_room client.room, line tips = body
else log.info "tips loaded", tips.length
log.warn 'ping', stdout
ygopro.stoc_send_chat_to_room client.room, stdout ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
when '/ranktop' unless client.room.started #first start
if settings.modules.database client.room.started = true
User.find null, null, { sort: { points : -1 }, limit: 8 }, (err, users)-> client.room.duels = []
if err client.room.dueling_players = []
return log.error 'ranktop', err for player in client.room.players when player.pos != 7
for index, user of users client.room.dueling_players[player.pos] = player
ygopro.stoc_send_chat client, [parseInt(index)+1, user.points, user.name].join(' ') if !player.main
log.error 'WTF', client
when '/help' else
ygopro.stoc_send_chat(client,"Mycard MatchServer 指令帮助") player.deck = mycard.load_card_usages_from_cards(player.main, player.side)
ygopro.stoc_send_chat(client,"/help 显示这个帮助信息")
ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips if !client.room.dueling_players[0] or !client.room.dueling_players[1]
ygopro.stoc_send_chat(client,"/senddeck 发送自己的卡组") log.error 'incomplete room', client.room.dueling_players, client.room.players
when '/tip'
ygopro.stoc_send_random_tip(client) if settings.modules.tips if settings.modules.tips
#发送卡组 ygopro.stoc_send_random_tip(client)
when '/senddeck'
if client.deck? ygopro.ctos_follow 'CHAT', false, (buffer, info, client, server)->
ygopro.stoc_send_chat(client, "正在读取卡组信息... ") switch _.trim(info.msg)
mycard.deck_url_short client.name, client.deck, (url)-> when '/ping'
ygopro.stoc_send_chat_to_room(client.room, "卡组链接: " + url) execFile 'ss', ['-it', "dst #{client.remoteAddress}:#{client.remotePort}"], (error, stdout, stderr)->
else if error
ygopro.stoc_send_chat_to_room(client.room, "读取卡组信息失败") ygopro.stoc_send_chat_to_room client.room, error
when '/admin showroom' else
log.info client.room line = _.lines(stdout)[2]
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)-> if line.indexOf('rtt') != -1
log.info info ygopro.stoc_send_chat_to_room client.room, line
main = (info.deckbuf[i] for i in [0...info.mainc]) else
side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec]) log.warn 'ping', stdout
client.main = main ygopro.stoc_send_chat_to_room client.room, stdout
client.side = side when '/ranktop'
if settings.modules.database
if settings.modules.skip_empty_side User.find null, null, { sort: { points : -1 }, limit: 8 }, (err, users)->
ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)-> if err
if not _.any(client.deck, (card_usage)->card_usage.side) return log.error 'ranktop', err
ygopro.ctos_send server, 'UPDATE_DECK', { for index, user of users
mainc: client.main.length, ygopro.stoc_send_chat client, [parseInt(index)+1, user.points, user.name].join(' ')
sidec: 0,
deckbuf: client.main when '/help'
} ygopro.stoc_send_chat(client,"Mycard MatchServer 指令帮助")
ygopro.stoc_send_chat client, '等待更换副卡组中...' ygopro.stoc_send_chat(client,"/help 显示这个帮助信息")
ygopro.stoc_send_chat(client,"/tip 显示一条提示") if settings.modules.tips
### ygopro.stoc_send_chat(client,"/senddeck 发送自己的卡组")
# 开包大战 when '/tip'
ygopro.stoc_send_random_tip(client) if settings.modules.tips
packs_weighted_cards = {} #发送卡组
for pack, cards of require './packs.json' when '/senddeck'
packs_weighted_cards[pack] = [] if client.deck?
for card in cards ygopro.stoc_send_chat(client, "正在读取卡组信息... ")
for i in [0..card.count] mycard.deck_url_short client.name, client.deck, (url)->
packs_weighted_cards[pack].push card.card ygopro.stoc_send_chat_to_room(client.room, "卡组链接: " + url)
else
console.log packs_weighted_cards ygopro.stoc_send_chat_to_room(client.room, "读取卡组信息失败")
when '/admin showroom'
ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)-> log.info client.room
ygopro.ctos_send server, 'HS_NOTREADY' ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
log.info info
deck = [] main = (info.deckbuf[i] for i in [0...info.mainc])
for pack in client.player side = (info.deckbuf[i] for i in [info.mainc...info.mainc+info.sidec])
for i in [0...5] client.main = main
deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)] client.side = side
if settings.modules.skip_empty_side
ygopro.ctos_send server, 'UPDATE_DECK', { ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server)->
mainc: deck.length, if not _.any(client.deck, (card_usage)->card_usage.side)
sidec: 0, ygopro.ctos_send server, 'UPDATE_DECK', {
deckbuf: deck mainc: client.main.length,
} sidec: 0,
ygopro.ctos_send server, 'HS_READY' deckbuf: client.main
}
### ygopro.stoc_send_chat client, '等待更换副卡组中...'
#http ###
if settings.modules.http # 开包大战
level_points = require './level_points.json'
waiting = [[]] packs_weighted_cards = {}
for i of level_points for pack, cards of require './packs.json'
waiting.push [] packs_weighted_cards[pack] = []
for card in cards
log.info 'level_points loaded', level_points for i in [0..card.count]
http.createServer (request, response)-> packs_weighted_cards[pack].push card.card
#http://122.0.65.70:7922/?operation=getroomjson
url = url.parse(request.url) console.log packs_weighted_cards
#log.info url
if url.pathname == '/count.json' ygopro.ctos_follow 'UPDATE_DECK', false, (buffer, info, client, server)->
response.writeHead(200); ygopro.ctos_send server, 'HS_NOTREADY'
response.end(Room.all.length.toString())
else if url.pathname == '/match' deck = []
if request.headers['authorization'] for pack in client.player
[name, password] = new Buffer(request.headers['authorization'].split(/\s+/).pop() ? '','base64').toString().split(':') for i in [0...5]
User.findOne { name: name }, (err, user)-> deck.push packs_weighted_cards[pack][Math.floor(Math.random()*packs_weighted_cards[pack].length)]
if !user
user = new User({name: name, points: 0, elo: 1400})
user.save() ygopro.ctos_send server, 'UPDATE_DECK', {
level = level_points.length mainc: deck.length,
for index, points of level_points sidec: 0,
if user.points < points deckbuf: deck
level = index }
break ygopro.ctos_send server, 'HS_READY'
response.allowance = 0
waiting[level].push response ###
request.on 'close', ()->
index = waiting[level].indexOf(response) #http
waiting[level].splice(index, 1) unless index == -1 if settings.modules.http
else level_points = require './level_points.json'
#log.info 'unauth match' waiting = [[]]
#response.writeHead(401); for i of level_points
#response.end("请更新mycard到1.2.8版本"); waiting.push []
level = 1
response.allowance = 0 log.info 'level_points loaded', level_points
waiting[level].push response http_server = http.createServer (request, response)->
request.on 'close', ()-> #http://122.0.65.70:7922/?operation=getroomjson
index = waiting[level].indexOf(response) u = url.parse(request.url)
waiting[level].splice(index, 1) unless index == -1 #log.info u
if u.pathname == '/count.json'
else if url.pathname == '/rooms.json' response.writeHead(200);
response.writeHead(404); response.end(Room.all.length.toString())
response.end(); else if u.pathname == '/match'
else if url.query == 'operation=getroomjson' if request.headers['authorization']
response.writeHead(200); [name, password] = new Buffer(request.headers['authorization'].split(/\s+/).pop() ? '','base64').toString().split(':')
response.end JSON.stringify rooms: (for room in Room.all when room.established User.findOne { name: name }, (err, user)->
roomid: room.port.toString(), if !user
roomname: room.name.split('$',2)[0], user = new User({name: name, points: 0, elo: 1400})
needpass: (room.name.indexOf('$') != -1).toString(), user.save()
users: (for player in room.players when player.pos? level = level_points.length
id: (-1).toString(), for index, points of level_points
name: player.name, if user.points < points
pos: player.pos level = index
), break
istart: if room.started then "start" else "wait" response.allowance = 0
) waiting[level].push response
else request.on 'close', ()->
response.writeHead(404); index = waiting[level].indexOf(response)
response.end(); waiting[level].splice(index, 1) unless index == -1
.listen settings.modules.http.port else
#log.info 'unauth match'
setInterval ()-> #response.writeHead(401);
for level in [level_points.length..0] #response.end("请更新mycard到1.2.8版本");
for index, player of waiting[level] level = 1
opponent_level = null response.allowance = 0
opponent = _.find waiting[level], (opponent)-> waiting[level].push response
log.info opponent,player request.on 'close', ()->
opponent isnt player index = waiting[level].indexOf(response)
log.info '--------1--------', waiting, opponent waiting[level].splice(index, 1) unless index == -1
if opponent else if u.pathname == '/rooms.json'
opponent_level = level response.writeHead(404);
else if player.allowance > 0 response.end();
for displacement in [1..player.allowance] else if u.query == 'operation=getroomjson'
if level+displacement <= level_points.length response.writeHead(200);
opponent = waiting[level+displacement][0] response.end JSON.stringify rooms: (for room in Room.all when room.established
if opponent roomid: room.port.toString(),
opponent_level = level+displacement roomname: room.name.split('$',2)[0],
break needpass: (room.name.indexOf('$') != -1).toString(),
if level-displacement >= 0 users: (for player in room.players when player.pos?
opponent = waiting[level-displacement][0] id: (-1).toString(),
if opponent name: player.name,
opponent_level = level-displacement pos: player.pos
break ),
istart: if room.started then "start" else "wait"
if opponent )
if waiting[level].indexOf(player) == -1 or waiting[opponent_level].indexOf(opponent) == -1 else
log.info waiting, player, level, opponent, opponent_level response.writeHead(404);
throw 'WTF' response.end();
waiting[level].splice(waiting[level].indexOf(player), 1) http_server.listen settings.modules.http.port
waiting[opponent_level].splice(waiting[opponent_level].indexOf(opponent), 1)
index-- setInterval ()->
for level in [level_points.length..0]
room = "mycard://#{settings.ip}:#{settings.port}/M##{_.uniqueId()}$#{_.random(999)}" for index, player of waiting[level]
log.info 'matched', room opponent_level = null
headers = {"Access-Control-Allow-Origin":"*","Content-Type": "text/plain"} opponent = _.find waiting[level], (opponent)->
player.writeHead(200, headers) log.info opponent,player
player.end room opponent isnt player
opponent.writeHead(200, headers) log.info '--------1--------', waiting, opponent
opponent.end room
if opponent
else opponent_level = level
player.allowance++ else if player.allowance > 0
for displacement in [1..player.allowance]
, 2000 if level+displacement <= level_points.length
opponent = waiting[level+displacement][0]
if opponent
#清理90s没活动的房间 opponent_level = level+displacement
inotify = new Inotify() break
inotify.addWatch if level-displacement >= 0
path: 'ygocore/replay', opponent = waiting[level-displacement][0]
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY, if opponent
callback: (event)-> opponent_level = level-displacement
mask = event.mask break
if event.name
port = parseInt path.basename(event.name, '.yrp') if opponent
room = Room.find_by_port port if waiting[level].indexOf(player) == -1 or waiting[opponent_level].indexOf(opponent) == -1
if room log.info waiting, player, level, opponent, opponent_level
if mask & Inotify.IN_CREATE throw 'WTF'
else if mask & Inotify.IN_CLOSE_WRITE waiting[level].splice(waiting[level].indexOf(player), 1)
fs.unlink path.join('ygocore/replay'), (err)-> waiting[opponent_level].splice(waiting[opponent_level].indexOf(opponent), 1)
else if mask & Inotify.IN_MODIFY index--
room.alive = true
else room = "mycard://#{settings.ip}:#{settings.port}/M##{_.uniqueId()}$#{_.random(999)}"
log.error "event without filename" log.info 'matched', room
headers = {"Access-Control-Allow-Origin":"*","Content-Type": "text/plain"}
setInterval ()-> player.writeHead(200, headers)
for room in Room.all player.end room
if room.alive opponent.writeHead(200, headers)
room.alive = false opponent.end room
else
log.info "kill room", room.port else
player.allowance++
for player in room.players
ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed , 2000
room.process.kill()
, 900000 originIsAllowed = (origin) ->
\ No newline at end of file # allow all origin, for debug
true
wsServer = new WebSocketServer(
httpServer: http_server
autoAcceptConnections: false
)
wsServer.on "request", (request) ->
unless originIsAllowed(request.origin)
# Make sure we only accept requests from an allowed origin
request.reject()
console.log (new Date()) + " Connection from origin " + request.origin + " rejected."
return
room_name = decodeURIComponent(request.resource.slice(1))
if room_name == 'started'
room = _.find Room.all, (room)->
room.started
else
room = Room.find_by_name room_name
unless room
request.reject()
console.log (new Date()) + " Connection from origin " + request.origin + " rejected. #{room_name}"
return
connection = request.accept(null, request.origin)
console.log (new Date()) + " Connection accepted. #{room.name}"
room.ws_watchers.push connection
for stanza in room.watcher_stanzas
connection.sendBytes stanza
###
connection.on "message", (message) ->
if message.type is "utf8"
console.log "Received Message: " + message.utf8Data
connection.sendUTF message.utf8Data
else if message.type is "binary"
console.log "Received Binary Message of " + message.binaryData.length + " bytes"
connection.sendBytes message.binaryData
###
connection.on "close", (reasonCode, description) ->
index = _.indexOf(room.ws_watchers, connection)
room.ws_watchers.splice(index, 1) unless index == -1
console.log (new Date()) + " Peer " + connection.remoteAddress + " disconnected."
#清理90s没活动的房间
inotify = new Inotify()
inotify.addWatch
path: 'ygocore/replay',
watch_for: Inotify.IN_CLOSE_WRITE | Inotify.IN_CREATE | Inotify.IN_MODIFY,
callback: (event)->
mask = event.mask
if event.name
port = parseInt path.basename(event.name, '.yrp')
room = Room.find_by_port port
if room
if mask & Inotify.IN_CREATE
else if mask & Inotify.IN_CLOSE_WRITE
fs.unlink path.join('ygocore/replay'), (err)->
else if mask & Inotify.IN_MODIFY
room.alive = true
else
log.error "event without filename"
###
setInterval ()->
for room in Room.all
if room.alive
room.alive = false
else
log.info "kill room", room.port
for player in room.players
ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed
room.process.kill()
, 900000
###
\ No newline at end of file
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
(function() { (function() {
var Deck, Inotify, Room, User, bunyan, debug, dialogues, execFile, fs, http, i, inotify, level_points, log, mycard, net, path, request, settings, tips, url, victories, waiting, ygopro, _, var Deck, Inotify, Room, User, WebSocketServer, bunyan, debug, dialogues, execFile, fs, http, http_server, i, inotify, level_points, log, mycard, net, originIsAllowed, path, request, settings, tips, url, victories, waiting, wsServer, ygopro, _,
__indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
net = require('net'); net = require('net');
...@@ -23,6 +23,8 @@ ...@@ -23,6 +23,8 @@
Inotify = require('inotify').Inotify; Inotify = require('inotify').Inotify;
WebSocketServer = require('websocket').server;
request = require('request'); request = require('request');
bunyan = require('bunyan'); bunyan = require('bunyan');
...@@ -172,7 +174,7 @@ ...@@ -172,7 +174,7 @@
stoc_message_length = 0; stoc_message_length = 0;
stoc_proto = 0; stoc_proto = 0;
return server.on('data', function(data) { return server.on('data', function(data) {
var b, struct, _results; var b, stanzas, struct, _results;
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length); stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length);
client.write(data); client.write(data);
_results = []; _results = [];
...@@ -191,6 +193,7 @@ ...@@ -191,6 +193,7 @@
} }
} else { } else {
if (stoc_buffer.length >= 2 + stoc_message_length) { if (stoc_buffer.length >= 2 + stoc_message_length) {
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);
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]]]) {
...@@ -316,24 +319,61 @@ ...@@ -316,24 +319,61 @@
}); });
return ygopro.ctos_send(watcher, 'HS_TOOBSERVER'); return ygopro.ctos_send(watcher, 'HS_TOOBSERVER');
}); });
watcher.ws_buffer = new Buffer(0);
watcher.ws_message_length = 0;
client.room.watcher_stanzas = [];
watcher.on('data', function(data) { watcher.on('data', function(data) {
var w, _i, _len, _ref, _results; var stanza, w, _i, _j, _len, _len1, _ref, _ref1, _results;
client.room.watcher_buffers.push(data); client.room.watcher_buffers.push(data);
_ref = client.room.watchers; _ref = client.room.watchers;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) { for (_i = 0, _len = _ref.length; _i < _len; _i++) {
w = _ref[_i]; w = _ref[_i];
if (w) { if (w) {
_results.push(w.write(data)); w.write(data);
}
}
watcher.ws_buffer = Buffer.concat([watcher.ws_buffer, data], watcher.ws_buffer.length + data.length);
_results = [];
while (true) {
if (watcher.ws_message_length === 0) {
if (watcher.ws_buffer.length >= 2) {
_results.push(watcher.ws_message_length = watcher.ws_buffer.readUInt16LE(0));
} else {
break;
}
} else { } else {
_results.push(void 0); if (watcher.ws_buffer.length >= 2 + watcher.ws_message_length) {
stanza = watcher.ws_buffer.slice(2, watcher.ws_message_length + 2);
_ref1 = client.room.ws_watchers;
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
w = _ref1[_j];
if (w) {
w.sendBytes(stanza);
}
}
client.room.watcher_stanzas.push(stanza);
watcher.ws_buffer = watcher.ws_buffer.slice(2 + watcher.ws_message_length);
_results.push(watcher.ws_message_length = 0);
} else {
break;
}
} }
} }
return _results; return _results;
}); });
return watcher.on('error', function(error) { watcher.on('error', function(error) {
return log.error("watcher error", error); return log.error("watcher error", error);
}); });
return watcher.on('close', function(had_error) {
var w, _i, _len, _ref, _results;
_ref = client.room.ws_watchers;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
w = _ref[_i];
_results.push(w.close());
}
return _results;
});
} }
}); });
...@@ -642,13 +682,13 @@ ...@@ -642,13 +682,13 @@
waiting.push([]); waiting.push([]);
} }
log.info('level_points loaded', level_points); log.info('level_points loaded', level_points);
http.createServer(function(request, response) { http_server = http.createServer(function(request, response) {
var level, name, password, player, room, _ref, _ref1; var level, name, password, player, room, u, _ref, _ref1;
url = url.parse(request.url); u = url.parse(request.url);
if (url.pathname === '/count.json') { if (u.pathname === '/count.json') {
response.writeHead(200); response.writeHead(200);
return response.end(Room.all.length.toString()); return response.end(Room.all.length.toString());
} else if (url.pathname === '/match') { } else if (u.pathname === '/match') {
if (request.headers['authorization']) { if (request.headers['authorization']) {
_ref1 = new Buffer((_ref = request.headers['authorization'].split(/\s+/).pop()) != null ? _ref : '', 'base64').toString().split(':'), name = _ref1[0], password = _ref1[1]; _ref1 = new Buffer((_ref = request.headers['authorization'].split(/\s+/).pop()) != null ? _ref : '', 'base64').toString().split(':'), name = _ref1[0], password = _ref1[1];
return User.findOne({ return User.findOne({
...@@ -692,10 +732,10 @@ ...@@ -692,10 +732,10 @@
} }
}); });
} }
} else if (url.pathname === '/rooms.json') { } else if (u.pathname === '/rooms.json') {
response.writeHead(404); response.writeHead(404);
return response.end(); return response.end();
} else if (url.query === 'operation=getroomjson') { } else if (u.query === 'operation=getroomjson') {
response.writeHead(200); response.writeHead(200);
return response.end(JSON.stringify({ return response.end(JSON.stringify({
rooms: (function() { rooms: (function() {
...@@ -736,7 +776,8 @@ ...@@ -736,7 +776,8 @@
response.writeHead(404); response.writeHead(404);
return response.end(); return response.end();
} }
}).listen(settings.modules.http.port); });
http_server.listen(settings.modules.http.port);
setInterval(function() { setInterval(function() {
var displacement, headers, index, level, opponent, opponent_level, player, room, _i, _ref, _results; var displacement, headers, index, level, opponent, opponent_level, player, room, _i, _ref, _results;
_results = []; _results = [];
...@@ -800,6 +841,60 @@ ...@@ -800,6 +841,60 @@
} }
return _results; return _results;
}, 2000); }, 2000);
originIsAllowed = function(origin) {
return true;
};
wsServer = new WebSocketServer({
httpServer: http_server,
autoAcceptConnections: false
});
wsServer.on("request", function(request) {
var connection, room, room_name, stanza, _i, _len, _ref;
if (!originIsAllowed(request.origin)) {
request.reject();
console.log((new Date()) + " Connection from origin " + request.origin + " rejected.");
return;
}
room_name = decodeURIComponent(request.resource.slice(1));
if (room_name === 'started') {
room = _.find(Room.all, function(room) {
return room.started;
});
} else {
room = Room.find_by_name(room_name);
}
if (!room) {
request.reject();
console.log((new Date()) + " Connection from origin " + request.origin + (" rejected. " + room_name));
return;
}
connection = request.accept(null, request.origin);
console.log((new Date()) + (" Connection accepted. " + room.name));
room.ws_watchers.push(connection);
_ref = room.watcher_stanzas;
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
stanza = _ref[_i];
connection.sendBytes(stanza);
}
/*
connection.on "message", (message) ->
if message.type is "utf8"
console.log "Received Message: " + message.utf8Data
connection.sendUTF message.utf8Data
else if message.type is "binary"
console.log "Received Binary Message of " + message.binaryData.length + " bytes"
connection.sendBytes message.binaryData
*/
return connection.on("close", function(reasonCode, description) {
var index;
index = _.indexOf(room.ws_watchers, connection);
if (index !== -1) {
room.ws_watchers.splice(index, 1);
}
return console.log((new Date()) + " Peer " + connection.remoteAddress + " disconnected.");
});
});
} }
inotify = new Inotify(); inotify = new Inotify();
...@@ -828,28 +923,20 @@ ...@@ -828,28 +923,20 @@
} }
}); });
setInterval(function() { /*
var player, room, _i, _j, _len, _len1, _ref, _ref1, _results; setInterval ()->
_ref = Room.all; for room in Room.all
_results = []; if room.alive
for (_i = 0, _len = _ref.length; _i < _len; _i++) { room.alive = false
room = _ref[_i]; else
if (room.alive) { log.info "kill room", room.port
_results.push(room.alive = false);
} else { for player in room.players
log.info("kill room", room.port); ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭") unless player.closed
_ref1 = room.players; room.process.kill()
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { , 900000
player = _ref1[_j]; */
if (!player.closed) {
ygopro.stoc_send_chat(player, "由于长时间没有活动被关闭");
}
}
_results.push(room.process.kill());
}
}
return _results;
}, 900000);
}).call(this); }).call(this);
......
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
"ygopro-server.coffee" "ygopro-server.coffee"
], ],
"names": [], "names": [],
"mappings": "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" "mappings": ";AACA;CAAA,KAAA,yOAAA;KAAA,gJAAA;;CAAA,CAAA,CAAA,EAAM,EAAA;;CAAN,CACA,CAAO,CAAP,EAAO,CAAA;;CADP,CAEA,CAAA,EAAM,EAAA;;CAFN,CAGA,CAAO,CAAP,EAAO,CAAA;;CAHP,CAIA,CAAK,CAAA,GAAA;;CAJL,CAKA,CAAW,IAAA,CAAX,OAAW;;CALX,CAQA,CAAI,IAAA,KAAA;;CARJ,CASA,CAAA,IAAQ,YAAA;;CATR,CAUA,CAAa,EAAb,EAAQ;;CAVR,CAYA,CAAU,IAAV,EAAU;;CAZV,CAaA,CAAkB,GAblB,CAakB,IAAA,IAAlB;;CAbA,CAcA,CAAU,IAAV,EAAU;;CAdV,CAgBA,CAAS,GAAT,CAAS,CAAA;;CAhBT,CAmBA,CAAW,IAAA,CAAX,OAAW;;CAnBX,CAsBA,CAAS,GAAT,CAAS,MAAA;;CAtBT,CAuBA,CAAS,GAAT,CAAS,MAAA;;CAvBT,CAwBA,CAAO,CAAP,GAAO,IAAA;;CACP,CAAA,EAA8B,GAAgB,CAAR;CAAtC,EAAO,CAAP,GAAO,IAAA;IAzBP;;CA0BA,CAAA,EAA8B,GAAgB,CAAR;CAAtC,EAAO,CAAP,GAAO,IAAA;IA1BP;;CAAA,CA4BA,CAAY,IAAA,EAAZ,SAAY;;CA5BZ,CAiCA,CAAQ,EAAR;;CAjCA,CAkCA,CAAA,CAlCA;;CAmCA,CAAA,EAAG,CAAmB,EAAZ,EAAV;AACE,CAAA,CAAA,EAAA,IAAQ;CACR,GAAA,GAAgD,CAAR;AAAxC,CAAA,CAAA,EAAqB,EAArB,CAAgB,CAAR;MADR;CAAA,EAEA,CAAA,EAAY,MAAN;CAAoB,CAAM,EAAN,EAAA,QAAA;CAF1B,KAEM;IAHR,EAAA;CAKE,EAAA,CAAA,EAAY,MAAN;CAAoB,CAAM,EAAN,EAAA,EAAA;CAA1B,KAAM;IAxCR;;CAAA,CA2CA,CAAG,GAAc,GAAC,GAAlB;CACE,OAAA,0FAAA;CAAA,EAAa,CAAb,EAAA;CAAA,EACgB,CAAhB,EAAM;CADN,CAIA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CAClB,CAA0B,CAAvB,CAAH,EAAA,GAAA,MAAA;AACwH,CAAxH,CAA6E,EAAxC,EAArC,CAAqC,KAArC,GAAuF;CAAvF,EAA2B,CAAhB,EAAL,EAAN,IAAA;QADA;AAEO,CAAP,GAAA,EAAA;CACE,EAAgB,CAAhB,EAAM,EAAN;CACA,GAAkC,EAAM,EAAxC;CAAA,GAAW,EAAL,IAAN;UAFF;QAFA;CAKO,EAAP,GAAM,OAAN;CANF,IAAmB;CAJnB,CAYA,CAAmB,CAAnB,CAAmB,CAAb,CAAN,EAAoB;CAClB,CAAyB,CAAtB,CAAH,CAAA,CAAA,QAAA;AACwH,CAAxH,CAA6E,EAAxC,EAArC,CAAqC,KAArC,GAAuF;CAAvF,EAA2B,CAAhB,EAAL,EAAN,IAAA;QADA;AAEO,CAAP,GAAA,EAAA;CACE,EAAgB,EAAhB,CAAM,EAAN;CACA,GAAyC,EAAM,EAA/C;CAAA,CAA+B,EAApB,CAAX,CAAM,IAAN;UAFF;QAFA;CAKO,EAAP,GAAM,OAAN;CANF,IAAmB;CAZnB,CAoBA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CAClB,CAA0B,CAAvB,CAAH,EAAA,GAAA,MAAA;AAC4B,CAA5B,GAAA,EAAA;CAAA,EAAgB,CAAhB,EAAM,EAAN;QADA;AAE0H,CAA1H,CAA+E,EAAxC,EAAvC,CAAuC,KAAvC,GAAyF;CAAzF,EAA2B,CAAhB,EAAL,EAAN,IAAA;QAFA;AAGO,CAAP,GAAA,EAAA;CACE,CAA8B,IAAxB,EAAN,EAAA,IAAA;CACO,EAAP,GAAM,SAAN;QANe;CAAnB,IAAmB;CApBnB,CA4BA,CAAmB,CAAnB,CAAmB,CAAb,CAAN,EAAoB;CAClB,CAAyB,CAAtB,CAAH,CAAA,CAAA,QAAA;CAAA,EACgB,EADhB,CACA;AAC0H,CAA1H,CAA+E,EAAxC,EAAvC,CAAuC,KAAvC,GAAyF;CAAzF,EAA2B,CAAhB,EAAL,EAAN,IAAA;QAFA;AAGO,CAAP,GAAA,EAAA;CACE,CAA+B,CAAQ,EAAvC,CAAM,EAAN,CAA+B,KAA/B;CACO,EAAP,GAAM,SAAN;QANe;CAAnB,IAAmB;CA5BnB,EAsCkB,CAAlB,EAAkB,KAAlB;CAtCA,EAuCsB,CAAtB,eAAA;CAvCA,EAwCa,CAAb,MAAA;CAxCA,EA0CmC,CAAnC,CAAmC,CAA7B,eAAN;CA1CA,CA4CA,CAAkB,CAAlB,EAAM,GAAa;CACjB,SAAA,SAAA;CAAA,GAAG,EAAH,SAAA;CACS,GAAI,CAAX,CAAM,CAAa,QAAnB;MADF,EAAA;CAGE,CAA0C,CAA5B,CAAc,EAAR,EAApB,GAAA;CAEA,GAAG,EAAM,EAAT,GAAA;CACE,GAAA,CAAA,CAAM,IAAN;MADF,IAAA;CAGE,GAAA,EAAM,IAAN,WAA4B;UAL9B;CAOA;GAAA,CAAA,YAAM;CACJ,GAAG,CAAuB,KAA1B,SAAG;CACD,GAAG,EAAA,KAAW,CAAd;CACE,EAAsB,QAAW,CAAX,OAAtB;MADF,QAAA;CAGE,mBAHF;cADF;CAAA,GAKQ,CAAc,CALtB,IAKQ,EALR;CAME,GAAG,EAAA,KAAW,CAAd;CACE,EAAa,MAAA,CAAb,CAAwB;MAD1B,QAAA;CAGE,mBAHF;cANF;MAAA,MAAA;CAWE,EAA6B,CAA1B,EAAA,KAAW,CAAd,OAAA;CAEE,GAAG,EAAM,IAAc,EAAA,EAAvB;CACE,CAAyB,CAArB,EAAA,MAAW,KAAf,GAAyB;CACzB,EAAY,CAAT,EAAA,CAAwB,EAA0C,CAAM,GAA5B,GAA/C;CACE,KAAM,EAAN,UAAA;CAAA,CAC4C,GAAA,CAAtC,EAAN,EAAoB,EAAA,MAApB;MAFF,YAAA;CAIE,CAA4C,EAA5C,EAAM,EAAN,EAAoB,EAAA,MAApB;kBANJ;gBAAA;CAAA,EAQc,EAAA,MAAd,GAAA,KAAc;CARd,EASsB,WAAtB,KAAA;CATA,EAUa,OAAb;MAZF,QAAA;CAcE,mBAdF;cAXF;YADF;CAAA,QAAA;yBAVF;QADgB;CAAlB,IAAkB;CA5ClB,EAoFkB,CAAlB,EAAkB,KAAlB;CApFA,EAqFsB,CAAtB,eAAA;CArFA,EAsFa,CAAb,MAAA;CAEO,CAAP,CAAkB,CAAA,EAAZ,GAAa,EAAnB;CACE,SAAA,kBAAA;CAAA,CAA0C,CAA5B,CAAc,EAA5B,KAAA;CAAA,GAGA,CAAA,CAAA;CAEA;GAAA,CAAA,UAAM;CACJ,GAAG,CAAuB,GAA1B,WAAG;CACD,GAAG,EAAA,IAAH,CAAc;CACZ,EAAsB,QAAW,CAAX,OAAtB;MADF,MAAA;CAGE,iBAHF;YADF;CAAA,GAKQ,CAAc,CALtB,IAAA;CAME,GAAG,EAAA,IAAH,CAAc;CACZ,EAAa,MAAA,CAAb,CAAwB;MAD1B,MAAA;CAGE,iBAHF;YANF;MAAA,IAAA;CAWE,EAA6B,CAA1B,EAAA,IAAH,CAAc,QAAd;CAEE,EAAU,IAAV,GAAA,EAAA;CACA,GAAG,EAAM,IAAc,EAAvB;CACE,CAAyB,CAArB,EAAA,MAAW,GAAf,KAAyB;CACzB,EAAY,CAAT,EAAA,CAAwB,EAA0C,CAAM,GAA5B,CAA/C;CACE,KAAM,EAAN,QAAA;CAAA,CAC4C,GAAA,CAAtC,EAAN,EAAoB,EAAA,IAApB;MAFF,UAAA;CAIE,CAA4C,EAA5C,EAAM,EAAN,EAAoB,EAAA,IAApB;gBANJ;cADA;CAAA,EASc,EAAA,MAAd,CAAA,OAAc;CATd,EAUsB,SAAtB,OAAA;CAVA,EAWa,OAAb;MAbF,MAAA;CAeE,iBAfF;YAXF;UADF;CAAA,MAAA;uBANgB;CAAlB,IAAkB;CAzFpB,CA4HuB,CA5HN,CAAjB,EAAA,EA4HgB,CAAO;CACjB,CAAuB,CAAxB,CAAH,IAAmC,GAAnC,KAAA;CA7HF,EA4HuB;;CAvKvB,CA4KA,CAAwC,CAAxC,EAAM,GAAmC,EAAzC,EAAA;CACS,EAAO,CAAd,EAAM,KAAN;CADF,EAAwC;;CA5KxC,CA+KA,CAAuC,CAAA,CAAvC,CAAM,GAAkC,EAAxC;CAEE,OAAA,MAAA;CAAA,GAAA,CAAmB,EAAhB,CAAwB;CACzB,CAAyB,IAAzB,GAAA,EAAA;CAAqC,CAC9B,CAAL,KAAA;CADmC,CAE7B,EAAN,GAFmC,CAEnC;CAFF,OAAA;CAIO,EAAP,GAAM,OAAN;AACO,CAAD,GAAA,EANR;CAOE,CAA6B,IAA7B,OAAA,CAAA;CAAA,CACyB,IAAzB,GAAA,EAAA;CAAqC,CAC9B,CAAL,KAAA;CADmC,CAE7B,EAAN,IAAA;CAHF,OACA;CAIO,EAAP,GAAM,OAAN;AACO,CAAD,GAAA,EAbR,EAaS;CAKP,CAA6B,IAA7B,GAAA,KAAA;CAAA,CACyB,IAAzB,GAAA,EAAA;CAAqC,CAC9B,CAAL,KAAA;CADmC,CAE7B,EAAN,IAAA;CAHF,OACA;CAIO,EAAP,GAAM,OAAN;CAEa,GAAP,CAAe,CAzBvB,OAAA;CA0BE,CAAyB,IAAzB,GAAA,EAAA;CAAqC,CAC9B,CAAL,KAAA;CADmC,CAE7B,EAAN,IAAA;CAFF,OAAA;CAIO,EAAP,GAAM,OAAN;MA9BF;CAgCE,CAAqB,CAAlB,CAAH,EAAA,KAAA;CAAA,EACc,CAAd,EAAA,gBAAc;CACd,GAAG,EAAH,CAAA;CACE,GAAG,GAAgB,CAAnB,WAAA;CACE,EAAyB,CAAzB,EAAM,IAAN,KAAA;CAAA,CAC2C,CAAE,CAA7C,EAAM,EAAN,EAAA,YAAA;CADA,GAEW,EAAL,EAAc,EAApB;CACA;CAAA,cAAA,4BAAA;+BAAA;CACE,IAAA,CAAM,MAAN;CADF,UAHA;CAKO,CAAuB,IAAxB,QAAN,GAAA;MANF,IAAA;CAQE,CAA6B,IAAvB,CAAN,GAAA,IAAA;CAAA,CACyB,IAAnB,GAAN,CAAA,CAAA;CAAqC,CAC9B,CAAL,SAAA;CADmC,CAE7B,EAAN,QAAA;CAHF,WACA;CAIO,EAAP,GAAM,WAAN;UAdJ;MAAA,EAAA;CAgBS,GAAI,EAAL,CAAN,QAAA;QAlDJ;MAFqC;CAAvC,EAAuC;;CA/KvC,CAuOA,CAAuC,CAAA,CAAvC,CAAM,GAAkC,EAAxC;CAEE,MAAA,CAAA;CAAA,GAAA,GAAmB,CAAR;CACT,CAA8B,IAA9B,CAA8C,CAAR,MAAtC;MADF;CAEA,GAAA,GAAmB,CAAR;CACT,CAAkC,EAA/B,EAAH,IAAG;CACD,GAAI,GAAJ,CAAA;CAAa,CAAQ,EAAN,EAAY,IAAZ;EAAqB,CAAA,CAAA,KAAC,CAArC;AACM,CAAJ,GAAG,MAAH;CACE,EAAW,CAAX,QAAA;CAAgB,CAAO,EAAN,EAAY,QAAZ;CAAD,CAA4B,IAAR,QAAA;CAApC,aAAW;CAAX,GACI,QAAJ;YAFF;CAGK,GAAD,CAAJ,YAAA;CAAW,CAAQ,IAAP,MAAA;CAAO,CAAK,CAAJ,CAAQ,EAAT,QAAC;cAAT;EAA4B,CAAA,EAAA,IAAC,GAAxC;CACE,GAAA,YAAA;CAAA,EAAO,CAAP,CAAO,OAAP;CACO,CAAwB,CAAa,CAAI,EAA1C,EAAyB,MAA/B,GAAA,EAAA;CAFF,UAAuC;CAJzC,QAAoC;QAFxC;MAFA;AAY6C,CAA7C,GAAA,EAAmD,CAAhC,CAAR,WAAR;CACD,CAA8D,CAAxC,CAAX,EAAX,CAAA,EAA8D;CAC5D,CAA0B,IAApB,CAAN,CAAA,CAAA,IAAA;CAAyC,CACjC,EAAN,MAAA,OADuC;CAAzC,SAAA;CAAA,CAG0B,IAApB,CAAN,CAAA,CAAA,EAAA;CAAuC,CAC5B,KAAT,CAAiB,EAAjB;CADqC,CAE7B,EAF6B,EAErC,IAAA;CAFqC,CAGE,QAAvC,2BAAA;CAHqC,CAI/B,EAAN,MAAA;CAPF,SAGA;CAMO,CAAmB,IAApB,CAAN,EAAA,MAAA;CAV8B,MAA8B;CAA9D,EAYwB,CAAA,EAAxB,CAAO,EAAP;CAZA,EAa4B,GAA5B,CAAO,UAAP;CAbA,CAAA,CAc8B,CAAnB,EAAX,SAAA;CAdA,CAgBA,CAAmB,CAAA,EAAnB,CAAO,EAAa;CAClB,WAAA,yCAAA;CAAA,GAAW,EAAL,EAAN,OAA2B;CAC3B;CAAA,YAAA,8BAAA;wBAAA;CACE,GAAgB,MAAhB;CAAA,GAAA,CAAA,OAAA;YADF;CAAA,QADA;CAAA,CAIsD,CAAlC,CAAc,EAAR,CAAnB,CAAP,CAAA;CAEA;GAAA,CAAA,YAAM;CACJ,GAAG,CAA6B,EAAtB,GAAV,OAAG;CACD,GAAG,EAAA,CAAO,EAAU,GAApB;CACE,EAA4B,IAArB,EAAsC,GAAjB,KAA5B;MADF,QAAA;CAGE,mBAHF;cADF;MAAA,MAAA;CAME,EAAmC,CAAhC,EAAA,CAAO,EAAU,GAApB,KAAA;CACE,CAAoC,CAA3B,EAAA,CAAT,CAAgB,EAAU,KAA1B,GAAoC;CACpC;CAAA,kBAAA,2BAAA;+BAAA;CACE,GAAsB,YAAtB;CAAA,KAAA,GAAA,SAAA;kBADF;CAAA,cADA;CAAA,GAGW,EAAL,QAAN,CAA2B;CAH3B,EAKoB,EAAA,EAAb,EAAP,KAAA,GAAoB;CALpB,EAM4B,IAArB,UAAP;MAPF,QAAA;CASE,mBATF;cANF;YADF;CAAA,QAAA;yBAPiB;CAAnB,MAAmB;CAhBnB,CAyCA,CAAoB,EAAA,CAApB,CAAO,EAAc;CACf,CAAuB,CAAxB,EAAH,UAAA;CADF,MAAoB;CAGZ,CAAR,CAAoB,IAAb,EAAc,IAArB;CACE,WAAA,eAAA;CAAA;CAAA;cAAA,6BAAA;wBAAA;CACE,IAAA;CADF;yBADkB;CAApB,MAAoB;MA3De;CAAvC,EAAuC;;CAgEvC,CAAA,EAAG,GAAgB,CAAR,CAAX;CACE,CAAA,CAAY,CAAZ,KAAA;CAAA,GACA,GAAA;CACE,CAAK,CAAL,GAAA,CAAqB,CAAR,CAAb;CAAA,CACM,EAAN,EAAA;EACE,CAAA,CAAA,CAAA,CAHJ,EAGI,CAAC;CACD,GAAG,EAAH,EAAG;CACG,CAA2B,CAA5B,CAAH,WAAA,KAAA;AACgB,CAAD,GAAT,CAAA,CAFR,EAAA;CAGM,CAAwB,CAAzB,CAAH,CAAA,GAAA,OAAA,EAAA;MAHF,EAAA;CAKE,CAA6B,CAA1B,CAAH,IAAA,UAAA;CALF,EAMc,MAAZ,MAAA;QAPF;CAHJ,IAGI;IA5SN;;CAAA,CAqTA,CAAsC,CAAA,CAAtC,CAAM,GAAiC,CAAvC,CAAA;CACE,OAAA,6EAAA;CAAA,EAAA,CAAA,EAAY,EAAN;CAEN,EAAwB,CAAxB,CAAgC,CAAvB,CAAT,EAAmB;CACjB,EAAa,GAAb,GAAa,CAAb;AACmB,CADnB,EACkB,GAAlB,EAAA,EAAoB;CADpB,CAEA,CAAY,CAAW,EAAvB,EAAgC;MALlC;CAQA,CAAyE,CAAjD,CAAxB,CAAgC,CAAvB,CAAT,EAAmB,CAAuB;CACxC,EAAA,GAAA,GAAM;AACN,CAAA,EAAwC,CAAxC,CAA+C,CAA/C,EAAqB;CAArB,EAAA,KAAA;QADA;CAAA,EAES,GAAT,GAAS;CAFT,EAGG,CAAH,EAAA;CAAS,CAAS,CAAT,GAAC,EAAA;CAAD,CAAsB,IAAR,EAAA;CAHvB,OAGA;CAHA,GAIW,CAAM,CAAjB;CAAuB,CAAS,CAAT,GAAC,EAAA;CAAD,CAAsB,IAAR,EAAA;CAJrC,OAIA;MAbF;CAeA,EAAwB,CAAxB,CAAgC,CAAvB,CAAT,CAAG,CAAgB;CACjB,EAAA,GAAA,GAAM;AACe,CAArB,GAAA,EAAA,EAAA;CAAA,EAAA,KAAA;QADA;CAAA,EAEA,GAAA,KAAM;CAFN,CAGA,CAA4B,CAAjB,EAAX,SAA4B;CAG5B,EAAO,CAAJ,EAAH,SAAmC;CACjC,CAA2C,EAA3C,EAAM,EAAN,OAAA,OAAA;QARJ;MAfA;CAyBA,EAAwB,CAAxB,CAAgC,CAAvB,CAAT,EAAmB;CACjB,EAAA,GAAA,GAAM;AACe,CAArB,GAAA,EAAA,EAAA;CAAA,EAAA,KAAA;QADA;CAAA,EAEA,GAAA,KAAM;CAFN,CAGA,CAA4B,CAAjB,EAAX,SAA4B;MA7B9B;CAiCA,EAAwB,CAAxB,CAAgC,CAAvB,CAAT,EAAmB,CAAhB;CACD,EAAA,GAAA,GAAM;AACe,CAArB,GAAA,EAAA,EAAA;CAAA,EAAA,KAAA;QADA;CAAA,EAEA,GAAA,KAAM;CAFN,CAGA,CAA4B,CAAjB,EAAX,SAA4B;MArC9B;CAyCA,EAAwB,CAAxB,CAAgC,CAAvB,CAAT,EAAmB,GAAhB;CACD,EAAA,GAAA,GAAM;AACe,CAArB,GAAA,EAAA,EAAA;CAAA,EAAA,KAAA;QADA;CAAA,EAEA,GAAA,KAAM;CAFN,CAGA,CAA4B,CAAjB,EAAX,SAA4B;CAI5B,EAAO,CAAJ,CAAA,CAAH,SAAmC;CACjC,CAA2C,EAA3C,EAAM,CAAN,CAAA,cAAA;QATJ;MAzCA;CAuDA,GAAA,GAAmB,CAAR,CAAX;CACE,EAAwB,CAArB,CAA6B,CAAhC,GAAmB,EAAhB,EAAH;CACE,EAAO,CAAP,EAAa,EAAb,IAAO;CACP,GAAG,IAAH,CAAa;CACX;CAAA;gBAAA,4BAAA;8BAAA;CACE,CAA8B,EAA9B,EAAM,QAAN;CADF;2BADF;UAFF;QADF;MAxDoC;CAAtC,EAAsC;;CAqEtC;;;;;;;;;;;;;;;CA1XA;;CAAA,CA0YA,CAAyC,CAAA,CAAzC,CAAM,GAAoC,EAA1C,EAAA;CACE,OAAA,SAAA;CAAA,EAAW,CAAX,IAAA;CAAA,EACU,CAAV,CAAsC,EAAtC;CADA,EAEiB,CAAjB,EAAM,CAAN;CACO,EAAP,GAAM,KAAN;CAJF,EAAyC;;CA1YzC,CAkZA,CAA8B,GAAxB,GAAyB,WAA/B;CACE,GAAA;CAAO,CAAuB,CAAU,CAAK,CAAA,CAAvC,CAAwB,MAA9B,CAAA;MAD4B;CAlZ9B,EAkZ8B;;CAlZ9B,CAqZA,CAAO,CAAP;;CACA,CAAA,EAAG,GAAgB,CAAR;CACT,GAAA,GAAA;CACE,CAAK,CAAL,CAAA,EAAA,CAAqB,CAAR;CAAb,CACM,EAAN,EAAA;EACE,CAAA,CAAA,CAAA,CAHJ,EAGI,CAAC;CACD,EAAO,CAAP,EAAA;CACI,CAAoB,CAArB,CAAH,EAAA,OAAA;CALJ,IAGI;IA1ZN;;CAAA,CA8ZA,CAAwC,CAAA,CAAxC,CAAM,GAAmC,EAAzC,CAAA;CACE,OAAA,cAAA;AAAO,CAAP,GAAA,EAAa,CAAb;CACE,EAAsB,CAAX,EAAX,CAAA;CAAA,CAAA,CACoB,CAAT,CAAX,CAAA;CADA,CAAA,CAE8B,CAAnB,EAAX,SAAA;CACA;CAAA,UAAA,gCAAA;2BAAA;CAAuC,EAAA,EAAc,CAAR;;UAC3C;CAAA,EAA4B,CAAjB,EAAL,EAAN,OAA4B;AACxB,CAAJ,GAAG,EAAO,EAAV;CACE,CAAiB,CAAd,EAAH,CAAA,IAAA;MADF,IAAA;CAGE,CAA8D,CAAhD,CAAd,EAAM,IAAN,iBAAc;UALlB;CAAA,MAHA;AAUI,CAAJ,GAAG,EAAH,SAAgC;CAC9B,CAA6B,CAA1B,CAAqC,CAAxC,CAAmC,CAAnC,CAAA,OAAA,EAAA;QAZJ;MAAA;CAcA,GAAA,GAAmB,CAAR;CACF,KAAD,OAAN,OAAA;MAhBoC;CAAxC,EAAwC;;CA9ZxC,CAgbA,CAAkC,CAAA,CAAlC,CAAM,GAA6B,EAAnC;CACE,EAAO,CAAA,QAAA;CAAP,MAAA,IACO;CACM,CAAM,CAAc,CAA7B,CAAe,CAAS,EAAxB,CAA6E,CAA9D,GAAS,EAAxB;CACE,GAAA,UAAA;CAAA,GAAG,CAAH,KAAA;CACS,CAAoC,EAA3C,CAAA,CAAM,aAAN,GAAA;MADF,MAAA;CAGE,EAAO,CAAP,CAAO,CAAA,MAAP;AAC2B,CAA3B,GAAG,CAAA,EAAA,KAAH;CACS,CAAoC,EAA3C,EAAM,eAAN,CAAA;MADF,QAAA;CAGE,CAAiB,CAAd,CAAH,EAAA,QAAA;CACO,CAAoC,EAA3C,EAAM,eAAN,CAAA;cARJ;YAD0E;CAA5E,QAA4E;CAFhF,SAAA,CAYO;CACH,GAAG,GAAgB,CAAnB;CACO,CAAW,EAAZ,aAAJ;CAAsB,CAAQ,EAAN,QAAA;AAAkB,CAAZ,CAAW,IAAT,QAAA;cAAV;CAAA,CAAgC,GAAP,OAAA;EAAY,CAAA,EAAA,IAAC,GAA5D;CACE,eAAA,KAAA;CAAA,EAAA,CAAG,QAAH;CACE,CAA4B,CAAlB,EAAH,IAAA,YAAA;cADT;AAEA,CAAA;cAAA,IAAA;mCAAA;CACE,CAA8B,CAAiB,CAAO,CAAvB,CAAzB,EAAyB,MAA/B;CADF;6BAHyD;CAA3D,UAA2D;UAdjE;CAYO;CAZP,MAAA,IAoBO;CACH,CAA6B,IAAvB,EAAN,MAAA,WAAA;CAAA,CAC6B,IAAvB,EAAN,MAAA,EAAA;CACA,GAA+C,GAAgB,CAA/D;CAAA,CAA6B,IAAvB,IAAN,GAAA,CAAA;UAFA;CAGO,CAAsB,IAAvB,QAAN,CAAA,IAAA;CAxBJ,KAAA,KAyBO;CACH,GAAuC,GAAgB,CAAvD;CAAO,KAAD,WAAN,GAAA;UA1BJ;CAyBO;CAzBP,UA4BO;CACH,GAAG,IAAH,WAAA;CACE,CAA8B,IAAxB,IAAN,IAAA;CACO,CAA4B,CAAa,CAAhD,EAAM,GAA2C,KAAjD,GAAA;CACS,CAAoC,CAAW,CAAtD,EAAM,EAAqC,WAA3C,GAAA;CADF,UAAgD;MAFlD,IAAA;CAKS,CAAoC,EAA3C,EAAM,IAAN,OAAA,KAAA;UAlCN;CA4BO;CA5BP,UAmCO,MAnCP;CAoCQ,EAAD,CAAH,EAAe,SAAf;CApCJ,IADgC;CAAlC,EAAkC;;CAhblC,CAsdA,CAAyC,CAAA,CAAzC,CAAM,GAAoC,EAA1C,EAAA;CACE,OAAA,KAAA;CAAA,EAAG,CAAH;CAAA,GACA;;AAAQ,CAAA;GAAA,SAAyB,iFAAzB;CAAA,GAAI,GAAS;CAAb;;CADR;CAAA,GAEA;;AAAQ,CAAA;GAAA,SAAyB,yHAAzB;CAAA,GAAI,GAAS;CAAb;;CAFR;CAAA,EAGc,CAAd,EAAM;CACC,EAAO,CAAd,EAAM,KAAN;CALF,EAAyC;;CAOzC,CAAA,EAAG,GAAgB,CAAR,OAAX;CACE,CAAkC,CAAO,CAAzC,CAAA,CAAM,GAAoC,EAA1C,EAAA;AACS,CAAP,CAA0B,CAAnB,CAAJ,EAAH,GAA2B,CAAD;CAAyB,SAAD,KAAV;CAAjC,MAAmB;CACxB,CAAyB,IAAnB,EAAN,CAAA,IAAA;CAAwC,CAC/B,EAAW,CAAlB,CAAa,IAAb;CADsC,CAE/B,GAAP,KAAA;CAFsC,CAG7B,EAH6B,EAGvB,CAAf,GAAA;CAHF,SAAA;CAKO,CAAuB,IAAxB,OAAN,CAAA,CAAA;QAPqC;CAAzC,IAAyC;IA9d3C;;CAueA;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAveA;;CAsgBA,CAAA,EAAG,GAAgB,CAAR;CACT,EAAe,CAAf,GAAe,KAAf,SAAe;CAAf,CACU,CAAA,CAAV,GAAA;AACA,CAAA,EAAA,MAAA,QAAA;CACE,CAAA,EAAA,EAAA,CAAO;CADT,IAFA;CAAA,CAKgC,CAA7B,CAAH,QAAA,SAAA;CALA,CAM0C,CAA5B,CAAd,GAAgC,CAAA,CAAC,EAAjC,CAAc;CAEV,SAAA,yCAAA;CAAA,EAAI,EAAA,CAAJ,CAAqB;CAErB,GAAG,CAAc,CAAjB,EAAG,KAAH;CACE,EAAA,KAAA,CAAA;CACS,EAAT,CAAiB,EAAW,EAApB,OAAR;CACO,GAAD,CAAc,CAHtB,EAAA;CAIE,GAAG,GAAO,CAAV,OAAmB;CACjB,CAAuB,CAA6D,CAA7D,CAAA,CAAA,EAAA,EAAvB;CACK,GAAD,GAAJ,UAAA;CAAa,CAAQ,EAAN,QAAA;EAAc,CAAA,CAAA,KAAC,GAA9B;CACE,eAAA,IAAA;AAAI,CAAJ,GAAG,QAAH;CACE,EAAW,CAAX,UAAA;CAAgB,CAAO,EAAN,YAAA;CAAD,CAAqB,IAAR,UAAA;CAAb,CAA6B,CAAL,CAAxB,YAAwB;CAAxC,eAAW;CAAX,GACI,UAAJ;cAFF;CAAA,EAGQ,EAAR,CAHA,MAGA;AACA,CAAA,gBAAA,IAAA;4CAAA;CACE,EAAiB,CAAd,EAAA,QAAH;CACE,EAAQ,EAAR,WAAA;CACA,qBAFF;gBADF;CAAA,YAJA;CAAA,EAQqB,KAAb,CAAR,GAAA;CARA,GASA,CAAQ,EAAA,CAAR,IAAA;CACQ,CAAR,CAAoB,IAAb,EAAa,UAApB;CACE,EAAQ,EAAR,EAAgB,CAAR,MAAR;AACiD,CAAjD,GAAuC,CAAA,SAAvC;CAAQ,CAAqB,GAArB,CAAR,CAAQ,gBAAR;gBAFkB;CAApB,YAAoB;CAXtB,UAA6B;MAF/B,IAAA;CAoBE,EAAQ,EAAR,KAAA;CAAA,EACqB,KAAb,CAAR,CAAA;CADA,GAEA,CAAQ,EAAA,CAAR,EAAA;CACQ,CAAR,CAAoB,IAAb,EAAa,QAApB;CACE,IAAA,WAAA;CAAA,EAAQ,EAAR,EAAgB,CAAR,IAAR;AACiD,CAAjD,GAAuC,CAAA,OAAvC;CAAQ,CAAqB,GAArB,CAAR,CAAQ,cAAR;cAFkB;CAApB,UAAoB;UA3BxB;CA+BS,GAAD,CAAc,CA/BtB,EAAA,KAAA;CAgCE,EAAA,KAAA,CAAA;CACS,EAAT,KAAQ,OAAR;CACO,GAAD,CAAA,CAlCR,EAAA,eAAA;CAmCE,EAAA,KAAA,CAAA;CACS,EAAT,CAAiB,IAAT,CAAK,MAAb;CAA4B,IAAA,KAAA;;CAAQ;CAAA;kBAAA,0BAAA;gCAAA;CAA+B,GAAL;CAC5D;CAAA,CAAQ,EAAI,EAAZ,EAAQ,UAAR;CAAA,CACU,CAAA,CAAI,CAAJ,GAAV,UAAA;AACsC,CAFtC,CAEU,CAAC,CAAI,CAAsB,EAA1B,CAAX,UAAA;CAFA,IAGA,aAAA;;CAAQ;CAAA;0BAAA,oBAAA;0CAAA;IAAgC;CACtC;AAAM,CAAN,CAAA,MAAI,kBAAJ;CAAA,CACM,EAAN,EAAY,oBAAZ;CADA,CAEK,CAAL,GAAW,oBAAX;CAFA;wBADM;CAAA;;CAHR;CAAA,CAQW,CAAkB,CAAd,EAAf,CAAQ,WAAR;CARA;gBADkC;CAAA;;CAAR;CAA5B,SAAa;MApCf,EAAA;CAgDE,EAAA,KAAA,CAAA;CACS,EAAT,KAAQ,OAAR;QArD0B;CAAlB,IAAkB;CANhC,GA4DA,EAAA,CAAmC,CAAR,GAAhB;CA5DX,EA8DY,CAAZ,KAAY,EAAZ;CACE,SAAA,qFAAA;AAAA,CAAA;GAAA,SAAa,2FAAb;CACE;;CAAA;CAAA;cAAA,EAAA;mCAAA;CACE,EAAiB,CAAjB,QAAA,EAAA;CAAA,CACkC,CAAvB,CAAA,CAAe,EAAA,CAA1B,CAAmC,GAAnC;CACE,CAAkB,CAAf,CAAH,EAAA,EAAA,MAAA;CADgC,IAElB,GAAd,aAAA;CAFS,YAAuB;CADlC,CAI8B,CAA3B,CAAH,GAAA,CAAA,IAAA,OAAA;CAEA,GAAG,IAAH,IAAA;CACE,EAAiB,EAAjB,SAAA;CACa,EAAY,CAAnB,EAFR,GAEQ,KAFR;AAGE,CAAA,EAAA,gBAAoB,6GAApB;CACE,EAAS,CAAN,CAAA,CAAH,MAAG,IAAH;CACE,EAAW,EAAQ,EAAA,CAAnB,IAAmB,MAAnB;CACA,GAAG,IAAH,UAAA;CACE,EAAiB,EAAA,OAAjB,EAAA,MAAA;CACA,yBAFF;oBAFF;kBAAA;CAKA,EAAS,CAAN,CAAA,OAAA,IAAH;CACE,EAAW,EAAQ,EAAA,CAAnB,IAAmB,MAAnB;CACA,GAAG,IAAH,UAAA;CACE,EAAiB,EAAA,OAAjB,EAAA,MAAA;CACA,yBAFF;oBAFF;kBANF;CAAA,cAHF;cANA;CAqBA,GAAG,IAAH,IAAA;AACwC,CAAtC,GAAG,CAAQ,CAAR,CAAQ,CAAgC,MAA3C;CACE,CAAkB,CAAf,CAAH,CAAA,CAAA,CAAA,CAAA,MAAA,EAAA;CACA,IAAA,iBAAM;gBAFR;CAAA,CAGsD,GAA9C,CAAR,CAAQ,OAAR;CAHA,CAI0E,IAA1E,CAAQ,CAAuB,MAA/B;AACA,CALA,CAAA,GAKA,SAAA;CALA,CAOQ,CAAA,CAAR,CAAQ,CAA4D,EAA1C,GAAlB,GAAR;CAPA,CAQoB,CAAjB,CAAH,KAAA,KAAA;CARA,EASU,IAAV,OAAA;CAAU,CAA+B,CAA/B,aAAC,aAAA;CAAD,CAAmD,UAAnD,EAAmC,EAAA;CAT7C,eAAA;CAAA,CAUsB,CAAtB,GAAM,CAAN,EAAA,KAAA;CAVA,EAWA,CAAA,EAAM,QAAN;CAXA,CAYwB,CAAxB,IAAA,CAAQ,CAAR,KAAA;CAZA,EAaA,CAAA,IAAQ;MAdV,QAAA;AAiBE,CAAA,KAAM,GAAN;cAvCJ;CAAA;;CAAA;CADF;uBADU;CAAZ,CA2CE,EA3CF,CAAY;CA9DZ,EA2GkB,CAAlB,EAAkB,GAAC,MAAnB;CAAkB,YAEhB;CA7GF,IA2GkB;CA3GlB,EA8Ge,CAAf,IAAA,OAAe;CACb,CAAY,IAAZ,IAAA,CAAA;CAAA,CACuB,GADvB,CACA,eAAA;CAhHF,KA8Ge;CA9Gf,CAkHA,CAAuB,CAAvB,GAAuB,CAAf,CAAR;CACE,SAAA,yCAAA;AAAO,CAAP,GAAA,EAAA,CAA8B,QAAvB;CAEL,KAAA,CAAO,CAAP;CAAA,EACA,CAAiB,EAAL,CAAL,CAAP,IAAA,cAAY;CACZ,aAAA;QAJF;CAAA,EAMY,EAAmB,CAA/B,CAAsC,CAAS,CAA/C,SAAY;CACZ,GAAG,CAAa,CAAhB,GAAG;CACD,CAAwB,CAAjB,CAAP,IAAA,CAAyB;CAClB,GAAD,aAAJ;CADK,QAAiB;MAD1B,EAAA;CAIE,EAAO,CAAP,IAAA,CAAO,GAAA;QAXT;AAYO,CAAP,GAAA,EAAA;CACE,KAAA,CAAO,CAAP;CAAA,EACA,CAAiB,EAAL,CAAL,CAAP,CAAyE,IAAC,aAA9D;CACZ,aAAA;QAfF;CAAA,CAiBkC,CAArB,CAAA,EAAb,CAAoB,GAApB;CAjBA,EAkBA,CAAiB,EAAjB,CAAO,iBAAqB;CAlB5B,GAmBI,EAAJ,IAAA,CAAgB;CAEhB;CAAA,UAAA,gCAAA;2BAAA;CACE,KAAA,EAAA,CAAA,CAAU;CADZ,MArBA;CAwBA;;;;;;;;;CAxBA;CAiCW,CAAX,CAAuB,IAAvB,EAAwB,CAAd,CAAa,EAAvB;CACE,IAAA,OAAA;CAAA,CAAoC,CAA5B,CAAc,CAAtB,EAAQ,CAAR,EAAQ,CAAA;AAC2C,CAAnD,GAAyC,CAAA,GAAzC;CAAA,CAA+B,EAA3B,CAAJ,CAAA,IAAA,CAAgB;UADhB;CAEQ,EAAR,CAAiB,GAAV,CAAK,EAAoC,GAApC,EAAZ,CAAA;CAHF,MAAuB;CAlCzB,IAAuB;IAznBzB;;CAAA,CAiqBA,CAAc,CAAA,GAAd;;CAjqBA,CAkqBA,KAAO,CAAP;CACE,CAAM,EAAN,YAAA;CAAA,CACW,CAAyB,CAApC,GAAkB,EAAlB,KAAW;CADX,CAEU,CAAA,CAAV,CAAU,GAAV,CAAW;CACT,SAAA,MAAA;CAAA,EAAO,CAAP,CAAY,CAAZ;CACA,GAAG,CAAK,CAAR;CACE,CAA0C,CAAnC,CAAP,CAAmC,CAAnB,EAAhB;CAAA,EACO,CAAP,IAAA,IAAO;CACP,GAAG,IAAH;CACE,EAAU,CAAP,GAAc,EAAjB,CAAA;CAAA;CACuB,EAAR,CAAP,EADR,CACsB,KADtB,EAAA;CAEK,CAAD,CAAqC,CAAzB,EAAd,GAAwC,OAA9B,GAAV;CACqB,EAAR,CAAP,EAHR,CAGsB,EAHtB,GAAA;CAIO,EAAQ,CAAT,CAAJ,cAAA;YALJ;UAHF;MAAA,EAAA;CAUM,EAAD,EAAH,UAAA,SAAA;QAZM;CAFV,IAEU;CArqBZ,GAkqBA;;CAgBA;;;;;;;;;;;;;CAlrBA;CAAA"
} }
\ 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