Commit 2a6e56ee authored by mercury233's avatar mercury233

add cloud replay

parent 6d2b3034
{ {
"port": 233, "port": 233,
"version": 4918, "version": 4920,
"ygopro_path": "ygocore", "ygopro_path": "ygopro",
"modules": { "modules": {
"welcome": "YGOPRO Server", "welcome": "YGOPRO Server",
"update": "请更新游戏版本", "update": "请更新游戏版本",
"stop": false, "stop": false,
"tips": "http://mercury233.me/ygosrv233/tips.json", "tips": "http://mercury233.me/ygosrv233/tips.json",
"dialogues": "http://mercury233.me/ygosrv233/dialogues.json", "dialogues": "http://mercury233.me/ygosrv233/dialogues.json",
"redis_port": 6379,
"enable_random_duel": false, "enable_random_duel": false,
"post_start_watching": true, "post_start_watching": true,
"TCG_banlist_id": 8, "TCG_banlist_id": 8,
......
...@@ -6,6 +6,7 @@ spawnSync = require('child_process').spawnSync ...@@ -6,6 +6,7 @@ spawnSync = require('child_process').spawnSync
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
bunyan = require 'bunyan' bunyan = require 'bunyan'
moment = require 'moment' moment = require 'moment'
redis = require 'redis'
moment.locale('zh-cn', { relativeTime : { moment.locale('zh-cn', { relativeTime : {
future : '%s内', future : '%s内',
past : '%s前', past : '%s前',
...@@ -24,6 +25,7 @@ moment.locale('zh-cn', { relativeTime : { ...@@ -24,6 +25,7 @@ moment.locale('zh-cn', { relativeTime : {
settings = require './config.json' settings = require './config.json'
log = bunyan.createLogger name: "mycard-room" log = bunyan.createLogger name: "mycard-room"
redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#获取可用内存 #获取可用内存
get_memory_usage = ()-> get_memory_usage = ()->
...@@ -136,6 +138,7 @@ class Room ...@@ -136,6 +138,7 @@ class Room
@name = name @name = name
@alive = true @alive = true
@players = [] @players = []
@player_datas = []
@status = 'starting' @status = 'starting'
@started = false @started = false
@established = false @established = false
...@@ -320,6 +323,24 @@ class Room ...@@ -320,6 +323,24 @@ class Room
#积分 #积分
return if @deleted return if @deleted
#log.info 'room-delete', this.name, Room.all.length #log.info 'room-delete', this.name, Room.all.length
if @player_datas.length
replay_buffer = Buffer.concat(@watcher_buffers).toString('binary')
player_names=@player_datas[0].name + (if @player_datas[2] then "+" + @player_datas[2].name else "") +
" VS " +
@player_datas[1].name + (if @player_datas[3] then "+" + @player_datas[3].name else "")
date_time=moment().format('YYYY-MM-DD HH:mm:ss')
replay_id=Math.floor(Math.random()*100000000)
redisdb.hmset("replay:"+replay_id,
"replay_id", replay_id,
"replay_buffer", replay_buffer,
"player_names", player_names,
"date_time", date_time)
recorded_ip=[]
_.each @player_datas, (player)=>
return if _.contains(recorded_ip, player.ip)
recorded_ip.push player.ip
redisdb.lpush(player.ip+":replays", replay_id)
return
@watcher_buffers = [] @watcher_buffers = []
@players = [] @players = []
@watcher.end() if @watcher @watcher.end() if @watcher
......
// Generated by CoffeeScript 1.10.0 // Generated by CoffeeScript 1.10.0
(function() { (function() {
var Room, _, bunyan, get_memory_usage, log, moment, settings, spawn, spawnSync, ygopro; var Room, _, bunyan, get_memory_usage, log, moment, redis, redisdb, settings, spawn, spawnSync, ygopro;
_ = require('underscore'); _ = require('underscore');
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
moment = require('moment'); moment = require('moment');
redis = require('redis');
moment.locale('zh-cn', { moment.locale('zh-cn', {
relativeTime: { relativeTime: {
future: '%s内', future: '%s内',
...@@ -42,6 +44,11 @@ ...@@ -42,6 +44,11 @@
name: "mycard-room" name: "mycard-room"
}); });
redisdb = redis.createClient({
host: "127.0.0.1",
port: settings.modules.redis_port
});
get_memory_usage = function() { get_memory_usage = function() {
var actualFree, buffers, cached, free, line, lines, percentUsed, prc_free, total; var actualFree, buffers, cached, free, line, lines, percentUsed, prc_free, total;
prc_free = spawnSync("free", []); prc_free = spawnSync("free", []);
...@@ -189,6 +196,7 @@ ...@@ -189,6 +196,7 @@
this.name = name; this.name = name;
this.alive = true; this.alive = true;
this.players = []; this.players = [];
this.player_datas = [];
this.status = 'starting'; this.status = 'starting';
this.started = false; this.started = false;
this.established = false; this.established = false;
...@@ -411,10 +419,27 @@ ...@@ -411,10 +419,27 @@
} }
Room.prototype["delete"] = function() { Room.prototype["delete"] = function() {
var index; var date_time, index, player_names, recorded_ip, replay_buffer, replay_id;
if (this.deleted) { if (this.deleted) {
return; return;
} }
if (this.player_datas.length) {
replay_buffer = Buffer.concat(this.watcher_buffers).toString('binary');
player_names = this.player_datas[0].name + (this.player_datas[2] ? "+" + this.player_datas[2].name : "") + " VS " + this.player_datas[1].name + (this.player_datas[3] ? "+" + this.player_datas[3].name : "");
date_time = moment().format('YYYY-MM-DD HH:mm:ss');
replay_id = Math.floor(Math.random() * 100000000);
redisdb.hmset("replay:" + replay_id, "replay_id", replay_id, "replay_buffer", replay_buffer, "player_names", player_names, "date_time", date_time);
recorded_ip = [];
_.each(this.player_datas, (function(_this) {
return function(player) {
if (_.contains(recorded_ip, player.ip)) {
return;
}
recorded_ip.push(player.ip);
redisdb.lpush(player.ip + ":replays", replay_id);
};
})(this));
}
this.watcher_buffers = []; this.watcher_buffers = [];
this.players = []; this.players = [];
if (this.watcher) { if (this.watcher) {
......
...@@ -18,6 +18,9 @@ bunyan = require 'bunyan' ...@@ -18,6 +18,9 @@ bunyan = require 'bunyan'
moment = require 'moment' moment = require 'moment'
redis = require 'redis'
redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#heapdump = require 'heapdump' #heapdump = require 'heapdump'
#配置文件 #配置文件
...@@ -108,6 +111,21 @@ net.createServer (client) -> ...@@ -108,6 +111,21 @@ net.createServer (client) ->
client.end() client.end()
return return
client.open_cloud_replay= (err, replay)->
if err or !replay
ygopro.stoc_send_chat(client,"没有找到录像", 11)
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
return
replay_buffer=new Buffer(replay.replay_buffer,'binary')
ygopro.stoc_send_chat(client,"正在观看云录像:R##{replay.replay_id} #{replay.player_names} #{replay.date_time}", 14)
client.write replay_buffer
client.end()
return
#需要重构 #需要重构
#客户端到服务端(ctos)协议分析 #客户端到服务端(ctos)协议分析
ctos_buffer = new Buffer(0) ctos_buffer = new Buffer(0)
...@@ -247,6 +265,40 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -247,6 +265,40 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
} }
client.end() client.end()
else if info.pass.toUpperCase()=="R"
ygopro.stoc_send_chat(client,"以下是您近期的云录像,密码处输入 R#录像编号 即可观看", 14)
redisdb.lrange client.remoteAddress+":replays", 0, 2, (err, result)=>
_.each result, (replay_id,id)=>
redisdb.hgetall "replay:"+replay_id, (err, replay)=>
ygopro.stoc_send_chat(client,"<#{id-0+1}> R##{replay_id} #{replay.player_names} #{replay.date_time}", 14)
return
return
return
#强行等待异步执行完毕_(:з」∠)_
setTimeout (()=>
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()), 500
else if info.pass[0...2].toUpperCase()=="R#"
replay_id=info.pass.split("#")[1]
if (replay_id>0 and replay_id<=3)
redisdb.lindex client.remoteAddress+":replays", replay_id-1, (err, replay_id)=>
redisdb.hgetall "replay:"+replay_id, client.open_cloud_replay
return
else if replay_id
redisdb.hgetall "replay:"+replay_id, client.open_cloud_replay
else
ygopro.stoc_send_chat(client,"没有找到录像", 11)
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if info.version != settings.version else if info.version != settings.version
ygopro.stoc_send_chat(client,settings.modules.update, 11) ygopro.stoc_send_chat(client,settings.modules.update, 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG',{
...@@ -530,6 +582,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)-> ...@@ -530,6 +582,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client.room.dueling_players = [] client.room.dueling_players = []
for player in client.room.players when player.pos != 7 for player in client.room.players when player.pos != 7
client.room.dueling_players[player.pos] = player client.room.dueling_players[player.pos] = player
client.room.player_datas.push ip:player.remoteAddress, name:player.name
if settings.modules.tips if settings.modules.tips
ygopro.stoc_send_random_tip(client) ygopro.stoc_send_random_tip(client)
return return
......
// Generated by CoffeeScript 1.10.0 // Generated by CoffeeScript 1.10.0
(function() { (function() {
var Graveyard, Room, _, bunyan, debug, dialogues, execFile, fs, http, http_server, log, moment, net, os, path, request, settings, tips, tribute, url, wait_room_start, ygopro; var Graveyard, Room, _, bunyan, debug, dialogues, execFile, fs, http, http_server, log, moment, net, os, path, redis, redisdb, request, settings, tips, tribute, url, wait_room_start, ygopro;
net = require('net'); net = require('net');
...@@ -28,6 +28,13 @@ ...@@ -28,6 +28,13 @@
moment = require('moment'); moment = require('moment');
redis = require('redis');
redisdb = redis.createClient({
host: "127.0.0.1",
port: settings.modules.redis_port
});
settings = require('./config.json'); settings = require('./config.json');
settings.BANNED_user = []; settings.BANNED_user = [];
...@@ -131,6 +138,22 @@ ...@@ -131,6 +138,22 @@
client.end(); client.end();
} }
}); });
client.open_cloud_replay = function(err, replay) {
var replay_buffer;
if (err || !replay) {
ygopro.stoc_send_chat(client, "没有找到录像", 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
client.end();
return;
}
replay_buffer = new Buffer(replay.replay_buffer, 'binary');
ygopro.stoc_send_chat(client, "正在观看云录像:R#" + replay.replay_id + " " + replay.player_names + " " + replay.date_time, 14);
client.write(replay_buffer);
client.end();
};
ctos_buffer = new Buffer(0); ctos_buffer = new Buffer(0);
ctos_message_length = 0; ctos_message_length = 0;
ctos_proto = 0; ctos_proto = 0;
...@@ -266,7 +289,7 @@ ...@@ -266,7 +289,7 @@
}); });
ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) { ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) {
var k, len, ref, room; var k, len, ref, replay_id, room;
if (settings.modules.stop) { if (settings.modules.stop) {
ygopro.stoc_send_chat(client, settings.modules.stop, 11); ygopro.stoc_send_chat(client, settings.modules.stop, 11);
ygopro.stoc_send(client, 'ERROR_MSG', { ygopro.stoc_send(client, 'ERROR_MSG', {
...@@ -274,6 +297,44 @@ ...@@ -274,6 +297,44 @@
code: 2 code: 2
}); });
client.end(); client.end();
} else if (info.pass.toUpperCase() === "R") {
ygopro.stoc_send_chat(client, "以下是您近期的云录像,密码处输入 R#录像编号 即可观看", 14);
redisdb.lrange(client.remoteAddress + ":replays", 0, 2, (function(_this) {
return function(err, result) {
_.each(result, function(replay_id, id) {
redisdb.hgetall("replay:" + replay_id, function(err, replay) {
ygopro.stoc_send_chat(client, "<" + (id - 0 + 1) + "> R#" + replay_id + " " + replay.player_names + " " + replay.date_time, 14);
});
});
};
})(this));
setTimeout(((function(_this) {
return function() {
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
return client.end();
};
})(this)), 500);
} else if (info.pass.slice(0, 2).toUpperCase() === "R#") {
replay_id = info.pass.split("#")[1];
if (replay_id > 0 && replay_id <= 3) {
redisdb.lindex(client.remoteAddress + ":replays", replay_id - 1, (function(_this) {
return function(err, replay_id) {
redisdb.hgetall("replay:" + replay_id, client.open_cloud_replay);
};
})(this));
} else if (replay_id) {
redisdb.hgetall("replay:" + replay_id, client.open_cloud_replay);
} else {
ygopro.stoc_send_chat(client, "没有找到录像", 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
client.end();
}
} else if (info.version !== settings.version) { } else if (info.version !== settings.version) {
ygopro.stoc_send_chat(client, settings.modules.update, 11); ygopro.stoc_send_chat(client, settings.modules.update, 11);
ygopro.stoc_send(client, 'ERROR_MSG', { ygopro.stoc_send(client, 'ERROR_MSG', {
...@@ -612,9 +673,14 @@ ...@@ -612,9 +673,14 @@
ref = client.room.players; ref = client.room.players;
for (k = 0, len = ref.length; k < len; k++) { for (k = 0, len = ref.length; k < len; k++) {
player = ref[k]; player = ref[k];
if (player.pos !== 7) { if (!(player.pos !== 7)) {
client.room.dueling_players[player.pos] = player; continue;
} }
client.room.dueling_players[player.pos] = player;
client.room.player_datas.push({
ip: player.remoteAddress,
name: player.name
});
} }
} }
if (settings.modules.tips) { if (settings.modules.tips) {
......
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