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

parent e3136397
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
"freeport": "*", "freeport": "*",
"struct": "*", "struct": "*",
"inotify": "*", "inotify": "*",
"request": "*" "request": "*",
"mongoose": "*"
}, },
"license": "GPLv3", "license": "GPLv3",
"main": "ygopro-server.js", "main": "ygopro-server.js",
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -39,15 +39,26 @@ class Room ...@@ -39,15 +39,26 @@ class Room
@port = port @port = port
@alive = true @alive = true
@players = [] @players = []
@dueling = false
@established = false
@pos_name = {}#重构
@add_client(client) @add_client(client)
Room.all.push this #这个故事告诉我们没事不要乱new Room Room.all.push this #这个故事告诉我们没事不要乱new Room
delete: (room)-> delete: (room)->
delete Room.all[_.indexOf(Room.all, room)] Room.all.splice(_.indexOf(Room.all, room), 1)
add_client: (client)-> add_client: (client)->
@players.push {client: client, name: client.player} @players.push {client: client, name: client.player}
remove_client: (client, error)->
@players = _.reject @players, (player)->
player.client is client
for player in @players
stoc_send_chat(player.client, "#{client.player} 离开了游戏#{if error then ": #{error}" else ''}")
toString: ->
"room: #{@name} #{@port} #{@alive ? 'alive' : 'not-alive'} #{@dueling ? 'dueling' : 'not-dueling'} [#{("client #{typeof player.client} server #{typeof player.server} #{player.name} #{player.pos}. " for player in @players)}] #{JSON.stringify @pos_name}"
#需要性能优化,建立个索引 #需要性能优化,建立个索引
@find_by_name: (name)-> @find_by_name: (name)->
...@@ -60,6 +71,10 @@ class Room ...@@ -60,6 +71,10 @@ class Room
_.find @all, (room)-> _.find @all, (room)->
_.some room.players, (player)-> _.some room.players, (player)->
player.client == client player.client == client
@find_by_server: (server)->
_.find @all, (room)->
_.some room.players, (player)->
player.server == server
...@@ -69,7 +84,6 @@ debug = false ...@@ -69,7 +84,6 @@ debug = false
if process.argv[2] == '--debug' if process.argv[2] == '--debug'
settings.port++ settings.port++
settings.http_port++ settings.http_port++
debug = true
#结构体定义 #结构体定义
structs = {} structs = {}
...@@ -117,7 +131,6 @@ ctos_follow = (proto, synchronous, callback)-> ...@@ -117,7 +131,6 @@ ctos_follow = (proto, synchronous, callback)->
#消息发送函数,至少要把俩合起来.... #消息发送函数,至少要把俩合起来....
stoc_send = (socket, proto, info)-> stoc_send = (socket, proto, info)->
#console.log proto, proto_structs.STOC[proto], structs[proto_structs.STOC[proto]] #console.log proto, proto_structs.STOC[proto], structs[proto_structs.STOC[proto]]
if typeof info == 'undefined' if typeof info == 'undefined'
buffer = "" buffer = ""
else if Buffer.isBuffer(info) else if Buffer.isBuffer(info)
...@@ -140,11 +153,9 @@ stoc_send = (socket, proto, info)-> ...@@ -140,11 +153,9 @@ stoc_send = (socket, proto, info)->
header.writeUInt8 proto, 2 header.writeUInt8 proto, 2
socket.write header socket.write header
socket.write buffer if buffer.length socket.write buffer if buffer.length
console.log 'stoc_sent:', buffer if debug
ctos_send = (socket, proto, info)-> ctos_send = (socket, proto, info)->
#console.log proto, proto_structs.CTOS[proto], structs[proto_structs.CTOS[proto]] #console.log proto, proto_structs.CTOS[proto], structs[proto_structs.CTOS[proto]]
if typeof info == 'undefined' if typeof info == 'undefined'
buffer = "" buffer = ""
else if Buffer.isBuffer(info) else if Buffer.isBuffer(info)
...@@ -167,7 +178,6 @@ ctos_send = (socket, proto, info)-> ...@@ -167,7 +178,6 @@ ctos_send = (socket, proto, info)->
header.writeUInt8 proto, 2 header.writeUInt8 proto, 2
socket.write header socket.write header
socket.write buffer if buffer.length socket.write buffer if buffer.length
console.log 'ctos_sent:', buffer if debug
#util #util
stoc_send_chat = (client, msg, player = 8)-> stoc_send_chat = (client, msg, player = 8)->
...@@ -191,7 +201,6 @@ server_listener = (port, client, server)-> ...@@ -191,7 +201,6 @@ server_listener = (port, client, server)->
server.write buffer server.write buffer
server.on "data", (data) -> server.on "data", (data) ->
console.log 'server: ', data if debug
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length) stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length)
#buffer的错误使用方式,好孩子不要学 #buffer的错误使用方式,好孩子不要学
...@@ -208,14 +217,13 @@ server_listener = (port, client, server)-> ...@@ -208,14 +217,13 @@ server_listener = (port, client, server)->
break break
else else
if stoc_buffer.length >= 2 + stoc_message_length if stoc_buffer.length >= 2 + stoc_message_length
console.log constants.STOC[stoc_proto] if debug
if stoc_follows[stoc_proto] if 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 = structs[proto_structs.STOC[constants.STOC[stoc_proto]]] if struct = structs[proto_structs.STOC[constants.STOC[stoc_proto]]]
struct._setBuff(b) struct._setBuff(b)
setTimeout stoc_follows[stoc_proto].callback, 0, b, struct.fields, client, server setImmediate stoc_follows[stoc_proto].callback, b, struct.fields, client, server
else else
setTimeout stoc_follows[stoc_proto].callback, 0, b, null, client, server setImmediate 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
...@@ -247,10 +255,10 @@ listener = net.createServer (client) -> ...@@ -247,10 +255,10 @@ listener = net.createServer (client) ->
server = new net.Socket() server = new net.Socket()
server.on "error", (e) -> server.on "error", (e) ->
stoc_send_chat(client, "服务器错误")
console.log "server error #{e}" console.log "server error #{e}"
client.on "data", (data) -> client.on "data", (data) ->
console.log 'client: ', data if debug
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的错误使用方式,好孩子不要学
while true while true
...@@ -266,7 +274,6 @@ listener = net.createServer (client) -> ...@@ -266,7 +274,6 @@ listener = net.createServer (client) ->
break break
else else
if ctos_buffer.length >= 2 + ctos_message_length if ctos_buffer.length >= 2 + ctos_message_length
console.log constants.CTOS[ctos_proto] if debug
if ctos_follows[ctos_proto] if 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 = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]] if struct = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]]
...@@ -288,12 +295,20 @@ listener = net.createServer (client) -> ...@@ -288,12 +295,20 @@ listener = net.createServer (client) ->
client.pre_connecion_buffers.push data client.pre_connecion_buffers.push data
client.on "error", (e) -> client.on "error", (e) ->
room = Room.find_by_client(client)
room.remove_client(client, e) if room
console.log "client error #{e}" console.log "client error #{e}"
server.end() server.end()
client.on "close", (had_error) -> client.on "close", (had_error) ->
console.log "client closed #{had_error}" console.log "client closed #{had_error}"
return if had_error
room = Room.find_by_client(client)
room.remove_client(client) if room
server.end() server.end()
.listen settings.port, null, null, -> .listen settings.port, null, null, ->
console.log "server started on #{settings.ip}:#{settings.port}" console.log "server started on #{settings.ip}:#{settings.port}"
...@@ -309,10 +324,10 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -309,10 +324,10 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
} }
client.end() client.end()
else if !room_name.length else if !room_name.length
stoc_send client, 'JOIN_GAME', {} stoc_send_chat(client,"房间为空,请修改房间名")
stoc_send client, 'HS_PLAYER_ENTER', { stoc_send client, 'ERROR_MSG',{
name: '提示: 房间为空,请修改房间名' msg: 1
pos: 0 code: 2
} }
else if room_name == '[INCORRECT]' #房间密码验证 else if room_name == '[INCORRECT]' #房间密码验证
stoc_send client, 'ERROR_MSG',{ stoc_send client, 'ERROR_MSG',{
...@@ -323,6 +338,7 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -323,6 +338,7 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else else
if client.player != '[INCORRECT]' #用户验证 if client.player != '[INCORRECT]' #用户验证
room = Room.find_by_name(room_name) room = Room.find_by_name(room_name)
console.log "[join]find_by_room #{room_name} #{room}"
if room if room
room.add_client client room.add_client client
if room.established if room.established
...@@ -331,6 +347,7 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -331,6 +347,7 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else else
freeport (err, port)-> freeport (err, port)->
room = Room.find_by_name(room_name) room = Room.find_by_name(room_name)
console.log "[join freeport]find_by_room #{room_name} #{room}"
if room #如果等freeport的时间差又来了个..... if room #如果等freeport的时间差又来了个.....
room.add_client client room.add_client client
if room.established if room.established
...@@ -359,6 +376,7 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -359,6 +376,7 @@ ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
process = spawn './ygopro', param, cwd: 'ygocore' process = spawn './ygopro', param, cwd: 'ygocore'
room.process = process room.process = process
process.on 'exit', (code)-> process.on 'exit', (code)->
console.log "room process #{port} exited with code #{code}"
room.delete() room.delete()
process.stdout.once 'data', (data)-> process.stdout.once 'data', (data)->
room.established = true room.established = true
...@@ -403,21 +421,62 @@ stoc_follow 'GAME_MSG', false, (buffer, info, client, server)-> ...@@ -403,21 +421,62 @@ stoc_follow 'GAME_MSG', false, (buffer, info, client, server)->
stoc_send_chat client, line stoc_send_chat client, line
#积分 #积分
if constants.MSG[msg] == 'WIN' if constants.MSG[msg] == 'WIN'
player = buffer.readUInt8(1) room = Room.find_by_client(client)
type = buffer.readUInt8(2) if !room
console.log player, type console.log "[WARN]win: can't find room by player #{client.player}"
return
if _.startsWith(room.name, 'M#') and room.dueling
room.dueling = false
loser_name = room.pos_name[buffer.readUInt8(1)]
winner_name = room.pos_name[1 - buffer.readUInt8(1)]
#type = buffer.readUInt8(2)
User.findOne { name: winner_name }, (err, winner)->
if(err)
console.log "#{err} when finding user #{winner_name}"
else if(!winner)
console.log "user #{winner_name} not exist"
else
User.findOne { name: loser_name }, (err, loser)->
if(err)
console.log "#{err} when finding user #{loser_name}"
else if(!loser)
console.log "user #{loser_name} not exist"
else
winner.points += 10
loser.points -= 5
winner.save()
loser.save()
console.log "#{winner} 增加10点积分,现在有#{winner.points}点"
console.log "#{loser} 减少5点积分,现在有#{loser.points}点"
stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
client.ready = info.status & 0xF != 0
client.pos = info.status >> 4
console.log client.ready, client.pos
mongoose = require 'mongoose'
mongoose.connect('mongodb://localhost/mycard');
User = mongoose.model 'User',
name: String
points: Number
#stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)-> #stoc_follow 'HS_PLAYER_CHANGE', false, (buffer, info, client, server)->
# console.log 'HS_PLAYER_CHANGE', info # console.log 'HS_PLAYER_CHANGE', info
#房间管理
stoc_follow 'HS_PLAYER_ENTER', false, (buffer, info, client, server)->
room = Room.find_by_client(client)
if !room
console.log "[WARN]player_enter: can't find room by player #{client.player}"
return
room.pos_name[info.pos] = info.name
#房间数量 #房间数量
http.createServer (request, response)-> http.createServer (request, response)->
if url.parse(request.url).pathname == '/count.json' if url.parse(request.url).pathname == '/count.json'
response.writeHead(200); response.writeHead(200);
response.end(rooms.length.toString()) response.end(Room.all.length.toString())
else else
response.writeHead(404); response.writeHead(404);
response.end(); response.end();
...@@ -443,11 +502,11 @@ inotify.addWatch ...@@ -443,11 +502,11 @@ inotify.addWatch
console.log '[warn] event without filename' console.log '[warn] event without filename'
setInterval ()-> setInterval ()->
for room in rooms for room in Room.all
if room.alive if room.alive
room.alive = false room.alive = false
else else
console.log "kill #{port} #{room}" console.log "kill room #{room.port}"
room.process.kill() room.process.kill()
, 900000 , 900000
...@@ -472,6 +531,19 @@ request ...@@ -472,6 +531,19 @@ request
stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
stoc_send_random_tip(client) stoc_send_random_tip(client)
room = Room.find_by_client(client)
if !room
console.log "[WARN]duel start: can't find room by player #{client.player}"
return
room.dueling = true
if _.startsWith(room.name, 'M#')
User.findOne { name: client.player }, (err, user)->
if !user
user = new User({name: client.player, points: 0})
user.save()
stoc_send_chat(client, "积分系统测试中,你现在有#{user.points}点积分,这些积分以后可能会重置")
ctos_follow 'CHAT', false, (buffer, info, client, server)-> ctos_follow 'CHAT', false, (buffer, info, client, server)->
if _.trim(info.msg) == '/tip' if _.trim(info.msg) == '/tip'
stoc_send_random_tip(client) stoc_send_random_tip(client)
......
// Generated by CoffeeScript 1.6.3 // Generated by CoffeeScript 1.6.3
(function() { (function() {
var Inotify, Room, Struct, constants, ctos_follow, ctos_follows, ctos_send, debug, declaration, dialogues, field, freeport, fs, http, inotify, listener, name, net, path, proto_structs, request, result, server_listener, settings, spawn, stoc_follow, stoc_follows, stoc_send, stoc_send_chat, stoc_send_random_tip, stoc_send_tip, structs, structs_declaration, tips, type, typedefs, url, _, _i, _len; var Inotify, Room, Struct, User, constants, ctos_follow, ctos_follows, ctos_send, debug, declaration, dialogues, field, freeport, fs, http, inotify, listener, mongoose, name, net, path, proto_structs, request, result, server_listener, settings, spawn, stoc_follow, stoc_follows, stoc_send, stoc_send_chat, stoc_send_random_tip, stoc_send_tip, structs, structs_declaration, tips, type, typedefs, url, _, _i, _len;
net = require('net'); net = require('net');
...@@ -48,12 +48,15 @@ ...@@ -48,12 +48,15 @@
this.port = port; this.port = port;
this.alive = true; this.alive = true;
this.players = []; this.players = [];
this.dueling = false;
this.established = false;
this.pos_name = {};
this.add_client(client); this.add_client(client);
Room.all.push(this); Room.all.push(this);
} }
Room.prototype["delete"] = function(room) { Room.prototype["delete"] = function(room) {
return delete Room.all[_.indexOf(Room.all, room)]; return Room.all.splice(_.indexOf(Room.all, room), 1);
}; };
Room.prototype.add_client = function(client) { Room.prototype.add_client = function(client) {
...@@ -63,6 +66,38 @@ ...@@ -63,6 +66,38 @@
}); });
}; };
Room.prototype.remove_client = function(client, error) {
var player, _i, _len, _ref, _results;
this.players = _.reject(this.players, function(player) {
return player.client === client;
});
_ref = this.players;
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
player = _ref[_i];
_results.push(stoc_send_chat(player.client, "" + client.player + " 离开了游戏" + (error ? ": " + error : '')));
}
return _results;
};
Room.prototype.toString = function() {
var player, _ref, _ref1;
return "room: " + this.name + " " + this.port + " " + ((_ref = this.alive) != null ? _ref : {
'alive': 'not-alive'
}) + " " + ((_ref1 = this.dueling) != null ? _ref1 : {
'dueling': 'not-dueling'
}) + " [" + ((function() {
var _i, _len, _ref2, _results;
_ref2 = this.players;
_results = [];
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
player = _ref2[_i];
_results.push("client " + (typeof player.client) + " server " + (typeof player.server) + " " + player.name + " " + player.pos + ". ");
}
return _results;
}).call(this)) + "] " + (JSON.stringify(this.pos_name));
};
Room.find_by_name = function(name) { Room.find_by_name = function(name) {
return _.find(this.all, function(room) { return _.find(this.all, function(room) {
return room.name === name; return room.name === name;
...@@ -83,6 +118,14 @@ ...@@ -83,6 +118,14 @@
}); });
}; };
Room.find_by_server = function(server) {
return _.find(this.all, function(room) {
return _.some(room.players, function(player) {
return player.server === server;
});
});
};
return Room; return Room;
})(); })();
...@@ -92,7 +135,6 @@ ...@@ -92,7 +135,6 @@
if (process.argv[2] === '--debug') { if (process.argv[2] === '--debug') {
settings.port++; settings.port++;
settings.http_port++; settings.http_port++;
debug = true;
} }
structs = {}; structs = {};
...@@ -205,10 +247,7 @@ ...@@ -205,10 +247,7 @@
header.writeUInt8(proto, 2); header.writeUInt8(proto, 2);
socket.write(header); socket.write(header);
if (buffer.length) { if (buffer.length) {
socket.write(buffer); return socket.write(buffer);
}
if (debug) {
return console.log('stoc_sent:', buffer);
} }
}; };
...@@ -242,10 +281,7 @@ ...@@ -242,10 +281,7 @@
header.writeUInt8(proto, 2); header.writeUInt8(proto, 2);
socket.write(header); socket.write(header);
if (buffer.length) { if (buffer.length) {
socket.write(buffer); return socket.write(buffer);
}
if (debug) {
return console.log('ctos_sent:', buffer);
} }
}; };
...@@ -273,9 +309,6 @@ ...@@ -273,9 +309,6 @@
} }
server.on("data", function(data) { server.on("data", function(data) {
var b, struct; var b, struct;
if (debug) {
console.log('server: ', data);
}
stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length); stoc_buffer = Buffer.concat([stoc_buffer, data], stoc_buffer.length + data.length);
while (true) { while (true) {
if (stoc_message_length === 0) { if (stoc_message_length === 0) {
...@@ -292,16 +325,13 @@ ...@@ -292,16 +325,13 @@
} }
} else { } else {
if (stoc_buffer.length >= 2 + stoc_message_length) { if (stoc_buffer.length >= 2 + stoc_message_length) {
if (debug) {
console.log(constants.STOC[stoc_proto]);
}
if (stoc_follows[stoc_proto]) { if (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 = structs[proto_structs.STOC[constants.STOC[stoc_proto]]]) { if (struct = structs[proto_structs.STOC[constants.STOC[stoc_proto]]]) {
struct._setBuff(b); struct._setBuff(b);
setTimeout(stoc_follows[stoc_proto].callback, 0, b, struct.fields, client, server); setImmediate(stoc_follows[stoc_proto].callback, b, struct.fields, client, server);
} else { } else {
setTimeout(stoc_follows[stoc_proto].callback, 0, b, null, client, server); setImmediate(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);
...@@ -335,13 +365,11 @@ ...@@ -335,13 +365,11 @@
client.pre_connecion_buffers = new Array(); client.pre_connecion_buffers = new Array();
server = new net.Socket(); server = new net.Socket();
server.on("error", function(e) { server.on("error", function(e) {
stoc_send_chat(client, "服务器错误");
return console.log("server error " + e); return console.log("server error " + e);
}); });
client.on("data", function(data) { client.on("data", function(data) {
var b, struct; var b, struct;
if (debug) {
console.log('client: ', data);
}
ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length); ctos_buffer = Buffer.concat([ctos_buffer, data], ctos_buffer.length + data.length);
while (true) { while (true) {
if (ctos_message_length === 0) { if (ctos_message_length === 0) {
...@@ -358,9 +386,6 @@ ...@@ -358,9 +386,6 @@
} }
} else { } else {
if (ctos_buffer.length >= 2 + ctos_message_length) { if (ctos_buffer.length >= 2 + ctos_message_length) {
if (debug) {
console.log(constants.CTOS[ctos_proto]);
}
if (ctos_follows[ctos_proto]) { if (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 = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]]) { if (struct = structs[proto_structs.CTOS[constants.CTOS[ctos_proto]]]) {
...@@ -387,11 +412,24 @@ ...@@ -387,11 +412,24 @@
} }
}); });
client.on("error", function(e) { client.on("error", function(e) {
var room;
room = Room.find_by_client(client);
if (room) {
room.remove_client(client, e);
}
console.log("client error " + e); console.log("client error " + e);
return server.end(); return server.end();
}); });
return client.on("close", function(had_error) { return client.on("close", function(had_error) {
var room;
console.log("client closed " + had_error); console.log("client closed " + had_error);
if (had_error) {
return;
}
room = Room.find_by_client(client);
if (room) {
room.remove_client(client);
}
return server.end(); return server.end();
}); });
}).listen(settings.port, null, null, function() { }).listen(settings.port, null, null, function() {
...@@ -412,10 +450,10 @@ ...@@ -412,10 +450,10 @@
}); });
return client.end(); return client.end();
} else if (!room_name.length) { } else if (!room_name.length) {
stoc_send(client, 'JOIN_GAME', {}); stoc_send_chat(client, "房间为空,请修改房间名");
return stoc_send(client, 'HS_PLAYER_ENTER', { return stoc_send(client, 'ERROR_MSG', {
name: '提示: 房间为空,请修改房间名', msg: 1,
pos: 0 code: 2
}); });
} else if (room_name === '[INCORRECT]') { } else if (room_name === '[INCORRECT]') {
stoc_send(client, 'ERROR_MSG', { stoc_send(client, 'ERROR_MSG', {
...@@ -426,6 +464,7 @@ ...@@ -426,6 +464,7 @@
} else { } else {
if (client.player !== '[INCORRECT]') { if (client.player !== '[INCORRECT]') {
room = Room.find_by_name(room_name); room = Room.find_by_name(room_name);
console.log("[join]find_by_room " + room_name + " " + room);
if (room) { if (room) {
room.add_client(client); room.add_client(client);
if (room.established) { if (room.established) {
...@@ -437,6 +476,7 @@ ...@@ -437,6 +476,7 @@
return freeport(function(err, port) { return freeport(function(err, port) {
var param, process; var param, process;
room = Room.find_by_name(room_name); room = Room.find_by_name(room_name);
console.log("[join freeport]find_by_room " + room_name + " " + room);
if (room) { if (room) {
room.add_client(client); room.add_client(client);
if (room.established) { if (room.established) {
...@@ -469,6 +509,7 @@ ...@@ -469,6 +509,7 @@
}); });
room.process = process; room.process = process;
process.on('exit', function(code) { process.on('exit', function(code) {
console.log("room process " + port + " exited with code " + code);
return room["delete"](); return room["delete"]();
}); });
return process.stdout.once('data', function(data) { return process.stdout.once('data', function(data) {
...@@ -515,7 +556,7 @@ ...@@ -515,7 +556,7 @@
}); });
stoc_follow('GAME_MSG', false, function(buffer, info, client, server) { stoc_follow('GAME_MSG', false, function(buffer, info, client, server) {
var card, line, msg, player, _j, _len1, _ref; var card, line, loser_name, msg, room, winner_name, _j, _len1, _ref;
msg = buffer.readInt8(0); msg = buffer.readInt8(0);
if (constants.MSG[msg] === 'SUMMONING' || constants.MSG[msg] === 'SPSUMMONING') { if (constants.MSG[msg] === 'SUMMONING' || constants.MSG[msg] === 'SPSUMMONING') {
card = buffer.readUInt32LE(1); card = buffer.readUInt32LE(1);
...@@ -528,16 +569,74 @@ ...@@ -528,16 +569,74 @@
} }
} }
if (constants.MSG[msg] === 'WIN') { if (constants.MSG[msg] === 'WIN') {
player = buffer.readUInt8(1); room = Room.find_by_client(client);
type = buffer.readUInt8(2); if (!room) {
return console.log(player, type); console.log("[WARN]win: can't find room by player " + client.player);
return;
}
if (_.startsWith(room.name, 'M#') && room.dueling) {
room.dueling = false;
loser_name = room.pos_name[buffer.readUInt8(1)];
winner_name = room.pos_name[1 - buffer.readUInt8(1)];
return User.findOne({
name: winner_name
}, function(err, winner) {
if (err) {
return console.log("" + err + " when finding user " + winner_name);
} else if (!winner) {
return console.log("user " + winner_name + " not exist");
} else {
return User.findOne({
name: loser_name
}, function(err, loser) {
if (err) {
return console.log("" + err + " when finding user " + loser_name);
} else if (!loser) {
return console.log("user " + loser_name + " not exist");
} else {
winner.points += 10;
loser.points -= 5;
winner.save();
loser.save();
console.log("" + winner + " 增加10点积分,现在有" + winner.points + "");
return console.log("" + loser + " 减少5点积分,现在有" + loser.points + "");
}
});
}
});
}
}
});
stoc_follow('HS_PLAYER_CHANGE', false, function(buffer, info, client, server) {
client.ready = info.status & 0xF !== 0;
client.pos = info.status >> 4;
return console.log(client.ready, client.pos);
});
mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/mycard');
User = mongoose.model('User', {
name: String,
points: Number
});
stoc_follow('HS_PLAYER_ENTER', false, function(buffer, info, client, server) {
var room;
room = Room.find_by_client(client);
if (!room) {
console.log("[WARN]player_enter: can't find room by player " + client.player);
return;
} }
return room.pos_name[info.pos] = info.name;
}); });
http.createServer(function(request, response) { http.createServer(function(request, response) {
if (url.parse(request.url).pathname === '/count.json') { if (url.parse(request.url).pathname === '/count.json') {
response.writeHead(200); response.writeHead(200);
return response.end(rooms.length.toString()); return response.end(Room.all.length.toString());
} else { } else {
response.writeHead(404); response.writeHead(404);
return response.end(); return response.end();
...@@ -571,14 +670,15 @@ ...@@ -571,14 +670,15 @@
}); });
setInterval(function() { setInterval(function() {
var room, _j, _len1, _results; var room, _j, _len1, _ref, _results;
_ref = Room.all;
_results = []; _results = [];
for (_j = 0, _len1 = rooms.length; _j < _len1; _j++) { for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
room = rooms[_j]; room = _ref[_j];
if (room.alive) { if (room.alive) {
_results.push(room.alive = false); _results.push(room.alive = false);
} else { } else {
console.log("kill " + port + " " + room); console.log("kill room " + room.port);
_results.push(room.process.kill()); _results.push(room.process.kill());
} }
} }
...@@ -615,7 +715,28 @@ ...@@ -615,7 +715,28 @@
}); });
stoc_follow('DUEL_START', false, function(buffer, info, client, server) { stoc_follow('DUEL_START', false, function(buffer, info, client, server) {
return stoc_send_random_tip(client); var room;
stoc_send_random_tip(client);
room = Room.find_by_client(client);
if (!room) {
console.log("[WARN]duel start: can't find room by player " + client.player);
return;
}
room.dueling = true;
if (_.startsWith(room.name, 'M#')) {
return User.findOne({
name: client.player
}, function(err, user) {
if (!user) {
user = new User({
name: client.player,
points: 0
});
user.save();
}
return stoc_send_chat(client, "积分系统测试中,你现在有" + user.points + "点积分,这些积分以后可能会重置");
});
}
}); });
ctos_follow('CHAT', false, function(buffer, info, client, server) { ctos_follow('CHAT', false, function(buffer, info, client, server) {
...@@ -655,7 +776,3 @@ ...@@ -655,7 +776,3 @@
}).call(this); }).call(this);
/*
//@ sourceMappingURL=ygopro-server.map
*/
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
"ygopro-server.coffee" "ygopro-server.coffee"
], ],
"names": [], "names": [],
"mappings": ";AACA;CAAA,KAAA,iYAAA;;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,CAAQ,EAAR,EAAQ,QAAA;;CALR,CAQA,CAAW,IAAA,CAAX,EAAW;;CARX,CASA,CAAS,GAAT,CAAS,CAAA;;CATT,CAUA,CAAI,IAAA,KAAA;;CAVJ,CAWA,CAAA,IAAQ,YAAA;;CAXR,CAYA,CAAa,EAAb,EAAQ;;CAZR,CAaA,CAAK,IAAL,CAAA,WAAA;;CAbA,CAcA,CAAU,IAAV,EAAU;;CAdV,CAeA,CAAU,IAAV,EAAU;;CAfV,CAkBA,CAAsB,IAAA,SAAA,GAAtB;;CAlBA,CAmBA,CAAW,IAAA,CAAX,SAAW;;CAnBX,CAoBA,CAAgB,IAAA,MAAhB,SAAgB;;CApBhB,CAqBA,CAAY,IAAA,EAAZ,SAAY;;CArBZ,CAwBA,CAAW,IAAA,CAAX,OAAW;;CAxBX,CA0BM;CACJ,CAAA,CAAA,CAAA;;CAQa,CAAO,CAAP,CAAA,EAAA,QAAC;CACZ,EAAQ,CAAP,EAAD;CAAA,EACQ,CAAP,EAAD;CADA,EAES,CAAR,CAAD,CAAA;CAFA,CAAA,CAGW,CAAV,EAAD,CAAA;CAHA,GAIC,EAAD,IAAA;CAJA,EAKQ,CAAJ,EAAJ;CAdF,IAQa;;CARb,EAgBQ,CAAA,KAAC;AACP,CAAA,CAAoC,CAApB,CAAL,EAAX,CAAgB,MAAhB;CAjBF,IAgBQ;;CAhBR,EAmBY,GAAA,GAAC,CAAb;CACG,GAAA,GAAO,MAAR;CAAc,CAAS,IAAR,EAAA;CAAD,CAAuB,EAAN,EAAY,EAAZ;CADrB,OACV;CApBF,IAmBY;;CAnBZ,EAwBe,CAAf,KAAgB,GAAhB;CACG,CAAY,CAAb,CAAA,KAAc,IAAd;CACO,GAAD,CAAS,UAAb;CADF,MAAa;CAzBf,IAwBe;;CAxBf,EA2Be,CAAf,KAAgB,GAAhB;CACG,CAAY,CAAb,CAAA,KAAc,IAAd;CACO,GAAD,CAAS,UAAb;CADF,MAAa;CA5Bf,IA2Be;;CA3Bf,EA8BiB,CAAjB,EAAiB,GAAC,KAAlB;CACG,CAAY,CAAb,CAAA,KAAc,IAAd;CACG,CAAoB,CAAA,CAArB,EAAqB,CAArB,EAAsB,MAAtB;CACS,IAAU,CAAX,WAAN;CADF,QAAqB;CADvB,MAAa;CA/Bf,IA8BiB;;CA9BjB;;CA3BF;;CAAA,CAkEA,CAAQ,EAAR;;CACA,CAAA,EAAG,CAAmB,EAAZ,EAAV;AACE,CAAA,CAAA,EAAA,IAAQ;AACR,CADA,CAAA,EACA,IAAQ,CAAR;CADA,EAEQ,CAAR,CAAA;IAtEF;;CAAA,CAyEA,CAAU,IAAV;;AACA,CAAA,MAAA,oBAAA;6CAAA;CACE,EAAS,CAAT,EAAA;AACA,CAAA,QAAA,yCAAA;+BAAA;CACE,GAAG,CAAK,CAAR,EAAA;CACE,IAAY,GAAZ,QAAO;CAAP,SAAA,KACO;CAAgB,CAAyB,CAAa,CAAtC,CAAA,CAAM,EAAN,IAAA;CAAhB;CADP;CAEO,EAA8B,CAAI,IAAlC,UAAO,MAAA;CAFd,QADF;MAAA,EAAA;CAKE,EAAO,CAAP,CAAY,GAAZ;CACA,GAAyB,IAAzB;CAAA,EAAO,CAAP,IAAgB,EAAhB;UADA;CAEA,GAAG,CAAK,CAAR,EAAA;CACE,CAAyB,EAAzB,CAAA,CAAM,IAAN;MADF,IAAA;CAGE,GAAG,GAAQ,GAAX;CACE,CAA0B,EAA1B,CAAmB,CAAb,CAA4B,KAAlC;MADF,MAAA;CAGE,GAAO,CAAW,CAAX,MAAP;YANJ;UAPF;QADF;CAAA,IADA;CAAA,EAgBgB,CAAhB,EAhBA,CAgBQ;CAjBV,EA1EA;;CAAA,CA+FA,CAAe,SAAf;;CA/FA,CAgGA,CAAe,SAAf;;CAhGA,CAiGA,CAAc,EAAA,GAAA,CAAC,EAAf;CACE,OAAA,QAAA;AAAG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAAA;CAMa,EAAS,EAAT,MAAb,CAAa;CAAS,CAAW,IAAV,EAAA;CAAD,CAAkC,IAAb,KAAA;CAP/B;CAjGd,EAiGc;;CAjGd,CAyGA,CAAc,EAAA,GAAA,CAAC,EAAf;CACE,OAAA,QAAA;AAAG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAAA;CAMa,EAAS,EAAT,MAAb,CAAa;CAAS,CAAW,IAAV,EAAA;CAAD,CAAkC,IAAb,KAAA;CAP/B;CAzGd,EAyGc;;CAzGd,CAoHA,CAAY,CAAA,CAAA,CAAA,GAAZ;CAGE,OAAA,gCAAA;AAAG,CAAH,GAAA,CAAkB,CAAf,KAAH;CACE,CAAA,CAAS,GAAT;CACa,GAAP,EAFR,EAEQ;CACN,EAAS,CAAT,EAAA;MAHF;CAKE,EAAS,CAA2B,CAAA,CAApC,CAAiB,MAAa;CAA9B,KACA,EAAA;CADA,EAEA,CAAA,EAAA;CAFA,EAGS,GAAT;MARF;AAUG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAVA;CAAA,EAiBa,CAAb,EAAA;CAjBA,CAkBwC,CAAH,CAArC,EAAM,OAAN;CAlBA,CAmByB,EAAzB,CAAA,CAAM,IAAN;CAnBA,GAoBA,CAAA,CAAM;CACN,GAAA,EAA6B;CAA7B,IAAA,CAAA;MArBA;CAsBA,GAAA,CAAA;CAAQ,CAAkB,CAA1B,GAAA,CAAO,KAAP,CAAA;MAzBU;CApHZ,EAoHY;;CApHZ,CA+IA,CAAY,CAAA,CAAA,CAAA,GAAZ;CAGE,OAAA,gCAAA;AAAG,CAAH,GAAA,CAAkB,CAAf,KAAH;CACE,CAAA,CAAS,GAAT;CACa,GAAP,EAFR,EAEQ;CACN,EAAS,CAAT,EAAA;MAHF;CAKE,EAAS,CAA2B,CAAA,CAApC,CAAiB,MAAa;CAA9B,KACA,EAAA;CADA,EAEA,CAAA,EAAA;CAFA,EAGS,GAAT;MARF;AAUG,CAAH,GAAA,CAAG,CAAA,EAAH;CACE;CAAA,UAAA;2BAAA;CACE,GAAG,CAAA,GAAH;CACE,EAAQ,EAAR,KAAA;CACA,eAFF;UADF;CAAA,MAAA;AAI0B,CAA1B,GAAyB,CAAgB,CAAzC,GAAmC;CAAnC,aAAM,CAAN;QALF;MAVA;CAAA,EAiBa,CAAb,EAAA;CAjBA,CAkBwC,CAAH,CAArC,EAAM,OAAN;CAlBA,CAmByB,EAAzB,CAAA,CAAM,IAAN;CAnBA,GAoBA,CAAA,CAAM;CACN,GAAA,EAA6B;CAA7B,IAAA,CAAA;MArBA;CAsBA,GAAA,CAAA;CAAQ,CAAkB,CAA1B,GAAA,CAAO,KAAP,CAAA;MAzBU;CA/IZ,EA+IY;;CA/IZ,CA2KA,CAAiB,GAAA,GAAC,KAAlB;;GAAwC,GAAT;MAC7B;CAAU,CAAQ,IAAlB,GAAA,EAAA;CAA0B,CAChB,IAAR;CADwB,CAElB,CAAN,GAAA;CAHa,KACf;CA5KF,EA2KiB;;CA3KjB,CAoLA,CAAkB,CAAA,EAAA,GAAC,MAAnB;CACE,OAAA,6DAAA;CAAA,EAAmB,CAAnB,EAAM,GAAN;CAAA,EACA,CAAA,GAAO,KAAM;CADb,EAGkB,CAAlB,EAAkB,KAAlB;CAHA,EAIsB,CAAtB,eAAA;CAJA,EAKa,CAAb,MAAA;CAEA;CAAA,QAAA,oCAAA;yBAAA;CACE,IAAA,CAAA;CADF,IAPA;CAAA,CAUA,CAAkB,CAAlB,EAAM,GAAa;CACjB,QAAA,CAAA;CAAA,GAAgC,CAAhC,CAAA;CAAA,CAAwB,CAAxB,CAAA,GAAO,CAAP,EAAA;QAAA;CAAA,CAC0C,CAA5B,CAAc,EAA5B,KAAA;CAGA,EAAA,CAAA,SAAM;CACJ,GAAG,CAAuB,GAA1B,WAAG;CACD,GAAG,EAAA,IAAH,CAAc;CACZ,EAAsB,QAAW,CAAjC,OAAA;MADF,MAAA;CAGE,iBAHF;YADF;CAAA,GAKQ,CAAc,CALtB,IAAA;CAME,GAAG,EAAA,IAAH,CAAc;CACZ,EAAa,MAAA,CAAb,CAAwB,CAAxB;MADF,MAAA;CAGE,iBAHF;YANF;MAAA,IAAA;CAWE,EAA6B,CAA1B,EAAA,IAAH,CAAc,QAAd;CACE,GAA0C,CAA1C,OAAA;CAAA,EAAA,CAA2B,GAApB,EAAc,CAAM,IAA3B;cAAA;CACA,GAAG,MAAa,EAAhB;CACE,CAAyB,CAArB,EAAA,MAAW,GAAf,KAAyB;CACzB,EAAY,CAAT,EAAA,CAAiB,EAA4B,CAAM,GAArB,CAAjC;CACE,KAAM,EAAN,QAAA;CAAA,CAC8C,IAAY,EAA1D,EAAA,EAAwB,IAAxB;MAFF,UAAA;CAIE,CAA8C,EAA9C,EAAA,EAAA,EAAA,EAAwB,IAAxB;gBANJ;cADA;CAAA,EASc,EAAA,MAAd,CAAA,OAAc;CATd,EAUsB,SAAtB,OAAA;CAVA,EAWa,OAAb,EAAA;MAZF,MAAA;CAcE,iBAdF;YAXF;UADF;CAJA,MAIA;AA4BA,CAAA,GAAA,EAAA,IAAoB,CAApB,CAAoB;CACX,GAAP,CAAA,CAAM,SAAN;QAlCc;CAAlB,IAAkB;CAVlB,CA8CA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CAClB,EAAA,GAAA,CAAO,QAAM;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAIZ,CAAP,CAAmB,GAAb,CAAN,EAAoB,EAApB;CACE,EAAA,GAAA,CAAO,EAAP,OAAa;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAvOrB,EAoLkB;;CApLlB,CA6OA,CAAW,GAAiB,EAA5B,CAA6B,GAAlB;CACT,OAAA,4CAAA;CAAA,EAAmB,CAAnB,CAAA,CAAM,GAAN;CAAA,EAEkB,CAAlB,EAAkB,KAAlB;CAFA,EAGsB,CAAtB,eAAA;CAHA,EAIa,CAAb,MAAA;CAJA,EAMmC,CAAnC,CAAmC,CAA7B,eAAN;CANA,EAQa,CAAb,EAAA;CARA,CASA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CACV,EAAR,IAAO,MAAP,EAAa;CADf,IAAmB;CATnB,CAYA,CAAkB,CAAlB,EAAM,GAAa;CACjB,QAAA,CAAA;CAAA,GAAgC,CAAhC,CAAA;CAAA,CAAwB,CAAxB,CAAA,GAAO,CAAP,EAAA;QAAA;CAAA,CAC0C,CAA5B,CAAc,EAA5B,KAAA;CAEA,EAAA,CAAA,SAAM;CACJ,GAAG,CAAuB,GAA1B,WAAG;CACD,GAAG,EAAA,IAAH,CAAc;CACZ,EAAsB,QAAW,CAAjC,OAAA;MADF,MAAA;CAGE,iBAHF;YADF;CAAA,GAKQ,CAAc,CALtB,IAAA;CAME,GAAG,EAAA,IAAH,CAAc;CACZ,EAAa,MAAA,CAAb,CAAwB,CAAxB;MADF,MAAA;CAGE,iBAHF;YANF;MAAA,IAAA;CAWE,EAA6B,CAA1B,EAAA,IAAH,CAAc,QAAd;CACE,GAA0C,CAA1C,OAAA;CAAA,EAAA,CAA2B,GAApB,EAAc,CAAM,IAA3B;cAAA;CACA,GAAG,MAAa,EAAhB;CACE,CAAyB,CAArB,EAAA,MAAW,GAAf,KAAyB;CACzB,EAAY,CAAT,EAAA,CAAiB,EAA4B,CAAM,GAArB,CAAjC;CACE,KAAM,EAAN,QAAA;CAAA,CAC8C,IAAY,EAA1D,EAAA,EAAwB,IAAxB;MAFF,UAAA;CAIE,CAA8C,EAA9C,EAAA,EAAA,EAAA,EAAwB,IAAxB;gBANJ;cADA;CAAA,EASc,EAAA,MAAd,CAAA,OAAc;CATd,EAUsB,SAAtB,OAAA;CAVA,EAWa,OAAb,EAAA;MAZF,MAAA;CAcE,iBAdF;YAXF;UADF;CAHA,MAGA;AA4BA,CAAA,GAAA,EAAA,IAAoB,CAApB,CAAoB;CAClB,GAAG,EAAM,EAAT,CAAA;CACS,GAAP,CAAA,CAAM,WAAN;MADF,IAAA;CAGS,GAAP,EAAM,WAAN,IAA4B;UAJhC;QAhCgB;CAAlB,IAAkB;CAZlB,CAkDA,CAAmB,CAAnB,EAAM,CAAN,EAAoB;CAClB,EAAA,GAAA,CAAO,QAAM;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAIZ,CAAP,CAAmB,GAAb,CAAN,EAAoB,EAApB;CACE,EAAA,GAAA,CAAO,EAAP,OAAa;CACN,EAAP,GAAM,OAAN;CAFF,IAAmB;CAvDV,CA0DY,CA1DK,CAAjB,EAAA,EA0DK,CAAmB;CACzB,CAAK,CAAb,CAAA,GAAO,CAAiC,GAAxC,SAAa;CA3DJ,EA0DwB;;CAvSnC,CA0SA,CAAiC,CAAjC,EAAiC,GAAC,EAAlC,EAAA;CACS,EAAS,CAAI,EAAd,KAAN;CADF,EAAiC;;CA1SjC,CA6SA,CAAgC,CAAA,CAAhC,CAAgC,GAAC,EAAjC;CACE,OAAA,OAAA;CAAA,EAAY,CAAZ,KAAA;CACA,GAAA,CAAmB,EAAhB,CAAwB;CACzB,CAAkB,IAAlB,GAAA,EAAA;CAA8B,CACvB,CAAL,KAAA;CAD4B,CAEtB,EAAN,GAF4B,CAE5B;CAFF,OAAA;CAIO,EAAP,GAAM,OAAN;AACO,CAAD,GAAA,EANR,GAMkB;CAChB,CAAkB,IAAlB,GAAA,EAAA;CACU,CAAQ,IAAlB,GAAA,IAAA,IAAA;CAAqC,CAC7B,EAAN,IAAA,SADmC;CAAA,CAE9B,CAAL,KAAA;CAVJ,OAQE;IAIM,CAAa,CAZrB,GAYQ,IAZR;CAaE,CAAkB,IAAlB,GAAA,EAAA;CAA8B,CACvB,CAAL,KAAA;CAD4B,CAEtB,EAAN,IAAA;CAFF,OAAA;CAIO,EAAP,GAAM,OAAN;MAjBF;CAmBE,GAAG,CAAiB,CAApB,OAAA;CACE,EAAO,CAAP,IAAA,CAAO,GAAA;CACP,GAAG,IAAH;CACE,GAAI,EAAJ,IAAA;CACA,GAAG,MAAH,CAAA;CACS,CAAmB,CAAa,CAApB,EAAb,CAAN,EAAuC,EAAvC,QAAA;CACkB,CAAW,EAAP,EAApB,SAAA,MAAA;CADF,YAAuC;YAH3C;MAAA,IAAA;CAMW,CAAM,CAAN,CAAA,IAAT,CAAU,QAAV;CACE,aAAA,EAAA;CAAA,EAAO,CAAP,KAAO,GAAP;CACA,GAAG,QAAH;CACE,GAAI,EAAJ,IAAA,IAAA;CACA,GAAG,OAAH,GAAA;CACS,CAAmB,CAAa,CAApB,EAAb,CAAN,EAAuC,EAAvC,YAAA;CACkB,CAAW,EAAP,EAApB,SAAA,UAAA;CADF,gBAAuC;gBAH3C;MAAA,QAAA;CAME,EAAA,CAAG,UAAH;CACE,CAAkB,IAAlB,GAAA,EAAA,KAAA;CAA8B,CACvB,CAAL,eAAA;CAD4B,CAEtB,EAAN,cAAA;CAFF,iBAAA;CAIO,EAAP,GAAM,iBAAN;MALF,UAAA;CAOE,CAA2B,CAAhB,CAAX,EAAW,GAAA,OAAX;CACA,GAAG,CAAoB,IAAV,GAAV,IAAH;CACE,CAAY,CAAJ,CAAA,CAAR,aAAA;IACM,CAAoB,CAF5B,GAEkB,GAAV,MAFR;CAGE,CAAY,CAAJ,CAAA,CAAR,aAAA;CACO,EAAQ,CAAT,CAAC,CAJT,GAI0B,SAJ1B,+BAIiB;CACf,IAAK,aAAL;CAAA,IACM,GAAM,UAAZ;MANF,YAAA;CAQE,CAAY,CAAJ,CAAA,CAAR,aAAA;kBATF;CAAA,GAWA,CAAK,EAAL,SAAA;CAXA,CAY4B,CAAlB,EAAA,EAAV,GAAU,MAAV;CAAmC,CAAK,CAAL,MAAA,SAAA;CAZnC,iBAYU;CAZV,EAae,CAAX,GAAJ,SAAA;CAbA,CAcA,CAAmB,CAAA,EAAnB,CAAO,EAAa,OAApB;CACO,GAAD,IAAA,iBAAJ;CADF,gBAAmB;CAEX,CAAoB,CAAA,CAA5B,EAAc,CAAP,EAAsB,cAA7B;CACE,EAAmB,CAAf,OAAJ,OAAA;CACC,CAAoB,CAAA,CAArB,EAAqB,CAArB,EAAsB,gBAAtB;CACS,CAAc,CAAa,CAAlC,EAAM,CAAN,EAAkC,EAAlC,gBAAA;CACkB,CAAM,EAAtB,EAA4B,SAA5B,cAAA;CADF,oBAAkC;CADpC,kBAAqB;CAFvB,gBAA4B;gBA7BhC;cAFO;CAAT,UAAS;UARb;MAAA,EAAA;CA6CE,CAAkB,IAAlB,EAAA,CAAA,EAAA;CAA8B,CACvB,CAAL,OAAA;CAD4B,CAEtB,EAAN,MAAA;CAFF,SAAA;CAIO,EAAP,GAAM,SAAN;QApEJ;MAF8B;CAAhC,EAAgC;;CA7ShC,CAwXA,CAAgC,CAAA,CAAhC,CAAgC,GAAC,EAAjC;CACE,CAAkB,EAAlB,EAAA,GAAA;CAA0B,CAChB,IAAR;CADwB,CAEnB,CAAL,GAAA,mBAFwB;CAA1B,KAAA;CAIU,CAAQ,IAAlB,GAAA,EAAA;CAA0B,CAChB,IAAR;CADwB,CAEnB,CAAL,GAAA,gEAFwB;CALI,KAK9B;CALF,EAAgC;;CAxXhC,CAmYA,CAAY,MAAZ;;CAnYA,CAoYA,KAAA;CACE,CAAK,CAAL,CAAA,+BAAA;CAAA,CACM,EAAN;EACE,CAAA,CAHJ,CAGI,GAAA,CAAC;CACD,EAAY,CAAZ,KAAA;CACQ,EAAR,CAAqB,GAAd,EAAM,EAAb,CAAA;CALJ,EAGI;;CAvYJ,CA2YA,CAA+B,CAAA,CAA/B,CAA+B,GAAC,CAAhC,CAAA;CACE,OAAA,gCAAA;CAAA,EAAA,CAAA,EAAY,EAAN;CACN,EAAiB,CAAjB,CAAyB,IAAb,EAAT,EAAH;CACE,EAAO,CAAP,EAAA,MAAO;CACP,GAAG,EAAH,GAAa;CACX;CAAA,YAAA,gCAAA;2BAAA;CACE,CAAuB,EAAvB,EAAA,IAAA,IAAA;CADF,QADF;QAFF;MADA;CAOA,EAAiB,CAAjB,CAAyB,IAAb;CACV,EAAS,GAAT,GAAS;CAAT,EACO,CAAP,EAAA,GAAO;CACC,CAAY,CAApB,CAAA,EAAA,CAAO,MAAP;MAX2B;CAA/B,EAA+B;;CA3Y/B,CA+ZA,CAAkB,CAAd,GAAc,CAAA,CAAC,GAAnB;CACE,EAAM,CAAN,CAAG,EAAiB,CAAjB,KAAH;CACE,EAAA,GAAA,EAAQ,CAAR;CACS,EAAT,EAAkB,CAAO,EAAjB,KAAR;MAFF;CAIE,EAAA,GAAA,EAAQ,CAAR;CACS,EAAT,KAAQ,KAAR;MANc;CAAlB,EAAkB,GAAlB,EAOgB,CAPhB;;CA/ZA,CAyaA,CAAc,CAAA,GAAd;;CAzaA,CA0aA,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;CAUU,EAAR,IAAO,QAAP,gBAAA;QAZM;CAFV,IAEU;CA7aZ,GA0aA;;CA1aA,CA2bA,CAAY,MAAA,EAAZ;CACE,OAAA,iBAAA;AAAA,CAAA;UAAA,oCAAA;wBAAA;CACE,GAAG,CAAH,CAAA;CACE,EAAa,CAAT,CAAJ;MADF,EAAA;CAGE,EAAA,CAAa,GAAN,CAAP;CAAA,GACI,GAAQ;QALhB;CAAA;qBADU;CAAZ,CAOE,CAPU,GAAZ;;CA3bA,CAqcA,CAAgB,GAAA,GAAC,IAAjB;CACE,OAAA,8BAAA;CAAA,EAAQ,CAAR,CAAA;CAAA,CACwB,CAAM,CAA9B,CAAoC,CAApC,CAAwB,OAAxB;CACA;CAAA;UAAA,mCAAA;uBAAA;CACE,CAAuB,EAAvB,EAAA,QAAA;CADF;qBAHc;CArchB,EAqcgB;;CArchB,CA2cA,CAAuB,GAAA,GAAC,WAAxB;CACE,GAAA;CAAc,CAAQ,CAAgC,CAA3B,CAAA,CAA3B,OAAA;MADqB;CA3cvB,EA2cuB;;CA3cvB,CA8cA,CAAO,CAAP;;CA9cA,CA+cA,KAAA;CACE,CAAK,CAAL,CAAA,0BAAA;CAAA,CACM,EAAN;EACE,CAAA,CAHJ,CAGI,GAAA,CAAC;CACD,EAAO,CAAP;CACQ,EAAR,CAAyB,EAAZ,CAAN,EAAM,EAAb;CALJ,EAGI;;CAldJ,CAsdA,CAAiC,CAAA,CAAjC,CAAiC,GAAC,EAAlC,CAAA;CACuB,KAArB,KAAA,SAAA;CADF,EAAiC;;CAtdjC,CAydA,CAA2B,CAAA,CAA3B,CAAA,GAA4B,EAA5B;CACE,EAAG,CAAH,CAAuB,CAAvB;CACuB,KAArB,OAAA,OAAA;MAFuB;CAA3B,EAA2B;;CAI3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA7dA;CAAA" "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