Commit 3eb58e51 authored by mercury233's avatar mercury233

add auto ban player

parent e12b29de
......@@ -5,6 +5,22 @@ spawn = require('child_process').spawn
spawnSync = require('child_process').spawnSync
ygopro = require './ygopro.js'
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'
log = bunyan.createLogger name: "mycard-room"
......@@ -35,6 +51,18 @@ class Room
@all = []
@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)->
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
return new Room(name)
@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
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]
......@@ -293,6 +325,7 @@ class Room
connect: (client)->
@players.push client
client.ip=client.remoteAddress
if @random_type
host_player=@get_host()
if host_player && (host_player != client)
......@@ -320,6 +353,9 @@ class Room
else
index = _.indexOf(@players, client)
@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
ygopro.stoc_send_chat_to_room this, "#{client.name} #{'离开了游戏'}#{if error then ": #{error}" else ''}"
#client.room = null
......
// Generated by CoffeeScript 1.10.0
(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');
......@@ -16,6 +16,26 @@
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');
log = bunyan.createLogger({
......@@ -45,6 +65,28 @@
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) {
var room;
if (settings.modules.enable_random_duel && (name === '' || name.toUpperCase() === 'S' || name.toUpperCase() === 'M' || name.toUpperCase() === 'T')) {
......@@ -60,7 +102,15 @@
};
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;
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];
......@@ -377,6 +427,7 @@
Room.prototype.connect = function(client) {
var host_player;
this.players.push(client);
client.ip = client.remoteAddress;
if (this.random_type) {
host_player = this.get_host();
if (host_player && (host_player !== client)) {
......@@ -413,6 +464,9 @@
if (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) {
ygopro.stoc_send_chat_to_room(this, client.name + " " + '离开了游戏' + (error ? ": " + error : ''));
} else {
......
......@@ -88,6 +88,7 @@ net.createServer (client) ->
server.on 'close', (had_error) ->
#log.info "server closed", client.name, had_error
tribute(server)
client.room.disconnector = 'server'
server.closed = true unless server.closed
unless client.closed
ygopro.stoc_send_chat(client, "服务器关闭了连接", 11)
......@@ -97,6 +98,7 @@ net.createServer (client) ->
server.on 'error', (error)->
#log.info "server error", client.name, error
tribute(server)
client.room.disconnector = 'server'
server.closed = error
unless client.closed
ygopro.stoc_send_chat(client, "服务器错误: #{error}", 11)
......@@ -298,23 +300,24 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
else
#log.info 'join_game',info.pass, client.name
client.room = Room.find_or_create_by_name(info.pass, client.remoteAddress)
if !client.room
room = Room.find_or_create_by_name(info.pass, client.remoteAddress)
if !room
ygopro.stoc_send_chat(client,"服务器已经爆满,请稍候再试", 11)
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if client.room.error
ygopro.stoc_send_chat(client,client.room.error,11)
else if room.error
ygopro.stoc_send_chat(client, room.error, 11)
ygopro.stoc_send client, 'ERROR_MSG',{
msg: 1
code: 2
}
client.end()
else if client.room.started
else if room.started
if settings.modules.post_start_watching
client.room=room
client.is_post_watcher = true
ygopro.stoc_send_chat_to_room client.room, "#{client.name} 加入了观战"
client.room.watchers.push client
......@@ -329,6 +332,7 @@ ygopro.ctos_follow 'JOIN_GAME', false, (buffer, info, client, server)->
}
client.end()
else
client.room=room
client.room.connect(client)
return
......
......@@ -109,6 +109,7 @@
});
server.on('close', function(had_error) {
tribute(server);
client.room.disconnector = 'server';
if (!server.closed) {
server.closed = true;
}
......@@ -119,6 +120,7 @@
});
server.on('error', function(error) {
tribute(server);
client.room.disconnector = 'server';
server.closed = error;
if (!client.closed) {
ygopro.stoc_send_chat(client, "服务器错误: " + error, 11);
......@@ -260,7 +262,7 @@
});
ygopro.ctos_follow('JOIN_GAME', false, function(buffer, info, client, server) {
var k, len, ref;
var k, len, ref, room;
if (settings.modules.stop) {
ygopro.stoc_send_chat(client, settings.modules.stop, 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
......@@ -313,23 +315,24 @@
});
client.end();
} else {
client.room = Room.find_or_create_by_name(info.pass, client.remoteAddress);
if (!client.room) {
room = Room.find_or_create_by_name(info.pass, client.remoteAddress);
if (!room) {
ygopro.stoc_send_chat(client, "服务器已经爆满,请稍候再试", 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
client.end();
} else if (client.room.error) {
ygopro.stoc_send_chat(client, client.room.error, 11);
} else if (room.error) {
ygopro.stoc_send_chat(client, room.error, 11);
ygopro.stoc_send(client, 'ERROR_MSG', {
msg: 1,
code: 2
});
client.end();
} else if (client.room.started) {
} else if (room.started) {
if (settings.modules.post_start_watching) {
client.room = room;
client.is_post_watcher = true;
ygopro.stoc_send_chat_to_room(client.room, client.name + " 加入了观战");
client.room.watchers.push(client);
......@@ -348,6 +351,7 @@
client.end();
}
} else {
client.room = room;
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