Commit 3eb58e51 authored by mercury233's avatar mercury233

add auto ban player

parent e12b29de
...@@ -5,6 +5,22 @@ spawn = require('child_process').spawn ...@@ -5,6 +5,22 @@ spawn = require('child_process').spawn
spawnSync = require('child_process').spawnSync spawnSync = require('child_process').spawnSync
ygopro = require './ygopro.js' ygopro = require './ygopro.js'
bunyan = require 'bunyan' bunyan = require 'bunyan'
moment = require 'moment'
moment.locale('zh-cn', { relativeTime : {
future : '%s内',
past : '%s前',
s : '%d秒',
m : '1分钟',
mm : '%d分钟',
h : '1小时',
hh : '%d小时',
d : '1天',
dd : '%d天',
M : '1个月',
MM : '%d个月',
y : '1年',
yy : '%d年'
}})
settings = require './config.json' settings = require './config.json'
log = bunyan.createLogger name: "mycard-room" log = bunyan.createLogger name: "mycard-room"
...@@ -35,6 +51,18 @@ class Room ...@@ -35,6 +51,18 @@ class Room
@all = [] @all = []
@players_oppentlist = {} @players_oppentlist = {}
@players_banned = []
@ban_player: (name, ip, reason)->
log.info("banned", name, ip, reason)
bannedplayer = _.find Room.players_banned, (bannedplayer)->
ip==bannedplayer.ip
if bannedplayer
bannedplayer.time=moment(bannedplayer.time).add(Math.pow(2,bannedplayer.count)*30,'s')
bannedplayer.count=bannedplayer.count+1
bannedplayer.reason=reason
else
Room.players_banned.push {"ip": ip, "time": moment().add(30, 's'), "count": 1, "reason": reason}
@find_or_create_by_name: (name, player_ip)-> @find_or_create_by_name: (name, player_ip)->
if settings.modules.enable_random_duel and (name == '' or name.toUpperCase() == 'S' or name.toUpperCase() == 'M' or name.toUpperCase() == 'T') if settings.modules.enable_random_duel and (name == '' or name.toUpperCase() == 'S' or name.toUpperCase() == 'M' or name.toUpperCase() == 'T')
...@@ -47,6 +75,10 @@ class Room ...@@ -47,6 +75,10 @@ class Room
return new Room(name) return new Room(name)
@find_or_create_random: (type, player_ip)-> @find_or_create_random: (type, player_ip)->
bannedplayer = _.find Room.players_banned, (bannedplayer)->
return player_ip==bannedplayer.ip
if bannedplayer and moment()<bannedplayer.time
return {"error":"因为您在近期游戏中#{bannedplayer.reason},您已被禁止使用随机对战功能,将在#{moment(bannedplayer.time).fromNow(true)}后解封"}
max_player = if type == 'T' then 4 else 2 max_player = if type == 'T' then 4 else 2
result = _.find @all, (room)-> result = _.find @all, (room)->
room.random_type != '' and !room.started and ((type == '' and room.random_type != 'T') or room.random_type == type) and room.get_playing_player().length < max_player and room.get_host().remoteAddress != Room.players_oppentlist[player_ip] room.random_type != '' and !room.started and ((type == '' and room.random_type != 'T') or room.random_type == type) and room.get_playing_player().length < max_player and room.get_host().remoteAddress != Room.players_oppentlist[player_ip]
...@@ -293,6 +325,7 @@ class Room ...@@ -293,6 +325,7 @@ class Room
connect: (client)-> connect: (client)->
@players.push client @players.push client
client.ip=client.remoteAddress
if @random_type if @random_type
host_player=@get_host() host_player=@get_host()
if host_player && (host_player != client) if host_player && (host_player != client)
...@@ -320,6 +353,9 @@ class Room ...@@ -320,6 +353,9 @@ class Room
else else
index = _.indexOf(@players, client) index = _.indexOf(@players, client)
@players.splice(index, 1) unless index == -1 @players.splice(index, 1) unless index == -1
#log.info(@started,@disconnector,client.room.random_type)
if @started and @disconnector!='server' and client.room.random_type
Room.ban_player(client.name, client.ip, "强退")
if @players.length if @players.length
ygopro.stoc_send_chat_to_room this, "#{client.name} #{'离开了游戏'}#{if error then ": #{error}" else ''}" ygopro.stoc_send_chat_to_room this, "#{client.name} #{'离开了游戏'}#{if error then ": #{error}" else ''}"
#client.room = null #client.room = null
......
// Generated by CoffeeScript 1.10.0 // Generated by CoffeeScript 1.10.0
(function() { (function() {
var Room, _, bunyan, get_memory_usage, log, settings, spawn, spawnSync, ygopro; var Room, _, bunyan, get_memory_usage, log, moment, settings, spawn, spawnSync, ygopro;
_ = require('underscore'); _ = require('underscore');
...@@ -16,6 +16,26 @@ ...@@ -16,6 +16,26 @@
bunyan = require('bunyan'); bunyan = require('bunyan');
moment = require('moment');
moment.locale('zh-cn', {
relativeTime: {
future: '%s内',
past: '%s前',
s: '%d秒',
m: '1分钟',
mm: '%d分钟',
h: '1小时',
hh: '%d小时',
d: '1天',
dd: '%d天',
M: '1个月',
MM: '%d个月',
y: '1年',
yy: '%d年'
}
});
settings = require('./config.json'); settings = require('./config.json');
log = bunyan.createLogger({ log = bunyan.createLogger({
...@@ -45,6 +65,28 @@ ...@@ -45,6 +65,28 @@
Room.players_oppentlist = {}; Room.players_oppentlist = {};
Room.players_banned = [];
Room.ban_player = function(name, ip, reason) {
var bannedplayer;
log.info("banned", name, ip, reason);
bannedplayer = _.find(Room.players_banned, function(bannedplayer) {
return ip === bannedplayer.ip;
});
if (bannedplayer) {
bannedplayer.time = moment(bannedplayer.time).add(Math.pow(2, bannedplayer.count) * 30, 's');
bannedplayer.count = bannedplayer.count + 1;
return bannedplayer.reason = reason;
} else {
return Room.players_banned.push({
"ip": ip,
"time": moment().add(30, 's'),
"count": 1,
"reason": reason
});
}
};
Room.find_or_create_by_name = function(name, player_ip) { Room.find_or_create_by_name = function(name, player_ip) {
var room; var room;
if (settings.modules.enable_random_duel && (name === '' || name.toUpperCase() === 'S' || name.toUpperCase() === 'M' || name.toUpperCase() === 'T')) { if (settings.modules.enable_random_duel && (name === '' || name.toUpperCase() === 'S' || name.toUpperCase() === 'M' || name.toUpperCase() === 'T')) {
...@@ -60,7 +102,15 @@ ...@@ -60,7 +102,15 @@
}; };
Room.find_or_create_random = function(type, player_ip) { Room.find_or_create_random = function(type, player_ip) {
var max_player, name, result; var bannedplayer, max_player, name, result;
bannedplayer = _.find(Room.players_banned, function(bannedplayer) {
return player_ip === bannedplayer.ip;
});
if (bannedplayer && moment() < bannedplayer.time) {
return {
"error": "因为您在近期游戏中" + bannedplayer.reason + ",您已被禁止使用随机对战功能,将在" + (moment(bannedplayer.time).fromNow(true)) + "后解封"
};
}
max_player = type === 'T' ? 4 : 2; max_player = type === 'T' ? 4 : 2;
result = _.find(this.all, function(room) { result = _.find(this.all, function(room) {
return room.random_type !== '' && !room.started && ((type === '' && room.random_type !== 'T') || room.random_type === type) && room.get_playing_player().length < max_player && room.get_host().remoteAddress !== Room.players_oppentlist[player_ip]; return room.random_type !== '' && !room.started && ((type === '' && room.random_type !== 'T') || room.random_type === type) && room.get_playing_player().length < max_player && room.get_host().remoteAddress !== Room.players_oppentlist[player_ip];
...@@ -377,6 +427,7 @@ ...@@ -377,6 +427,7 @@
Room.prototype.connect = function(client) { Room.prototype.connect = function(client) {
var host_player; var host_player;
this.players.push(client); this.players.push(client);
client.ip = client.remoteAddress;
if (this.random_type) { if (this.random_type) {
host_player = this.get_host(); host_player = this.get_host();
if (host_player && (host_player !== client)) { if (host_player && (host_player !== client)) {
...@@ -413,6 +464,9 @@ ...@@ -413,6 +464,9 @@
if (index !== -1) { if (index !== -1) {
this.players.splice(index, 1); this.players.splice(index, 1);
} }
if (this.started && this.disconnector !== 'server' && client.room.random_type) {
Room.ban_player(client.name, client.ip, "强退");
}
if (this.players.length) { if (this.players.length) {
ygopro.stoc_send_chat_to_room(this, client.name + " " + '离开了游戏' + (error ? ": " + error : '')); ygopro.stoc_send_chat_to_room(this, client.name + " " + '离开了游戏' + (error ? ": " + error : ''));
} else { } else {
......
...@@ -88,6 +88,7 @@ net.createServer (client) -> ...@@ -88,6 +88,7 @@ net.createServer (client) ->
server.on 'close', (had_error) -> server.on 'close', (had_error) ->
#log.info "server closed", client.name, had_error #log.info "server closed", client.name, had_error
tribute(server) tribute(server)
client.room.disconnector = 'server'
server.closed = true unless server.closed server.closed = true unless server.closed
unless client.closed unless client.closed
ygopro.stoc_send_chat(client, "服务器关闭了连接", 11) ygopro.stoc_send_chat(client, "服务器关闭了连接", 11)
...@@ -97,6 +98,7 @@ net.createServer (client) -> ...@@ -97,6 +98,7 @@ net.createServer (client) ->
server.on 'error', (error)-> server.on 'error', (error)->
#log.info "server error", client.name, error #log.info "server error", client.name, error
tribute(server) tribute(server)
client.room.disconnector = 'server'
server.closed = error server.closed = error
unless client.closed unless client.closed
ygopro.stoc_send_chat(client, "服务器错误: #{error}", 11) ygopro.stoc_send_chat(client, "服务器错误: #{error}", 11)
...@@ -298,23 +300,24 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -298,23 +300,24 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else else
#log.info 'join_game',info.pass, client.name #log.info 'join_game',info.pass, client.name
client.room = Room.find_or_create_by_name(info.pass, client.remoteAddress) room = Room.find_or_create_by_name(info.pass, client.remoteAddress)
if !client.room if !room
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() client.end()
else if client.room.error else if room.error
ygopro.stoc_send_chat(client,client.room.error,11) ygopro.stoc_send_chat(client, room.error, 11)
ygopro.stoc_send client, 'ERROR_MSG',{ ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1 msg: 1
code: 2 code: 2
} }
client.end() client.end()
else if client.room.started else if room.started
if settings.modules.post_start_watching if settings.modules.post_start_watching
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} 加入了观战"
client.room.watchers.push client client.room.watchers.push client
...@@ -329,6 +332,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)-> ...@@ -329,6 +332,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
} }
client.end() client.end()
else else
client.room=room
client.room.connect(client) client.room.connect(client)
return return
......
...@@ -109,6 +109,7 @@ ...@@ -109,6 +109,7 @@
}); });
server.on('close', function(had_error) { server.on('close', function(had_error) {
tribute(server); tribute(server);
client.room.disconnector = 'server';
if (!server.closed) { if (!server.closed) {
server.closed = true; server.closed = true;
} }
...@@ -119,6 +120,7 @@ ...@@ -119,6 +120,7 @@
}); });
server.on('error', function(error) { server.on('error', function(error) {
tribute(server); tribute(server);
client.room.disconnector = 'server';
server.closed = error; server.closed = error;
if (!client.closed) { if (!client.closed) {
ygopro.stoc_send_chat(client, "服务器错误: " + error, 11); ygopro.stoc_send_chat(client, "服务器错误: " + error, 11);
...@@ -260,7 +262,7 @@ ...@@ -260,7 +262,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; var k, len, ref, 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', {
...@@ -313,23 +315,24 @@ ...@@ -313,23 +315,24 @@
}); });
client.end(); client.end();
} else { } else {
client.room = Room.find_or_create_by_name(info.pass, client.remoteAddress); room = Room.find_or_create_by_name(info.pass, client.remoteAddress);
if (!client.room) { if (!room) {
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(); client.end();
} else if (client.room.error) { } else if (room.error) {
ygopro.stoc_send_chat(client, client.room.error, 11); ygopro.stoc_send_chat(client, room.error, 11);
ygopro.stoc_send(client, 'ERROR_MSG', { ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1, msg: 1,
code: 2 code: 2
}); });
client.end(); client.end();
} else if (client.room.started) { } else if (room.started) {
if (settings.modules.post_start_watching) { if (settings.modules.post_start_watching) {
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 + " 加入了观战");
client.room.watchers.push(client); client.room.watchers.push(client);
...@@ -348,6 +351,7 @@ ...@@ -348,6 +351,7 @@
client.end(); client.end();
} }
} else { } else {
client.room = room;
client.room.connect(client); client.room.connect(client);
} }
} }
......
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