Commit 21ca68db authored by mercury233's avatar mercury233

cloud replay test2

parent 9d553918
......@@ -7,12 +7,13 @@
"stop": false,
"tips": "http://mercury233.me/ygosrv233tips.json",
"dialogues": "http://mercury233.me/ygosrv233/dialogues.json",
"redis_port": 6379,
"enable_websocket_roomlist": false,
"enable_random_duel": false,
"mycard_auth": false,
"post_start_watching": true,
"enable_halfway_watch": true,
"enable_TCG_as_default": false,
"enable_cloud_replay": false,
"redis_port": 6379,
"mycard_auth": false,
"http": {
"port": 7922,
"password": "123456",
......
......@@ -8,7 +8,6 @@ ygopro = require './ygopro.js'
roomlist = require './roomlist' if settings.modules.enable_websocket_roomlist
bunyan = require 'bunyan'
moment = require 'moment'
#redis = require 'redis'
moment.locale('zh-cn', {
relativeTime: {
future: '%s内',
......@@ -28,7 +27,11 @@ moment.locale('zh-cn', {
})
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 = ()->
......@@ -347,26 +350,34 @@ class Room
#积分
return if @deleted
#log.info 'room-delete', this.name, Room.all.length
###
if @player_datas.length
replay_buffer = Buffer.concat(@watcher_buffers).toString('binary')
if @player_datas.length and settings.modules.enable_cloud_replay
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=[]
(if @player_datas[1] then @player_datas[1].name else "AI") +
(if @player_datas[3] then "+" + @player_datas[3].name else "")
player_ips=[]
_.each @player_datas, (player)=>
return if _.contains(recorded_ip, player.ip)
recorded_ip.push player.ip
redisdb.lpush(player.ip+":replays", replay_id)
player_ips.push(player.ip)
return
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
###
@watcher_buffers = []
@players = []
@watcher.end() if @watcher
......
// Generated by CoffeeScript 1.10.0
(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');
......@@ -46,6 +46,15 @@
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() {
var actualFree, buffers, cached, free, line, lines, percentUsed, prc_free, total;
prc_free = spawnSync("free", []);
......@@ -448,31 +457,38 @@
}
Room.prototype["delete"] = function() {
var index;
var index, player_ips, player_names, watcher_buffer;
if (this.deleted) {
return;
}
/*
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
*/
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 : "");
player_ips = [];
_.each(this.player_datas, (function(_this) {
return function(player) {
player_ips.push(player.ip);
};
})(this));
watcher_buffer = Buffer.concat(this.watcher_buffers);
zlib.deflate(watcher_buffer, (function(_this) {
return function(err, replay_buffer) {
var date_time, recorded_ip, replay_id;
replay_buffer = replay_buffer.toString('binary');
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, function(player_ip) {
if (_.contains(recorded_ip, player_ip)) {
return;
}
recorded_ip.push(player_ip);
redisdb.lpush(player_ip + ":replays", replay_id);
});
};
})(this));
}
this.watcher_buffers = [];
this.players = [];
if (this.watcher) {
......
......@@ -19,9 +19,6 @@ bunyan = require 'bunyan'
moment = require 'moment'
#redis = require 'redis'
#redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#heapdump = require 'heapdump'
#配置文件
......@@ -35,6 +32,11 @@ settings.lflist = (for list in fs.readFileSync('ygopro/lflist.conf', 'utf8').mat
continue unless date
{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'
Room = require './room.js'
......@@ -118,22 +120,26 @@ net.createServer (client) ->
ygopro.stoc_send_chat(client, "服务器错误: #{error}", 11)
client.end()
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()
if settings.modules.enable_cloud_replay
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
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
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_buffer = new Buffer(0)
......@@ -273,8 +279,8 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
}
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)
redisdb.lrange client.remoteAddress+":replays", 0, 2, (err, result)=>
_.each result, (replay_id,id)=>
......@@ -291,7 +297,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
}
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]
if (replay_id>0 and replay_id<=3)
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)->
code: 2
}
client.end()
###
else if info.version != settings.version
ygopro.stoc_send_chat(client, settings.modules.update, 11)
......@@ -541,7 +547,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
}
client.end()
else if room.started
if settings.modules.post_start_watching
if settings.modules.enable_halfway_watch
client.room = room
client.is_post_watcher = true
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
......@@ -569,7 +575,7 @@ ygopro.stoc_follow 'JOIN_GAME', false, (buffer, info, client, server)->
if client.room.welcome
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, ->
ygopro.ctos_send watcher, 'PLAYER_INFO', {
name: "the Big Brother"
......
// Generated by CoffeeScript 1.10.0
(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');
......@@ -58,6 +58,15 @@
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');
Room = require('./room.js');
......@@ -159,23 +168,29 @@
client.end();
}
});
/*
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
if (settings.modules.enable_cloud_replay) {
client.open_cloud_replay = function(err, replay) {
var buffer;
if (err || !replay) {
ygopro.stoc_send_chat(client, "没有找到录像", 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
client.end();
return;
}
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
*/
redisdb.expire("replay:" + replay.replay_id, 60 * 60 * 48);
buffer = new Buffer(replay.replay_buffer, 'binary');
zlib.unzip(buffer, (function(_this) {
return function(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();
};
})(this));
};
}
ctos_buffer = new Buffer(0);
ctos_message_length = 0;
ctos_proto = 0;
......@@ -311,7 +326,7 @@
});
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) {
ygopro.stoc_send_chat(client, settings.modules.stop, 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
......@@ -319,41 +334,44 @@
code: 2
});
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
} else if (info.pass.toUpperCase() === "R" && settings.modules.enable_cloud_replay) {
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#" && settings.modules.enable_cloud_replay) {
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()
*/
});
client.end();
}
} else if (info.version !== settings.version) {
ygopro.stoc_send_chat(client, settings.modules.update, 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
......@@ -590,7 +608,7 @@
});
client.end();
} else if (room.started) {
if (settings.modules.post_start_watching) {
if (settings.modules.enable_halfway_watch) {
client.room = room;
client.is_post_watcher = true;
ygopro.stoc_send_chat_to_room(client.room, client.name + " 加入了观战");
......@@ -627,7 +645,7 @@
if (client.room.welcome) {
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() {
ygopro.ctos_send(watcher, 'PLAYER_INFO', {
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