Commit 693361fd authored by nanahira's avatar nanahira

random duel ban

parent c8b15204
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
jsconfig.json jsconfig.json
coffeelint.json coffeelint.json
.vscode/ .vscode/
.idea
password.json password.json
config.*.json config.*.json
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
jsconfig.json jsconfig.json
coffeelint.json coffeelint.json
.vscode/ .vscode/
.idea
password.json password.json
config.*.json config.*.json
......
...@@ -9,6 +9,8 @@ const typeorm_1 = require("typeorm"); ...@@ -9,6 +9,8 @@ const typeorm_1 = require("typeorm");
const CloudReplay_1 = require("./entities/CloudReplay"); const CloudReplay_1 = require("./entities/CloudReplay");
const CloudReplayPlayer_1 = require("./entities/CloudReplayPlayer"); const CloudReplayPlayer_1 = require("./entities/CloudReplayPlayer");
const Ban_1 = require("./entities/Ban"); const Ban_1 = require("./entities/Ban");
const RandomDuelBan_1 = require("./entities/RandomDuelBan");
const underscore_1 = __importDefault(require("underscore"));
class DataManager { class DataManager {
constructor(config, log) { constructor(config, log) {
this.config = config; this.config = config;
...@@ -125,6 +127,62 @@ class DataManager { ...@@ -125,6 +127,62 @@ class DataManager {
return null; return null;
} }
} }
async getRandomDuelBan(ip) {
const repo = this.db.getRepository(RandomDuelBan_1.RandomDuelBan);
try {
const ban = await repo.findOne(ip);
//console.log(ip, ban);
return ban;
}
catch (e) {
this.log.warn(`Failed to fetch random duel ban ${ip}: ${e.toString()}`);
return null;
}
}
async updateRandomDuelBan(ban) {
const repo = this.db.getRepository(RandomDuelBan_1.RandomDuelBan);
try {
await repo.save(ban);
}
catch (e) {
this.log.warn(`Failed to update random duel ban ${ban.ip}: ${e.toString()}`);
}
}
async randomDuelBanPlayer(ip, reason, countadd) {
const count = countadd || 1;
const repo = this.db.getRepository(RandomDuelBan_1.RandomDuelBan);
try {
let ban = await repo.findOne(ip);
if (ban) {
ban.count += count;
const banTime = ban.count > 3 ? Math.pow(2, ban.count - 3) * 2 : 0;
const banDate = moment_1.default(ban.time);
if (moment_1.default().isAfter(banDate)) {
ban.time = moment_1.default().add(banTime, 'm').toDate();
}
else {
ban.time = moment_1.default(banDate).add(banTime, 'm').toDate();
}
if (!underscore_1.default.contains(ban.reasons, reason)) {
ban.reasons.push(reason);
}
ban.needTip = 1;
}
else {
ban = new RandomDuelBan_1.RandomDuelBan();
ban.ip = ip;
ban.time = moment_1.default().toDate();
ban.count = count;
ban.reasons = [reason];
ban.needTip = 1;
}
return await repo.save(ban);
}
catch (e) {
this.log.warn(`Failed to update random duel ban ${ip}: ${e.toString()}`);
return null;
}
}
} }
exports.DataManager = DataManager; exports.DataManager = DataManager;
//# sourceMappingURL=DataManager.js.map //# sourceMappingURL=DataManager.js.map
\ No newline at end of file
...@@ -5,6 +5,8 @@ import { Connection, ConnectionOptions, createConnection, Transaction } from "ty ...@@ -5,6 +5,8 @@ import { Connection, ConnectionOptions, createConnection, Transaction } from "ty
import { CloudReplay } from "./entities/CloudReplay"; import { CloudReplay } from "./entities/CloudReplay";
import { CloudReplayPlayer } from "./entities/CloudReplayPlayer"; import { CloudReplayPlayer } from "./entities/CloudReplayPlayer";
import { Ban } from "./entities/Ban"; import { Ban } from "./entities/Ban";
import {RandomDuelBan} from "./entities/RandomDuelBan";
import _ from "underscore";
export interface CloudReplayPlayerInfo { export interface CloudReplayPlayerInfo {
...@@ -134,4 +136,59 @@ export class DataManager { ...@@ -134,4 +136,59 @@ export class DataManager {
return null; return null;
} }
} }
async getRandomDuelBan(ip: string) {
const repo = this.db.getRepository(RandomDuelBan);
try {
const ban = await repo.findOne(ip);
//console.log(ip, ban);
return ban;
} catch (e) {
this.log.warn(`Failed to fetch random duel ban ${ip}: ${e.toString()}`);
return null;
}
}
async updateRandomDuelBan(ban: RandomDuelBan) {
const repo = this.db.getRepository(RandomDuelBan);
try {
await repo.save(ban);
} catch (e) {
this.log.warn(`Failed to update random duel ban ${ban.ip}: ${e.toString()}`);
}
}
async randomDuelBanPlayer(ip: string, reason: string, countadd?: number){
const count = countadd || 1;
const repo = this.db.getRepository(RandomDuelBan);
try {
let ban = await repo.findOne(ip);
if(ban) {
ban.count += count;
const banTime = ban.count > 3 ? Math.pow(2, ban.count - 3) * 2 : 0;
const banDate = moment(ban.time);
if(moment().isAfter(banDate)) {
ban.time = moment().add(banTime, 'm').toDate();
} else {
ban.time = moment(banDate).add(banTime, 'm').toDate();
}
if(!_.contains(ban.reasons, reason)) {
ban.reasons.push(reason);
}
ban.needTip = 1;
} else {
ban = new RandomDuelBan();
ban.ip = ip;
ban.time = moment().toDate();
ban.count = count;
ban.reasons = [reason];
ban.needTip = 1;
}
return await repo.save(ban);
} catch (e) {
this.log.warn(`Failed to update random duel ban ${ip}: ${e.toString()}`);
return null;
}
}
} }
"use strict";
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.RandomDuelBan = void 0;
const typeorm_1 = require("typeorm");
let RandomDuelBan = /** @class */ (() => {
let RandomDuelBan = class RandomDuelBan {
setNeedTip(need) {
this.needTip = need ? 1 : 0;
}
getNeedTip() {
return this.needTip > 0 ? true : false;
}
};
__decorate([
typeorm_1.PrimaryColumn({ type: "varchar", length: 64 }),
__metadata("design:type", String)
], RandomDuelBan.prototype, "ip", void 0);
__decorate([
typeorm_1.Column("datetime"),
__metadata("design:type", Date)
], RandomDuelBan.prototype, "time", void 0);
__decorate([
typeorm_1.Column("smallint"),
__metadata("design:type", Number)
], RandomDuelBan.prototype, "count", void 0);
__decorate([
typeorm_1.Column({ type: "simple-array" }),
__metadata("design:type", Array)
], RandomDuelBan.prototype, "reasons", void 0);
__decorate([
typeorm_1.Column({ type: "tinyint", unsigned: true }),
__metadata("design:type", Number)
], RandomDuelBan.prototype, "needTip", void 0);
RandomDuelBan = __decorate([
typeorm_1.Entity()
], RandomDuelBan);
return RandomDuelBan;
})();
exports.RandomDuelBan = RandomDuelBan;
//# sourceMappingURL=RandomDuelBan.js.map
\ No newline at end of file
import {Column, Entity, PrimaryColumn} from "typeorm";
@Entity()
export class RandomDuelBan {
@PrimaryColumn({type: "varchar", length: 64})
ip: string;
@Column("datetime")
time: Date;
@Column("smallint")
count: number;
@Column({type: "simple-array"})
reasons: string[]
@Column({type: "tinyint", unsigned: true})
needTip: number;
setNeedTip(need: boolean) {
this.needTip = need ? 1 : 0;
}
getNeedTip() {
return this.needTip > 0 ? true : false;
}
}
\ No newline at end of file
...@@ -479,11 +479,8 @@ get_memory_usage = get_memory_usage = ()-> ...@@ -479,11 +479,8 @@ get_memory_usage = get_memory_usage = ()->
get_memory_usage() get_memory_usage()
setInterval(get_memory_usage, 3000) setInterval(get_memory_usage, 3000)
Cloud_replay_ids = global.Cloud_replay_ids = []
ROOM_all = global.ROOM_all = [] ROOM_all = global.ROOM_all = []
ROOM_players_oppentlist = global.ROOM_players_oppentlist = {} ROOM_players_oppentlist = global.ROOM_players_oppentlist = {}
ROOM_players_banned = global.ROOM_players_banned = []
ROOM_players_scores = global.ROOM_players_scores = {} ROOM_players_scores = global.ROOM_players_scores = {}
ROOM_connected_ip = global.ROOM_connected_ip = {} ROOM_connected_ip = global.ROOM_connected_ip = {}
ROOM_bad_ip = global.ROOM_bad_ip = {} ROOM_bad_ip = global.ROOM_bad_ip = {}
...@@ -507,20 +504,8 @@ ban_user = global.ban_user = (name) -> ...@@ -507,20 +504,8 @@ ban_user = global.ban_user = (name) ->
# automatically ban user to use random duel # automatically ban user to use random duel
ROOM_ban_player = global.ROOM_ban_player = (name, ip, reason, countadd = 1)-> ROOM_ban_player = global.ROOM_ban_player = (name, ip, reason, countadd = 1)->
return if settings.modules.test_mode.no_ban_player return if settings.modules.test_mode.no_ban_player or !settings.modules.mysql.enabled
bannedplayer = _.find ROOM_players_banned, (bannedplayer)-> await dataManager.randomDuelBanPlayer(ip, reason, countadd)
ip == bannedplayer.ip
if bannedplayer
bannedplayer.count = bannedplayer.count + countadd
bantime = if bannedplayer.count > 3 then Math.pow(2, bannedplayer.count - 3) * 2 else 0
bannedplayer.time = if moment() < bannedplayer.time then moment(bannedplayer.time).add(bantime, 'm') else moment().add(bantime, 'm')
bannedplayer.reasons.push(reason) if not _.find bannedplayer.reasons, (bannedreason)->
bannedreason == reason
bannedplayer.need_tip = true
else
bannedplayer = {"ip": ip, "time": moment(), "count": countadd, "reasons": [reason], "need_tip": true}
ROOM_players_banned.push(bannedplayer)
#log.info("banned", name, ip, reason, bannedplayer.count)
return return
ROOM_kick = (name, callback)-> ROOM_kick = (name, callback)->
...@@ -601,7 +586,7 @@ ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player ...@@ -601,7 +586,7 @@ ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player
if settings.modules.windbot.enabled and (uname[0...2] == 'AI' or (!settings.modules.random_duel.enabled and uname == '')) if settings.modules.windbot.enabled and (uname[0...2] == 'AI' or (!settings.modules.random_duel.enabled and uname == ''))
return ROOM_find_or_create_ai(name) return ROOM_find_or_create_ai(name)
if settings.modules.random_duel.enabled and (uname == '' or uname == 'S' or uname == 'M' or uname == 'T') if settings.modules.random_duel.enabled and (uname == '' or uname == 'S' or uname == 'M' or uname == 'T')
return ROOM_find_or_create_random(uname, player_ip) return await ROOM_find_or_create_random(uname, player_ip)
if room = ROOM_find_by_name(name) if room = ROOM_find_by_name(name)
return room return room
else if memory_usage >= 90 else if memory_usage >= 90
...@@ -610,21 +595,24 @@ ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player ...@@ -610,21 +595,24 @@ ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = (name, player
return new Room(name) return new Room(name)
ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_ip)-> ROOM_find_or_create_random = global.ROOM_find_or_create_random = (type, player_ip)->
bannedplayer = _.find ROOM_players_banned, (bannedplayer)-> if settings.modules.mysql.enabled
return player_ip == bannedplayer.ip randomDuelBanRecord = await dataManager.getRandomDuelBan(player_ip)
if bannedplayer if randomDuelBanRecord
if bannedplayer.count > 6 and moment() < bannedplayer.time if randomDuelBanRecord.count > 6 and moment().isBefore(randomDuelBanRecord.time)
return {"error": "${random_banned_part1}#{bannedplayer.reasons.join('${random_ban_reason_separator}')}${random_banned_part2}#{moment(bannedplayer.time).fromNow(true)}${random_banned_part3}"} return {"error": "${random_banned_part1}#{randomDuelBanRecord.reasons.join('${random_ban_reason_separator}')}${random_banned_part2}#{moment(randomDuelBanRecord.time).fromNow(true)}${random_banned_part3}"}
if bannedplayer.count > 3 and moment() < bannedplayer.time and bannedplayer.need_tip and type != 'T' if randomDuelBanRecord.count > 3 and moment().isBefore(randomDuelBanRecord.time) and randomDuelBanRecord.getNeedTip() and type != 'T'
bannedplayer.need_tip = false randomDuelBanRecord.setNeedTip(false)
return {"error": "${random_deprecated_part1}#{bannedplayer.reasons.join('${random_ban_reason_separator}')}${random_deprecated_part2}#{moment(bannedplayer.time).fromNow(true)}${random_deprecated_part3}"} await dataManager.updateRandomDuelBan(randomDuelBanRecord)
else if bannedplayer.need_tip return {"error": "${random_deprecated_part1}#{randomDuelBanRecord.reasons.join('${random_ban_reason_separator}')}${random_deprecated_part2}#{moment(randomDuelBanRecord.time).fromNow(true)}${random_deprecated_part3}"}
bannedplayer.need_tip = false else if randomDuelBanRecord.getNeedTip()
return {"error": "${random_warn_part1}#{bannedplayer.reasons.join('${random_ban_reason_separator}')}${random_warn_part2}"} randomDuelBanRecord.setNeedTip(false)
else if bannedplayer.count > 2 await dataManager.updateRandomDuelBan(randomDuelBanRecord)
bannedplayer.need_tip = true return {"error": "${random_warn_part1}#{randomDuelBanRecord.reasons.join('${random_ban_reason_separator}')}${random_warn_part2}"}
else if randomDuelBanRecord.count > 2
randomDuelBanRecord.setNeedTip(true)
await dataManager.updateRandomDuelBan(randomDuelBanRecord)
max_player = if type == 'T' then 4 else 2 max_player = if type == 'T' then 4 else 2
playerbanned = (bannedplayer and bannedplayer.count > 3 and moment() < bannedplayer.time) playerbanned = (randomDuelBanRecord and randomDuelBanRecord.count > 3 and moment() < randomDuelBanRecord.time)
result = _.find ROOM_all, (room)-> result = _.find ROOM_all, (room)->
return room and room.random_type != '' and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and !room.windbot and return room and room.random_type != '' and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and !room.windbot and
((type == '' and ((type == '' and
...@@ -2013,7 +2001,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2013,7 +2001,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
if match_permit and !match_permit.permit if match_permit and !match_permit.permit
ygopro.stoc_die(client, '${invalid_password_unauthorized}') ygopro.stoc_die(client, '${invalid_password_unauthorized}')
return return
room = ROOM_find_or_create_by_name('M#' + info.pass.slice(8)) room = await ROOM_find_or_create_by_name('M#' + info.pass.slice(8))
if room if room
for player in room.get_playing_player() when player and player.name == client.name for player in room.get_playing_player() when player and player.name == client.name
ygopro.stoc_die(client, '${invalid_password_unauthorized}') ygopro.stoc_die(client, '${invalid_password_unauthorized}')
...@@ -2211,7 +2199,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2211,7 +2199,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
create_room_name = 'M#' + found.id create_room_name = 'M#' + found.id
if recover_match if recover_match
create_room_name = recover_match[0] + ',' + create_room_name create_room_name = recover_match[0] + ',' + create_room_name
room = ROOM_find_or_create_by_name(create_room_name) room = await ROOM_find_or_create_by_name(create_room_name)
if room if room
room.challonge_info = found room.challonge_info = found
# room.max_player = 2 # room.max_player = 2
...@@ -2297,7 +2285,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)-> ...@@ -2297,7 +2285,7 @@ ygopro.ctos_follow 'JOIN_GAME', true, (buffer, info, client, server, datas)->
buffer = struct.buffer buffer = struct.buffer
#log.info 'join_game',info.pass, client.name #log.info 'join_game',info.pass, client.name
room = ROOM_find_or_create_by_name(info.pass, client.ip) room = await ROOM_find_or_create_by_name(info.pass, client.ip)
if !room if !room
ygopro.stoc_die(client, "${server_full}") ygopro.stoc_die(client, "${server_full}")
else if room.error else if room.error
...@@ -2741,7 +2729,7 @@ ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server, datas)-> ...@@ -2741,7 +2729,7 @@ ygopro.ctos_follow 'HS_KICK', true, (buffer, info, client, server, datas)->
client.kick_count = if client.kick_count then client.kick_count+1 else 1 client.kick_count = if client.kick_count then client.kick_count+1 else 1
if client.kick_count>=5 and room.random_type if client.kick_count>=5 and room.random_type
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${kicked_by_system}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{client.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}") await ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}")
CLIENT_kick(client) CLIENT_kick(client)
return true return true
ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_player}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_player}", ygopro.constants.COLORS.RED)
...@@ -2856,7 +2844,7 @@ wait_room_start = (room, time)-> ...@@ -2856,7 +2844,7 @@ wait_room_start = (room, time)->
else else
for player in room.players for player in room.players
if player and player.is_host if player and player.is_host
ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}") await ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}")
ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
CLIENT_kick(player) CLIENT_kick(player)
await return await return
...@@ -3119,8 +3107,8 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3119,8 +3107,8 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
cancel = true cancel = true
if client.abuse_count>0 if client.abuse_count>0
ygopro.stoc_send_chat(client, "${banned_duel_tip}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat(client, "${banned_duel_tip}", ygopro.constants.COLORS.RED)
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}") await ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}")
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}", 3) await ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}", 3)
CLIENT_send_replays(client, room) CLIENT_send_replays(client, room)
CLIENT_kick(client) CLIENT_kick(client)
return true return true
...@@ -3174,7 +3162,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)-> ...@@ -3174,7 +3162,7 @@ ygopro.ctos_follow 'CHAT', true, (buffer, info, client, server, datas)->
ROOM_unwelcome(room, client, "${random_ban_reason_abuse}") ROOM_unwelcome(room, client, "${random_ban_reason_abuse}")
if client.abuse_count>=5 if client.abuse_count>=5
ygopro.stoc_send_chat_to_room(room, "#{client.name} ${chat_banned}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{client.name} ${chat_banned}", ygopro.constants.COLORS.RED)
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}") await ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}")
if !cancel and settings.modules.display_watchers and client.is_post_watcher if !cancel and settings.modules.display_watchers and client.is_post_watcher
ygopro.stoc_send_chat_to_room(room, "#{client.name}: #{msg}", 9) ygopro.stoc_send_chat_to_room(room, "#{client.name}: #{msg}", 9)
return true return true
...@@ -3484,8 +3472,6 @@ ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server, datas)-> ...@@ -3484,8 +3472,6 @@ ygopro.stoc_follow 'CHANGE_SIDE', false, (buffer, info, client, server, datas)->
ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)-> ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)->
room=ROOM_all[client.rid] room=ROOM_all[client.rid]
return settings.modules.tournament_mode.enabled and settings.modules.tournament_mode.block_replay_to_player or settings.modules.replay_delay unless room return settings.modules.tournament_mode.enabled and settings.modules.tournament_mode.block_replay_to_player or settings.modules.replay_delay unless room
if settings.modules.cloud_replay.enabled and room.random_type
Cloud_replay_ids.push room.cloud_replay_id
if !room.replays[room.duel_count - 1] if !room.replays[room.duel_count - 1]
# console.log("Replay saved: ", room.duel_count - 1, client.pos) # console.log("Replay saved: ", room.duel_count - 1, client.pos)
room.replays[room.duel_count - 1] = buffer room.replays[room.duel_count - 1] = buffer
...@@ -3534,15 +3520,12 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)-> ...@@ -3534,15 +3520,12 @@ ygopro.stoc_follow 'REPLAY', true, (buffer, info, client, server, datas)->
if settings.modules.random_duel.enabled if settings.modules.random_duel.enabled
setInterval ()-> setInterval ()->
_async.each(ROOM_all, (room, done) -> for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.random_type and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING) and !room.recovered
if !(room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.random_type and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING) and !room.recovered)
done()
return
time_passed = Math.floor((moment() - room.last_active_time) / 1000) time_passed = Math.floor((moment() - room.last_active_time) / 1000)
#log.info time_passed #log.info time_passed
if time_passed >= settings.modules.random_duel.hang_timeout if time_passed >= settings.modules.random_duel.hang_timeout
room.last_active_time = moment() room.last_active_time = moment()
ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}") await ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}")
room.scores[room.waiting_for_player.name_vpass] = -9 room.scores[room.waiting_for_player.name_vpass] = -9
#log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass] #log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${kicked_by_system}", ygopro.constants.COLORS.RED)
...@@ -3551,18 +3534,12 @@ if settings.modules.random_duel.enabled ...@@ -3551,18 +3534,12 @@ if settings.modules.random_duel.enabled
else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10) else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10)
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED)
ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}") ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}")
done()
return
)
return return
, 1000 , 1000
if settings.modules.mycard.enabled if settings.modules.mycard.enabled
setInterval ()-> setInterval ()->
_async.each(ROOM_all, (room, done) -> for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.arena and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING) and !room.recovered
if not (room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.arena and room.last_active_time and room.waiting_for_player and room.get_disconnected_count() == 0 and (!settings.modules.side_timeout or room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING) and !room.recovered)
done()
return
time_passed = Math.floor((moment() - room.last_active_time) / 1000) time_passed = Math.floor((moment() - room.last_active_time) / 1000)
#log.info time_passed #log.info time_passed
if time_passed >= settings.modules.random_duel.hang_timeout if time_passed >= settings.modules.random_duel.hang_timeout
...@@ -3574,15 +3551,10 @@ if settings.modules.mycard.enabled ...@@ -3574,15 +3551,10 @@ if settings.modules.mycard.enabled
CLIENT_kick(room.waiting_for_player) CLIENT_kick(room.waiting_for_player)
else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10) else if time_passed >= (settings.modules.random_duel.hang_timeout - 20) and not (time_passed % 10)
ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED) ygopro.stoc_send_chat_to_room(room, "#{room.waiting_for_player.name} ${afk_warn_part1}#{settings.modules.random_duel.hang_timeout - time_passed}${afk_warn_part2}", ygopro.constants.COLORS.RED)
done() return
return
)
if true # settings.modules.arena_mode.punish_quit_before_match if true # settings.modules.arena_mode.punish_quit_before_match
_async.each(ROOM_all, (room, done) -> for room in ROOM_all when room and room.arena and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.get_playing_player().length < 2
if not (room and room.arena and room.duel_stage == ygopro.constants.DUEL_STAGE.BEGIN and room.get_playing_player().length < 2)
done()
return
player = room.get_playing_player()[0] player = room.get_playing_player()[0]
if player and player.join_time and !player.arena_quit_free if player and player.join_time and !player.arena_quit_free
waited_time = moment() - player.join_time waited_time = moment() - player.join_time
...@@ -3591,33 +3563,22 @@ if settings.modules.mycard.enabled ...@@ -3591,33 +3563,22 @@ if settings.modules.mycard.enabled
player.arena_quit_free = true player.arena_quit_free = true
else if waited_time >= 5000 and waited_time < 6000 else if waited_time >= 5000 and waited_time < 6000
ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE) ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE)
done()
return
)
return return
, 1000 , 1000
if settings.modules.heartbeat_detection.enabled if settings.modules.heartbeat_detection.enabled
setInterval ()-> setInterval ()->
_async.each ROOM_all, (room, done)-> for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and (room.hostinfo.time_limit == 0 or room.duel_stage != ygopro.constants.DUEL_STAGE.DUELING) and !room.windbot
if room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and (room.hostinfo.time_limit == 0 or room.duel_stage != ygopro.constants.DUEL_STAGE.DUELING) and !room.windbot for player in room.get_playing_player() when player and (room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING or player.selected_preduel)
_async.each(room.get_playing_player(), (player, _done)-> CLIENT_heartbeat_register(player, true)
if player and (room.duel_stage != ygopro.constants.DUEL_STAGE.SIDING or player.selected_preduel)
CLIENT_heartbeat_register(player, true)
_done()
, done)
else
done()
return return
, settings.modules.heartbeat_detection.interval , settings.modules.heartbeat_detection.interval
setInterval ()-> setInterval ()->
current_time = moment() current_time = moment()
_async.each ROOM_all, (room, done)-> for room in ROOM_all when room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.hostinfo.auto_death and !room.auto_death_triggered and current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death
if room and room.duel_stage != ygopro.constants.DUEL_STAGE.BEGIN and room.hostinfo.auto_death and !room.auto_death_triggered and current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death room.auto_death_triggered = true
room.auto_death_triggered = true room.start_death()
room.start_death()
done()
, 1000 , 1000
......
// Generated by CoffeeScript 2.5.1 // Generated by CoffeeScript 2.5.1
(function() { (function() {
// 标准库 // 标准库
var AthleticChecker, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, Cloud_replay_ids, DataManager, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_banned, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, challonge_type, chat_color, config, cppversion, crypto, dataManager, date, deck_name_match, default_config, default_data, dialogues, disconnect_list, dns, duel_log, e, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_challonge_requesting, j, l, len, len1, len2, len3, lflists, list, loadJSON, load_dialogues, load_tips, log, long_resolve_cards, m, memory_usage, merge, moment, n, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, options, os, path, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, qs, real_windbot_server_ip, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib; var AthleticChecker, CLIENT_get_authorize_key, CLIENT_get_kick_reconnect_target, CLIENT_heartbeat_register, CLIENT_heartbeat_unregister, CLIENT_import_data, CLIENT_is_able_to_kick_reconnect, CLIENT_is_able_to_reconnect, CLIENT_is_banned_by_mc, CLIENT_is_player, CLIENT_kick, CLIENT_kick_reconnect, CLIENT_pre_reconnect, CLIENT_reconnect, CLIENT_reconnect_register, CLIENT_reconnect_unregister, CLIENT_send_pre_reconnect_info, CLIENT_send_reconnect_info, CLIENT_send_replays, DataManager, Q, ROOM_all, ROOM_bad_ip, ROOM_ban_player, ROOM_clear_disconnect, ROOM_connected_ip, ROOM_find_by_name, ROOM_find_by_pid, ROOM_find_by_port, ROOM_find_by_title, ROOM_find_or_create_ai, ROOM_find_or_create_by_name, ROOM_find_or_create_random, ROOM_kick, ROOM_player_flee, ROOM_player_get_score, ROOM_player_lose, ROOM_player_win, ROOM_players_oppentlist, ROOM_players_scores, ROOM_unwelcome, ROOM_validate, ReplayParser, ResolveData, Room, SERVER_clear_disconnect, SERVER_kick, SOCKET_flush_data, _, _async, addCallback, athleticChecker, auth, axios, badwords, ban_user, bunyan, challonge, challonge_cache, challonge_module_name, challonge_queue_callbacks, challonge_type, chat_color, config, cppversion, crypto, dataManager, date, deck_name_match, default_config, default_data, dialogues, disconnect_list, dns, duel_log, e, exec, execFile, fs, geoip, getSeedTimet, get_callback, get_memory_usage, http, http_server, https, https_server, import_datas, imported, is_challonge_requesting, j, l, len, len1, len2, len3, lflists, list, loadJSON, load_dialogues, load_tips, log, long_resolve_cards, m, memory_usage, merge, moment, n, net, oldbadwords, oldconfig, olddialogues, oldduellog, oldtips, options, os, path, pgClient, pg_client, pg_query, plugin_filename, plugin_list, plugin_path, qs, real_windbot_server_ip, ref, ref1, ref2, refresh_challonge_cache, release_disconnect, replaced_index, report_to_big_brother, request, requestListener, roomlist, setting_change, setting_save, settings, spawn, spawnSync, spawn_windbot, tips, url, users_cache, util, wait_room_start, wait_room_start_arena, windbot_looplimit, windbot_process, windbots, ygopro, zlib;
net = require('net'); net = require('net');
...@@ -624,14 +624,10 @@ ...@@ -624,14 +624,10 @@
setInterval(get_memory_usage, 3000); setInterval(get_memory_usage, 3000);
Cloud_replay_ids = global.Cloud_replay_ids = [];
ROOM_all = global.ROOM_all = []; ROOM_all = global.ROOM_all = [];
ROOM_players_oppentlist = global.ROOM_players_oppentlist = {}; ROOM_players_oppentlist = global.ROOM_players_oppentlist = {};
ROOM_players_banned = global.ROOM_players_banned = [];
ROOM_players_scores = global.ROOM_players_scores = {}; ROOM_players_scores = global.ROOM_players_scores = {};
ROOM_connected_ip = global.ROOM_connected_ip = {}; ROOM_connected_ip = global.ROOM_connected_ip = {};
...@@ -675,37 +671,13 @@ ...@@ -675,37 +671,13 @@
}; };
// automatically ban user to use random duel // automatically ban user to use random duel
ROOM_ban_player = global.ROOM_ban_player = function(name, ip, reason, countadd = 1) { ROOM_ban_player = global.ROOM_ban_player = async function(name, ip, reason, countadd = 1) {
var bannedplayer, bantime; if (settings.modules.test_mode.no_ban_player || !settings.modules.mysql.enabled) {
if (settings.modules.test_mode.no_ban_player) {
return; return;
} }
bannedplayer = _.find(ROOM_players_banned, function(bannedplayer) { await dataManager.randomDuelBanPlayer(ip, reason, countadd);
return ip === bannedplayer.ip;
});
if (bannedplayer) {
bannedplayer.count = bannedplayer.count + countadd;
bantime = bannedplayer.count > 3 ? Math.pow(2, bannedplayer.count - 3) * 2 : 0;
bannedplayer.time = moment() < bannedplayer.time ? moment(bannedplayer.time).add(bantime, 'm') : moment().add(bantime, 'm');
if (!_.find(bannedplayer.reasons, function(bannedreason) {
return bannedreason === reason;
})) {
bannedplayer.reasons.push(reason);
}
bannedplayer.need_tip = true;
} else {
bannedplayer = {
"ip": ip,
"time": moment(),
"count": countadd,
"reasons": [reason],
"need_tip": true
};
ROOM_players_banned.push(bannedplayer);
}
}; };
//log.info("banned", name, ip, reason, bannedplayer.count)
ROOM_kick = function(name, callback) { ROOM_kick = function(name, callback) {
var found; var found;
found = false; found = false;
...@@ -812,14 +784,14 @@ ...@@ -812,14 +784,14 @@
}, 60000); }, 60000);
} }
ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = function(name, player_ip) { ROOM_find_or_create_by_name = global.ROOM_find_or_create_by_name = async function(name, player_ip) {
var room, uname; var room, uname;
uname = name.toUpperCase(); uname = name.toUpperCase();
if (settings.modules.windbot.enabled && (uname.slice(0, 2) === 'AI' || (!settings.modules.random_duel.enabled && uname === ''))) { if (settings.modules.windbot.enabled && (uname.slice(0, 2) === 'AI' || (!settings.modules.random_duel.enabled && uname === ''))) {
return ROOM_find_or_create_ai(name); return ROOM_find_or_create_ai(name);
} }
if (settings.modules.random_duel.enabled && (uname === '' || uname === 'S' || uname === 'M' || uname === 'T')) { if (settings.modules.random_duel.enabled && (uname === '' || uname === 'S' || uname === 'M' || uname === 'T')) {
return ROOM_find_or_create_random(uname, player_ip); return (await ROOM_find_or_create_random(uname, player_ip));
} }
if (room = ROOM_find_by_name(name)) { if (room = ROOM_find_by_name(name)) {
return room; return room;
...@@ -830,33 +802,36 @@ ...@@ -830,33 +802,36 @@
} }
}; };
ROOM_find_or_create_random = global.ROOM_find_or_create_random = function(type, player_ip) { ROOM_find_or_create_random = global.ROOM_find_or_create_random = async function(type, player_ip) {
var bannedplayer, max_player, name, playerbanned, result; var max_player, name, playerbanned, randomDuelBanRecord, result;
bannedplayer = _.find(ROOM_players_banned, function(bannedplayer) { if (settings.modules.mysql.enabled) {
return player_ip === bannedplayer.ip; randomDuelBanRecord = (await dataManager.getRandomDuelBan(player_ip));
}); if (randomDuelBanRecord) {
if (bannedplayer) { if (randomDuelBanRecord.count > 6 && moment().isBefore(randomDuelBanRecord.time)) {
if (bannedplayer.count > 6 && moment() < bannedplayer.time) { return {
return { "error": `\${random_banned_part1}${randomDuelBanRecord.reasons.join('${random_ban_reason_separator}')}\${random_banned_part2}${moment(randomDuelBanRecord.time).fromNow(true)}\${random_banned_part3}`
"error": `\${random_banned_part1}${bannedplayer.reasons.join('${random_ban_reason_separator}')}\${random_banned_part2}${moment(bannedplayer.time).fromNow(true)}\${random_banned_part3}` };
}; }
} if (randomDuelBanRecord.count > 3 && moment().isBefore(randomDuelBanRecord.time) && randomDuelBanRecord.getNeedTip() && type !== 'T') {
if (bannedplayer.count > 3 && moment() < bannedplayer.time && bannedplayer.need_tip && type !== 'T') { randomDuelBanRecord.setNeedTip(false);
bannedplayer.need_tip = false; await dataManager.updateRandomDuelBan(randomDuelBanRecord);
return { return {
"error": `\${random_deprecated_part1}${bannedplayer.reasons.join('${random_ban_reason_separator}')}\${random_deprecated_part2}${moment(bannedplayer.time).fromNow(true)}\${random_deprecated_part3}` "error": `\${random_deprecated_part1}${randomDuelBanRecord.reasons.join('${random_ban_reason_separator}')}\${random_deprecated_part2}${moment(randomDuelBanRecord.time).fromNow(true)}\${random_deprecated_part3}`
}; };
} else if (bannedplayer.need_tip) { } else if (randomDuelBanRecord.getNeedTip()) {
bannedplayer.need_tip = false; randomDuelBanRecord.setNeedTip(false);
return { await dataManager.updateRandomDuelBan(randomDuelBanRecord);
"error": `\${random_warn_part1}${bannedplayer.reasons.join('${random_ban_reason_separator}')}\${random_warn_part2}` return {
}; "error": `\${random_warn_part1}${randomDuelBanRecord.reasons.join('${random_ban_reason_separator}')}\${random_warn_part2}`
} else if (bannedplayer.count > 2) { };
bannedplayer.need_tip = true; } else if (randomDuelBanRecord.count > 2) {
randomDuelBanRecord.setNeedTip(true);
await dataManager.updateRandomDuelBan(randomDuelBanRecord);
}
} }
} }
max_player = type === 'T' ? 4 : 2; max_player = type === 'T' ? 4 : 2;
playerbanned = bannedplayer && bannedplayer.count > 3 && moment() < bannedplayer.time; playerbanned = randomDuelBanRecord && randomDuelBanRecord.count > 3 && moment() < randomDuelBanRecord.time;
result = _.find(ROOM_all, function(room) { result = _.find(ROOM_all, function(room) {
return room && room.random_type !== '' && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && !room.windbot && ((type === '' && (room.random_type === settings.modules.random_duel.default_type || settings.modules.random_duel.blank_pass_modes[room.random_type])) || room.random_type === type) && room.get_playing_player().length < max_player && (settings.modules.random_duel.no_rematch_check || room.get_host() === null || room.get_host().ip !== ROOM_players_oppentlist[player_ip]) && (playerbanned === room.deprecated || type === 'T'); return room && room.random_type !== '' && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && !room.windbot && ((type === '' && (room.random_type === settings.modules.random_duel.default_type || settings.modules.random_duel.blank_pass_modes[room.random_type])) || room.random_type === type) && room.get_playing_player().length < max_player && (settings.modules.random_duel.no_rematch_check || room.get_host() === null || room.get_host().ip !== ROOM_players_oppentlist[player_ip]) && (playerbanned === room.deprecated || type === 'T');
}); });
...@@ -2605,7 +2580,7 @@ ...@@ -2605,7 +2580,7 @@
} }
return (checksum & 0xFF) === 0; return (checksum & 0xFF) === 0;
}; };
create_room_with_action = function(buffer, decrypted_buffer, match_permit) { create_room_with_action = async function(buffer, decrypted_buffer, match_permit) {
var action, len4, len5, name, o, opt1, opt2, opt3, options, p, player, ref3, ref4, room, room_title, title; var action, len4, len5, name, o, opt1, opt2, opt3, options, p, player, ref3, ref4, room, room_title, title;
if (client.closed) { if (client.closed) {
return; return;
...@@ -2693,7 +2668,7 @@ ...@@ -2693,7 +2668,7 @@
ygopro.stoc_die(client, '${invalid_password_unauthorized}'); ygopro.stoc_die(client, '${invalid_password_unauthorized}');
return; return;
} }
room = ROOM_find_or_create_by_name('M#' + info.pass.slice(8)); room = (await ROOM_find_or_create_by_name('M#' + info.pass.slice(8)));
if (room) { if (room) {
ref3 = room.get_playing_player(); ref3 = room.get_playing_player();
for (o = 0, len4 = ref3.length; o < len4; o++) { for (o = 0, len4 = ref3.length; o < len4; o++) {
...@@ -2895,7 +2870,7 @@ ...@@ -2895,7 +2870,7 @@
no_cache: !!recover_match no_cache: !!recover_match
}); });
} }
}, function(err, datas) { }, async function(err, datas) {
var create_room_name, found, k, len5, len6, match, p, player, q, ref4, ref5, ref6, ref7, user; var create_room_name, found, k, len5, len6, match, p, player, q, ref4, ref5, ref6, ref7, user;
if (client.closed) { if (client.closed) {
return; return;
...@@ -2939,7 +2914,7 @@ ...@@ -2939,7 +2914,7 @@
if (recover_match) { if (recover_match) {
create_room_name = recover_match[0] + ',' + create_room_name; create_room_name = recover_match[0] + ',' + create_room_name;
} }
room = ROOM_find_or_create_by_name(create_room_name); room = (await ROOM_find_or_create_by_name(create_room_name));
if (room) { if (room) {
room.challonge_info = found; room.challonge_info = found;
// room.max_player = 2 // room.max_player = 2
...@@ -3032,7 +3007,7 @@ ...@@ -3032,7 +3007,7 @@
buffer = struct.buffer; buffer = struct.buffer;
} }
//log.info 'join_game',info.pass, client.name //log.info 'join_game',info.pass, client.name
room = ROOM_find_or_create_by_name(info.pass, client.ip); room = (await ROOM_find_or_create_by_name(info.pass, client.ip));
if (!room) { if (!room) {
ygopro.stoc_die(client, "${server_full}"); ygopro.stoc_die(client, "${server_full}");
} else if (room.error) { } else if (room.error) {
...@@ -3624,7 +3599,7 @@ ...@@ -3624,7 +3599,7 @@
client.kick_count = client.kick_count ? client.kick_count + 1 : 1; client.kick_count = client.kick_count ? client.kick_count + 1 : 1;
if (client.kick_count >= 5 && room.random_type) { if (client.kick_count >= 5 && room.random_type) {
ygopro.stoc_send_chat_to_room(room, `${client.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${client.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}"); await ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}");
CLIENT_kick(client); CLIENT_kick(client);
return true; return true;
} }
...@@ -3801,7 +3776,7 @@ ...@@ -3801,7 +3776,7 @@
for (n = 0, len3 = ref3.length; n < len3; n++) { for (n = 0, len3 = ref3.length; n < len3; n++) {
player = ref3[n]; player = ref3[n];
if (player && player.is_host) { if (player && player.is_host) {
ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}"); await ROOM_ban_player(player.name, player.ip, "${random_ban_reason_zombie}");
ygopro.stoc_send_chat_to_room(room, `${player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
CLIENT_kick(player); CLIENT_kick(player);
} }
...@@ -4185,8 +4160,8 @@ ...@@ -4185,8 +4160,8 @@
cancel = true; cancel = true;
if (client.abuse_count > 0) { if (client.abuse_count > 0) {
ygopro.stoc_send_chat(client, "${banned_duel_tip}", ygopro.constants.COLORS.RED); ygopro.stoc_send_chat(client, "${banned_duel_tip}", ygopro.constants.COLORS.RED);
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}"); await ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}");
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}", 3); await ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}", 3);
CLIENT_send_replays(client, room); CLIENT_send_replays(client, room);
CLIENT_kick(client); CLIENT_kick(client);
return true; return true;
...@@ -4247,7 +4222,7 @@ ...@@ -4247,7 +4222,7 @@
} }
if (client.abuse_count >= 5) { if (client.abuse_count >= 5) {
ygopro.stoc_send_chat_to_room(room, `${client.name} \${chat_banned}`, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${client.name} \${chat_banned}`, ygopro.constants.COLORS.RED);
ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}"); await ROOM_ban_player(client.name, client.ip, "${random_ban_reason_abuse}");
} }
if (!cancel && settings.modules.display_watchers && client.is_post_watcher) { if (!cancel && settings.modules.display_watchers && client.is_post_watcher) {
ygopro.stoc_send_chat_to_room(room, `${client.name}: ${msg}`, 9); ygopro.stoc_send_chat_to_room(room, `${client.name}: ${msg}`, 9);
...@@ -4690,9 +4665,6 @@ ...@@ -4690,9 +4665,6 @@
if (!room) { if (!room) {
return settings.modules.tournament_mode.enabled && settings.modules.tournament_mode.block_replay_to_player || settings.modules.replay_delay; return settings.modules.tournament_mode.enabled && settings.modules.tournament_mode.block_replay_to_player || settings.modules.replay_delay;
} }
if (settings.modules.cloud_replay.enabled && room.random_type) {
Cloud_replay_ids.push(room.cloud_replay_id);
}
if (!room.replays[room.duel_count - 1]) { if (!room.replays[room.duel_count - 1]) {
// console.log("Replay saved: ", room.duel_count - 1, client.pos) // console.log("Replay saved: ", room.duel_count - 1, client.pos)
room.replays[room.duel_count - 1] = buffer; room.replays[room.duel_count - 1] = buffer;
...@@ -4763,18 +4735,18 @@ ...@@ -4763,18 +4735,18 @@
}); });
if (settings.modules.random_duel.enabled) { if (settings.modules.random_duel.enabled) {
setInterval(function() { setInterval(async function() {
_async.each(ROOM_all, function(room, done) { var len3, n, room, time_passed;
var time_passed; for (n = 0, len3 = ROOM_all.length; n < len3; n++) {
room = ROOM_all[n];
if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.random_type && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING) && !room.recovered)) { if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.random_type && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING) && !room.recovered)) {
done(); continue;
return;
} }
time_passed = Math.floor((moment() - room.last_active_time) / 1000); time_passed = Math.floor((moment() - room.last_active_time) / 1000);
//log.info time_passed //log.info time_passed
if (time_passed >= settings.modules.random_duel.hang_timeout) { if (time_passed >= settings.modules.random_duel.hang_timeout) {
room.last_active_time = moment(); room.last_active_time = moment();
ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}"); await ROOM_ban_player(room.waiting_for_player.name, room.waiting_for_player.ip, "${random_ban_reason_AFK}");
room.scores[room.waiting_for_player.name_vpass] = -9; room.scores[room.waiting_for_player.name_vpass] = -9;
//log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass] //log.info room.waiting_for_player.name, room.scores[room.waiting_for_player.name_vpass]
ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${kicked_by_system}`, ygopro.constants.COLORS.RED);
...@@ -4784,18 +4756,17 @@ ...@@ -4784,18 +4756,17 @@
ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${afk_warn_part1}${settings.modules.random_duel.hang_timeout - time_passed}\${afk_warn_part2}`, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${afk_warn_part1}${settings.modules.random_duel.hang_timeout - time_passed}\${afk_warn_part2}`, ygopro.constants.COLORS.RED);
ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}"); ROOM_unwelcome(room, room.waiting_for_player, "${random_ban_reason_AFK}");
} }
done(); }
});
}, 1000); }, 1000);
} }
if (settings.modules.mycard.enabled) { if (settings.modules.mycard.enabled) {
setInterval(function() { setInterval(function() {
_async.each(ROOM_all, function(room, done) { var len3, len4, n, o, player, room, time_passed, waited_time;
var time_passed; for (n = 0, len3 = ROOM_all.length; n < len3; n++) {
room = ROOM_all[n];
if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.arena && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING) && !room.recovered)) { if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.arena && room.last_active_time && room.waiting_for_player && room.get_disconnected_count() === 0 && (!settings.modules.side_timeout || room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING) && !room.recovered)) {
done(); continue;
return;
} }
time_passed = Math.floor((moment() - room.last_active_time) / 1000); time_passed = Math.floor((moment() - room.last_active_time) / 1000);
//log.info time_passed //log.info time_passed
...@@ -4809,14 +4780,13 @@ ...@@ -4809,14 +4780,13 @@
} else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) { } else if (time_passed >= (settings.modules.random_duel.hang_timeout - 20) && !(time_passed % 10)) {
ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${afk_warn_part1}${settings.modules.random_duel.hang_timeout - time_passed}\${afk_warn_part2}`, ygopro.constants.COLORS.RED); ygopro.stoc_send_chat_to_room(room, `${room.waiting_for_player.name} \${afk_warn_part1}${settings.modules.random_duel.hang_timeout - time_passed}\${afk_warn_part2}`, ygopro.constants.COLORS.RED);
} }
done(); }
}); return;
if (true) { // settings.modules.arena_mode.punish_quit_before_match if (true) { // settings.modules.arena_mode.punish_quit_before_match
_async.each(ROOM_all, function(room, done) { for (o = 0, len4 = ROOM_all.length; o < len4; o++) {
var player, waited_time; room = ROOM_all[o];
if (!(room && room.arena && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.get_playing_player().length < 2)) { if (!(room && room.arena && room.duel_stage === ygopro.constants.DUEL_STAGE.BEGIN && room.get_playing_player().length < 2)) {
done(); continue;
return;
} }
player = room.get_playing_player()[0]; player = room.get_playing_player()[0];
if (player && player.join_time && !player.arena_quit_free) { if (player && player.join_time && !player.arena_quit_free) {
...@@ -4828,39 +4798,42 @@ ...@@ -4828,39 +4798,42 @@
ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE); ygopro.stoc_send_chat(player, "${arena_wait_hint}", ygopro.constants.COLORS.BABYBLUE);
} }
} }
done(); }
});
} }
}, 1000); }, 1000);
} }
if (settings.modules.heartbeat_detection.enabled) { if (settings.modules.heartbeat_detection.enabled) {
setInterval(function() { setInterval(function() {
_async.each(ROOM_all, function(room, done) { var len3, len4, n, o, player, ref3, room;
for (n = 0, len3 = ROOM_all.length; n < len3; n++) {
room = ROOM_all[n];
if (room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && (room.hostinfo.time_limit === 0 || room.duel_stage !== ygopro.constants.DUEL_STAGE.DUELING) && !room.windbot) { if (room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && (room.hostinfo.time_limit === 0 || room.duel_stage !== ygopro.constants.DUEL_STAGE.DUELING) && !room.windbot) {
return _async.each(room.get_playing_player(), function(player, _done) { ref3 = room.get_playing_player();
for (o = 0, len4 = ref3.length; o < len4; o++) {
player = ref3[o];
if (player && (room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING || player.selected_preduel)) { if (player && (room.duel_stage !== ygopro.constants.DUEL_STAGE.SIDING || player.selected_preduel)) {
CLIENT_heartbeat_register(player, true); CLIENT_heartbeat_register(player, true);
} }
return _done(); }
}, done);
} else {
return done();
} }
}); }
}, settings.modules.heartbeat_detection.interval); }, settings.modules.heartbeat_detection.interval);
} }
setInterval(function() { setInterval(function() {
var current_time; var current_time, len3, n, results, room;
current_time = moment(); current_time = moment();
return _async.each(ROOM_all, function(room, done) { results = [];
if (room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.hostinfo.auto_death && !room.auto_death_triggered && current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death) { for (n = 0, len3 = ROOM_all.length; n < len3; n++) {
room.auto_death_triggered = true; room = ROOM_all[n];
room.start_death(); if (!(room && room.duel_stage !== ygopro.constants.DUEL_STAGE.BEGIN && room.hostinfo.auto_death && !room.auto_death_triggered && current_time - moment(room.start_time) > 60000 * room.hostinfo.auto_death)) {
continue;
} }
return done(); room.auto_death_triggered = true;
}); results.push(room.start_death());
}
return results;
}, 1000); }, 1000);
// spawn windbot // spawn windbot
......
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