Commit 21ca68db authored by mercury233's avatar mercury233

cloud replay test2

parent 9d553918
...@@ -7,12 +7,13 @@ ...@@ -7,12 +7,13 @@
"stop": false, "stop": false,
"tips": "http://mercury233.me/ygosrv233tips.json", "tips": "http://mercury233.me/ygosrv233tips.json",
"dialogues": "http://mercury233.me/ygosrv233/dialogues.json", "dialogues": "http://mercury233.me/ygosrv233/dialogues.json",
"redis_port": 6379,
"enable_websocket_roomlist": false, "enable_websocket_roomlist": false,
"enable_random_duel": false, "enable_random_duel": false,
"mycard_auth": false, "enable_halfway_watch": true,
"post_start_watching": true,
"enable_TCG_as_default": false, "enable_TCG_as_default": false,
"enable_cloud_replay": false,
"redis_port": 6379,
"mycard_auth": false,
"http": { "http": {
"port": 7922, "port": 7922,
"password": "123456", "password": "123456",
......
...@@ -8,7 +8,6 @@ ygopro = require './ygopro.js' ...@@ -8,7 +8,6 @@ ygopro = require './ygopro.js'
roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist
bunyan = require 'bunyan' bunyan = require 'bunyan'
moment = require 'moment' moment = require 'moment'
#redis = require 'redis'
moment.locale('zh-cn', { moment.locale('zh-cn', {
relativeTime: { relativeTime: {
future: '%s内', future: '%s内',
...@@ -28,7 +27,11 @@ moment.locale('zh-cn', { ...@@ -28,7 +27,11 @@ moment.locale('zh-cn', {
}) })
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
if settings.modules.enable_cloud_replay
redis = require 'redis'
zlib = require 'zlib'
redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#获取可用内存 #获取可用内存
get_memory_usage = ()-> get_memory_usage = ()->
...@@ -347,26 +350,34 @@ class Room ...@@ -347,26 +350,34 @@ 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 and settings.modules.enable_cloud_replay
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 "") + player_names=@player_datas[0].name + (if @player_datas[2] then "+" + @player_datas[2].name else "") +
" VS " + " VS " +
@player_datas[1].name + (if @player_datas[3] then "+" + @player_datas[3].name else "") (if @player_datas[1] then @player_datas[1].name else "AI") +
date_time=moment().format('YYYY-MM-DD HH:mm:ss') (if @player_datas[3] then "+" + @player_datas[3].name else "")
replay_id=Math.floor(Math.random()*100000000) player_ips=[]
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)=> _.each @player_datas, (player)=>
return if _.contains(recorded_ip, player.ip) player_ips.push(player.ip)
recorded_ip.push player.ip return
redisdb.lpush(player.ip+":replays", replay_id) watcher_buffer=Buffer.concat(@watcher_buffers)
zlib.deflate watcher_buffer, (err, replay_buffer) =>
replay_buffer=replay_buffer.toString('binary')
#log.info err, replay_buffer
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)
redisdb.expire("replay:"+replay_id, 60*60*24)
recorded_ip=[]
_.each player_ips, (player_ip)=>
return if _.contains(recorded_ip, player_ip)
recorded_ip.push player_ip
redisdb.lpush(player_ip+":replays", replay_id)
return
return 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, roomlist, settings, spawn, spawnSync, ygopro; var Room, _, bunyan, get_memory_usage, log, moment, redis, redisdb, roomlist, settings, spawn, spawnSync, ygopro, zlib;
_ = require('underscore'); _ = require('underscore');
...@@ -46,6 +46,15 @@ ...@@ -46,6 +46,15 @@
name: "mycard-room" name: "mycard-room"
}); });
if (settings.modules.enable_cloud_replay) {
redis = require('redis');
zlib = require('zlib');
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", []);
...@@ -448,31 +457,38 @@ ...@@ -448,31 +457,38 @@
} }
Room.prototype["delete"] = function() { Room.prototype["delete"] = function() {
var index; var index, player_ips, player_names, watcher_buffer;
if (this.deleted) { if (this.deleted) {
return; return;
} }
if (this.player_datas.length && settings.modules.enable_cloud_replay) {
/* player_names = this.player_datas[0].name + (this.player_datas[2] ? "+" + this.player_datas[2].name : "") + " VS " + (this.player_datas[1] ? this.player_datas[1].name : "AI") + (this.player_datas[3] ? "+" + this.player_datas[3].name : "");
if @player_datas.length player_ips = [];
replay_buffer = Buffer.concat(@watcher_buffers).toString('binary') _.each(this.player_datas, (function(_this) {
player_names=@player_datas[0].name + (if @player_datas[2] then "+" + @player_datas[2].name else "") + return function(player) {
" VS " + player_ips.push(player.ip);
@player_datas[1].name + (if @player_datas[3] then "+" + @player_datas[3].name else "") };
date_time=moment().format('YYYY-MM-DD HH:mm:ss') })(this));
replay_id=Math.floor(Math.random()*100000000) watcher_buffer = Buffer.concat(this.watcher_buffers);
redisdb.hmset("replay:"+replay_id, zlib.deflate(watcher_buffer, (function(_this) {
"replay_id", replay_id, return function(err, replay_buffer) {
"replay_buffer", replay_buffer, var date_time, recorded_ip, replay_id;
"player_names", player_names, replay_buffer = replay_buffer.toString('binary');
"date_time", date_time) date_time = moment().format('YYYY-MM-DD HH:mm:ss');
recorded_ip=[] replay_id = Math.floor(Math.random() * 100000000);
_.each @player_datas, (player)=> redisdb.hmset("replay:" + replay_id, "replay_id", replay_id, "replay_buffer", replay_buffer, "player_names", player_names, "date_time", date_time);
return if _.contains(recorded_ip, player.ip) redisdb.expire("replay:" + replay_id, 60 * 60 * 24);
recorded_ip.push player.ip recorded_ip = [];
redisdb.lpush(player.ip+":replays", replay_id) _.each(player_ips, function(player_ip) {
return 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) {
......
...@@ -19,9 +19,6 @@ bunyan = require 'bunyan' ...@@ -19,9 +19,6 @@ 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'
#配置文件 #配置文件
...@@ -35,6 +32,11 @@ settings.lflist = (for list in fs.readFileSync('ygopro/lflist.conf', 'utf8').mat ...@@ -35,6 +32,11 @@ settings.lflist = (for list in fs.readFileSync('ygopro/lflist.conf', 'utf8').mat
continue unless date continue unless date
{date: moment(list.match(/!([\d\.]+)/)[1], 'YYYY.MM.DD'), tcg: list.indexOf('TCG') != -1}) {date: moment(list.match(/!([\d\.]+)/)[1], 'YYYY.MM.DD'), tcg: list.indexOf('TCG') != -1})
if settings.modules.enable_cloud_replay
redis = require 'redis'
zlib = require 'zlib'
redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#组件 #组件
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
Room = require './room.js' Room = require './room.js'
...@@ -118,22 +120,26 @@ net.createServer (client) -> ...@@ -118,22 +120,26 @@ net.createServer (client) ->
ygopro.stoc_send_chat(client, "服务器错误: #{error}", 11) ygopro.stoc_send_chat(client, "服务器错误: #{error}", 11)
client.end() client.end()
return return
###
client.open_cloud_replay= (err, replay)-> if settings.modules.enable_cloud_replay
if err or !replay client.open_cloud_replay= (err, replay)->
ygopro.stoc_send_chat(client,"没有找到录像", 11) if err or !replay
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send_chat(client,"没有找到录像", 11)
msg: 1 ygopro.stoc_send client, 'ERROR_MSG',{
code: 2 msg: 1
} code: 2
client.end() }
client.end()
return
redisdb.expire("replay:"+replay.replay_id, 60*60*48)
buffer=new Buffer(replay.replay_buffer,'binary')
zlib.unzip buffer, (err, replay_buffer) =>
ygopro.stoc_send_chat(client,"正在观看云录像:R##{replay.replay_id} #{replay.player_names} #{replay.date_time}", 14)
client.write replay_buffer
client.end()
return
return 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)
...@@ -273,8 +279,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -273,8 +279,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
} }
client.end() client.end()
###
else if info.pass.toUpperCase()=="R" else if info.pass.toUpperCase()=="R" and settings.modules.enable_cloud_replay
ygopro.stoc_send_chat(client,"以下是您近期的云录像,密码处输入 R#录像编号 即可观看", 14) ygopro.stoc_send_chat(client,"以下是您近期的云录像,密码处输入 R#录像编号 即可观看", 14)
redisdb.lrange client.remoteAddress+":replays", 0, 2, (err, result)=> redisdb.lrange client.remoteAddress+":replays", 0, 2, (err, result)=>
_.each result, (replay_id,id)=> _.each result, (replay_id,id)=>
...@@ -291,7 +297,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -291,7 +297,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
} }
client.end()), 500 client.end()), 500
else if info.pass[0...2].toUpperCase()=="R#" else if info.pass[0...2].toUpperCase()=="R#" and settings.modules.enable_cloud_replay
replay_id=info.pass.split("#")[1] replay_id=info.pass.split("#")[1]
if (replay_id>0 and replay_id<=3) if (replay_id>0 and replay_id<=3)
redisdb.lindex client.remoteAddress+":replays", replay_id-1, (err, replay_id)=> redisdb.lindex client.remoteAddress+":replays", replay_id-1, (err, replay_id)=>
...@@ -306,7 +312,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -306,7 +312,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
code: 2 code: 2
} }
client.end() 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)
...@@ -541,7 +547,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -541,7 +547,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
} }
client.end() client.end()
else if room.started else if room.started
if settings.modules.post_start_watching if settings.modules.enable_halfway_watch
client.room = room client.room = room
client.is_post_watcher = true client.is_post_watcher = true
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战" ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
...@@ -569,7 +575,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -569,7 +575,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
if client.room.welcome if client.room.welcome
ygopro.stoc_send_chat client, client.room.welcome, 14 ygopro.stoc_send_chat client, client.room.welcome, 14
if settings.modules.post_start_watching and !client.room.watcher if settings.modules.enable_halfway_watch and !client.room.watcher
client.room.watcher = watcher = net.connect client.room.port, -> client.room.watcher = watcher = net.connect client.room.port, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', { ygopro.ctos_send watcher, 'PLAYER_INFO', {
name: "the Big Brother" name: "the Big Brother"
......
// Generated by CoffeeScript 1.10.0 // Generated by CoffeeScript 1.10.0
(function() { (function() {
var Graveyard, Room, _, bunyan, crypto, date, debug, dialogues, execFile, fs, http, http_server, https, https_server, list, log, moment, net, options, os, path, pg, request, requestListener, roomlist, settings, tips, tribute, url, users_cache, wait_room_start, ygopro; var Graveyard, Room, _, bunyan, crypto, date, debug, dialogues, execFile, fs, http, http_server, https, https_server, list, log, moment, net, options, os, path, pg, redis, redisdb, request, requestListener, roomlist, settings, tips, tribute, url, users_cache, wait_room_start, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -58,6 +58,15 @@ ...@@ -58,6 +58,15 @@
return results; return results;
})(); })();
if (settings.modules.enable_cloud_replay) {
redis = require('redis');
zlib = require('zlib');
redisdb = redis.createClient({
host: "127.0.0.1",
port: settings.modules.redis_port
});
}
ygopro = require('./ygopro.js'); ygopro = require('./ygopro.js');
Room = require('./room.js'); Room = require('./room.js');
...@@ -159,23 +168,29 @@ ...@@ -159,23 +168,29 @@
client.end(); client.end();
} }
}); });
if (settings.modules.enable_cloud_replay) {
/* client.open_cloud_replay = function(err, replay) {
client.open_cloud_replay= (err, replay)-> var buffer;
if err or !replay if (err || !replay) {
ygopro.stoc_send_chat(client,"没有找到录像", 11) ygopro.stoc_send_chat(client, "没有找到录像", 11);
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1 msg: 1,
code: 2 code: 2
});
client.end();
return;
} }
client.end() redisdb.expire("replay:" + replay.replay_id, 60 * 60 * 48);
return buffer = new Buffer(replay.replay_buffer, 'binary');
replay_buffer=new Buffer(replay.replay_buffer,'binary') zlib.unzip(buffer, (function(_this) {
ygopro.stoc_send_chat(client,"正在观看云录像:R##{replay.replay_id} #{replay.player_names} #{replay.date_time}", 14) return function(err, replay_buffer) {
client.write replay_buffer ygopro.stoc_send_chat(client, "正在观看云录像:R#" + replay.replay_id + " " + replay.player_names + " " + replay.date_time, 14);
client.end() client.write(replay_buffer);
return client.end();
*/ };
})(this));
};
}
ctos_buffer = new Buffer(0); ctos_buffer = new Buffer(0);
ctos_message_length = 0; ctos_message_length = 0;
ctos_proto = 0; ctos_proto = 0;
...@@ -311,7 +326,7 @@ ...@@ -311,7 +326,7 @@
}); });
ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) { ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) {
var check, decrypted_buffer, finish, i, id, k, l, len, len1, name, ref, ref1, room, secret, windbot; var check, decrypted_buffer, finish, i, id, k, l, len, len1, name, ref, ref1, replay_id, room, secret, windbot;
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', {
...@@ -319,41 +334,44 @@ ...@@ -319,41 +334,44 @@
code: 2 code: 2
}); });
client.end(); client.end();
} else if (info.pass.toUpperCase() === "R" && settings.modules.enable_cloud_replay) {
/* ygopro.stoc_send_chat(client, "以下是您近期的云录像,密码处输入 R#录像编号 即可观看", 14);
else if info.pass.toUpperCase()=="R" redisdb.lrange(client.remoteAddress + ":replays", 0, 2, (function(_this) {
ygopro.stoc_send_chat(client,"以下是您近期的云录像,密码处输入 R#录像编号 即可观看", 14) return function(err, result) {
redisdb.lrange client.remoteAddress+":replays", 0, 2, (err, result)=> _.each(result, function(replay_id, id) {
_.each result, (replay_id,id)=> redisdb.hgetall("replay:" + replay_id, function(err, replay) {
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);
ygopro.stoc_send_chat(client,"<#{id-0+1}> R##{replay_id} #{replay.player_names} #{replay.date_time}", 14) });
return });
return };
return })(this));
#强行等待异步执行完毕_(:з」∠)_ setTimeout(((function(_this) {
setTimeout (()=> return function() {
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1 msg: 1,
code: 2 code: 2
} });
client.end()), 500 return client.end();
};
else if info.pass[0...2].toUpperCase()=="R#" })(this)), 500);
replay_id=info.pass.split("#")[1] } else if (info.pass.slice(0, 2).toUpperCase() === "R#" && settings.modules.enable_cloud_replay) {
if (replay_id>0 and replay_id<=3) replay_id = info.pass.split("#")[1];
redisdb.lindex client.remoteAddress+":replays", replay_id-1, (err, replay_id)=> if (replay_id > 0 && replay_id <= 3) {
redisdb.hgetall "replay:"+replay_id, client.open_cloud_replay redisdb.lindex(client.remoteAddress + ":replays", replay_id - 1, (function(_this) {
return return function(err, replay_id) {
else if replay_id redisdb.hgetall("replay:" + replay_id, client.open_cloud_replay);
redisdb.hgetall "replay:"+replay_id, client.open_cloud_replay };
else })(this));
ygopro.stoc_send_chat(client,"没有找到录像", 11) } else if (replay_id) {
ygopro.stoc_send client, 'ERROR_MSG',{ redisdb.hgetall("replay:" + replay_id, client.open_cloud_replay);
msg: 1 } else {
ygopro.stoc_send_chat(client, "没有找到录像", 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2 code: 2
} });
client.end() 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', {
...@@ -590,7 +608,7 @@ ...@@ -590,7 +608,7 @@
}); });
client.end(); client.end();
} else if (room.started) { } else if (room.started) {
if (settings.modules.post_start_watching) { if (settings.modules.enable_halfway_watch) {
client.room = room; client.room = room;
client.is_post_watcher = true; client.is_post_watcher = true;
ygopro.stoc_send_chat_to_room(client.room, client.name + " 加入了观战"); ygopro.stoc_send_chat_to_room(client.room, client.name + " 加入了观战");
...@@ -627,7 +645,7 @@ ...@@ -627,7 +645,7 @@
if (client.room.welcome) { if (client.room.welcome) {
ygopro.stoc_send_chat(client, client.room.welcome, 14); ygopro.stoc_send_chat(client, client.room.welcome, 14);
} }
if (settings.modules.post_start_watching && !client.room.watcher) { if (settings.modules.enable_halfway_watch && !client.room.watcher) {
client.room.watcher = watcher = net.connect(client.room.port, function() { client.room.watcher = watcher = net.connect(client.room.port, function() {
ygopro.ctos_send(watcher, 'PLAYER_INFO', { ygopro.ctos_send(watcher, 'PLAYER_INFO', {
name: "the Big Brother" name: "the Big Brother"
......
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