Commit 2a6e56ee authored by mercury233's avatar mercury233

add cloud replay

parent 6d2b3034
{
"port": 233,
"version": 4918,
"ygopro_path": "ygocore",
"version": 4920,
"ygopro_path": "ygopro",
"modules": {
"welcome": "YGOPRO Server",
"update": "请更新游戏版本",
"stop": false,
"tips": "http://mercury233.me/ygosrv233/tips.json",
"dialogues": "http://mercury233.me/ygosrv233/dialogues.json",
"redis_port": 6379,
"enable_random_duel": false,
"post_start_watching": true,
"TCG_banlist_id": 8,
......
......@@ -6,6 +6,7 @@ spawnSync = require('child_process').spawnSync
ygopro = require './ygopro.js'
bunyan = require 'bunyan'
moment = require 'moment'
redis = require 'redis'
moment.locale('zh-cn', { relativeTime : {
future : '%s内',
past : '%s前',
......@@ -24,6 +25,7 @@ moment.locale('zh-cn', { relativeTime : {
settings = require './config.json'
log = bunyan.createLogger name: "mycard-room"
redisdb = redis.createClient host: "127.0.0.1", port: settings.modules.redis_port
#获取可用内存
get_memory_usage = ()->
......@@ -136,6 +138,7 @@ class Room
@name = name
@alive = true
@players = []
@player_datas = []
@status = 'starting'
@started = false
@established = false
......@@ -320,6 +323,24 @@ 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')
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 = []
@players = []
@watcher.end() if @watcher
......
// Generated by CoffeeScript 1.10.0
(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');
......@@ -18,6 +18,8 @@
moment = require('moment');
redis = require('redis');
moment.locale('zh-cn', {
relativeTime: {
future: '%s内',
......@@ -42,6 +44,11 @@
name: "mycard-room"
});
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", []);
......@@ -189,6 +196,7 @@
this.name = name;
this.alive = true;
this.players = [];
this.player_datas = [];
this.status = 'starting';
this.started = false;
this.established = false;
......@@ -411,10 +419,27 @@
}
Room.prototype["delete"] = function() {
var index;
var date_time, index, player_names, recorded_ip, replay_buffer, replay_id;
if (this.deleted) {
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.players = [];
if (this.watcher) {
......
......@@ -18,6 +18,9 @@ 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'
#配置文件
......@@ -107,7 +110,22 @@ 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()
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)
......@@ -245,7 +263,41 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
msg: 1
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, (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
ygopro.stoc_send_chat(client,settings.modules.update, 11)
......@@ -530,6 +582,7 @@ ygopro.stoc_follow 'DUEL_START', false, (buffer, info, client, server)->
client.room.dueling_players = []
for player in client.room.players when player.pos != 7
client.room.dueling_players[player.pos] = player
client.room.player_datas.push ip:player.remoteAddress, name:player.name
if settings.modules.tips
ygopro.stoc_send_random_tip(client)
return
......@@ -562,7 +615,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server)->
when '/roomname'
ygopro.stoc_send_chat(client,"您当前的房间名是 " + client.room.name) if client.room
when '/test'
ygopro.stoc_send_hint_card_to_room(client.room, 2333365)
......
// Generated by CoffeeScript 1.10.0
(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');
......@@ -28,6 +28,13 @@
moment = require('moment');
redis = require('redis');
redisdb = redis.createClient({
host: "127.0.0.1",
port: settings.modules.redis_port
});
settings = require('./config.json');
settings.BANNED_user = [];
......@@ -131,6 +138,22 @@
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_message_length = 0;
ctos_proto = 0;
......@@ -266,7 +289,7 @@
});
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) {
ygopro.stoc_send_chat(client, settings.modules.stop, 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
......@@ -274,6 +297,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, (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) {
ygopro.stoc_send_chat(client, settings.modules.update, 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
......@@ -612,9 +673,14 @@
ref = client.room.players;
for (k = 0, len = ref.length; k < len; k++) {
player = ref[k];
if (player.pos !== 7) {
client.room.dueling_players[player.pos] = player;
if (!(player.pos !== 7)) {
continue;
}
client.room.dueling_players[player.pos] = player;
client.room.player_datas.push({
ip: player.remoteAddress,
name: player.name
});
}
}
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