Teamspeak
Hier findest Du einige Modifikationen und erweiterte Mods und Serverviewer rund um Teamspeak 2 & 3.
Teamspeak 2: Modifizierter PerlMod
Einige Änderungen von mir am PerlMod von ScP.
Modifikationen:
- Auto Admin Channel --> In diesem Channel erhält man SA Rechte (Passwort wäre angebracht).
- Kick Channel --> Man fliegt raus, wenn man kein SA hat.
- Auto Registration Channel --> In diesem Channel erhält man automatisch Registrierungsrechte, kann auch mit Sticky setzen des Channels als Zwangsregistrierung genutzt werden.
- SA's bekommen mehr Informationen, auch wird weiter ins Logfile geschrieben. (Login, IP, usw.)
- SA's und Logeinträge beinhalten den Loginnamen eines Players nur, wenn dieser registriert ist.
- Bestrafung "move" wird automatisch durch "kick" ersetzt, wenn es sonst eine Loopmessage geben würde.
- Channel muss nur dann in die cfg geschrieben werden, wenn die Bestrafung "move" ist.
- cfg File umgeschrieben, mehr Erklärung drin.
- Manch Code optimiert / umgeschrieben / neugeschrieben.
- Bantime ist nun per cfg einstellbar.
- Nachrichten können nun mit Variablen (z.B. für Playernamen) angegeben werden, eine Liste der Vars ist am Ende des cfg Files.
Installation:
Archiv entpacken, Ordner in TS 2 Installation uploaden und Multi Startscript ausführen (nach Serverstart).
Danke ausserdem an Haufe (für manch Hilfe & Idee) und mcmax (für einige Ideen)!
Viel Spass damit.
ts2perlmod.pl
Code eingefügt.
#!/usr/bin/perl
# ts2perlmod.pl - TS2PerlMod GNU/GPL-Edition
# This script runs in an infinite loop and performs various actions on your TeamSpeak server
# Written 2006 by Sven Paulsen
use strict;
use warnings;
use diagnostics;
use lib "packages";
require "./packages/lib-ts2perlmod.pl";
use Data::Dumper;
use TeamSpeak2::TCPquery;
use constant SCRIPT => {
name => "TS2 PerlMod GNU/GPL-Edition",
version => "0.9.19 ext",
config => "8767.ini",
pidfile => "ts2perlmod.pid",
daemon => 0,
};
&init();
# read the scripts configuration file
my %config = &readConfig();
# open the scripts logfile
my $log;
$log = &openLog($config{"LOG"}{"File"}) if($config{"LOG"}{"Enabled"});
&log($log, SCRIPT->{name}." started.");
# connect to server and create a new TeamSpeak2::TCPquery object
my $ts2 = TeamSpeak2::TCPquery->new(&trim($config{"CONNECTION"}{"ServerAddress"}),&trim($config{"CONNECTION"}{"ServerTCPPort"})) || &abort("Could not establish connection to server: ".$config{"CONNECTION"}{"ServerAddress"});
&printColored("ok", "Connected to server: ".$config{"CONNECTION"}{"ServerAddress"});
# disable debugging
$ts2->toggleDebug();
# check serverversion
my $version = $ts2->getServerversion();
if($version->{release} < 21) {
&printColored("**", "The server is running an outdated version: ".$version->{version});
}
# select virtual server
$ts2->selectServer(&trim($config{"CONNECTION"}{"ServerUDPPort"})) || &abort("Could not select virtual server on port: ".$config{"CONNECTION"}{"ServerUDPPort"});
&printColored("ok", "Selected virtual server on port: ".$config{"CONNECTION"}{"ServerUDPPort"});
# authenticate as superadmin
$ts2->loginSuperadmin(&trim($config{"LOGIN"}{"Username"}),&trim($config{"LOGIN"}{"Password"})) || &abort("Could not authenticate as user: ".$config{"LOGIN"}{"Username"});
&printColored("ok", "Authenticated as user: ".$config{"LOGIN"}{"Username"});
# check the scripts settings
my %settings = %{&checkFeatureSettings($ts2,\%config)};
&log($log, "Initialization sequence completed.");
&daemonize();
# declare some vars, arrays and hashes to store various information
my $sent_stats = 0;
my $last_stats = time();
my $last_advert = time();
my $last_serverset = time();
my $last_config_reload = time();
my %new_players;
my %nicks_not_checked;
my %exploits_not_checked;
my %set_sticky;
my %old_channel;
my %old_channels;
my %connections;
# create TeamSpeak2::TCPquery::Server object
my $server = $ts2->getServer($config{"CONNECTION"}{"ServerUDPPort"});
eval {
# enter the main loop
while(1) {
# get the servers playerlist
my @playerlist = $ts2->getPlayerlist();
# get the servers channellist
my @channellist = $ts2->getChannellist();
# update TeamSpeak2::TCPquery::Server object
$server->getServerinfo();
# get the servers playerlist
foreach my $player (@playerlist) {
# create a new TeamSpeak2::TCPquery::Channel object
my $channel = $player->getChannel();
next if(!$channel);
# check if current player is protected
my $protected = &checkProtection($player->{loginname},@{$settings{protectuser}{content}}) if($config{"PROTECTED-USERS"}{"Enabled"});
# check if current player is protected Admin
my $protected_admin = &checkSAProtection($player->{loginname},@{$settings{protectadmins}{content}}) if($config{"PROTECTED-ADMINS"}{"Enabled"});
# extended welcome message
if($config{"WELCOME-MESSAGE"}{"Enabled"}) {
if($player->{logintime} <= $settings{repeat} && !exists($new_players{$player->{p_id}})) {
$new_players{$player->{p_id}} = time();
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{welcome}{content}});
$player->sendMessage(@message);
if(!$player->{pprivs}->{registered}) {
&log($log, "[WELCOME-MESSAGE] Sent welcome message to player ".$player->{nick}." ".$player->getFlags()." with IP: ".$player->{ip});
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[WELCOME-MESSAGE] Sent welcome message to player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." with IP: ".$player->{ip});
}
foreach my $player2 (@playerlist) {
if($player2->{p_id} != $player->{p_id} && $player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." joined with IP: ".$player->{ip});
}
elsif($player2->{p_id} != $player->{p_id} && $player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." joined with IP: ".$player->{ip});
}
}
}
}
# sticky channel
if($config{"STICKY-CHANNEL"}{"Enabled"}) {
if(exists($set_sticky{$player->{p_id}}) && $player->{c_id} != $settings{sticky}{channel}->{id}) {
delete $set_sticky{$player->{p_id}};
$player->setSticky(0);
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{sticky}{message1}});
$player->sendMessage(@message);
if(!$player->{pprivs}->{registered}) {
&log($log, "[STICKY-CHANNEL] Released player ".$player->{nick}." ".$player->getFlags()." from channel ".$settings{sticky}{channel}->{name});
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[STICKY-CHANNEL] Released player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." from channel ".$settings{sticky}{channel}->{name}.".");
}
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." get free.");
}
elsif($player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." get free.");
}
}
}
if($player->{c_id} == $settings{sticky}{channel}->{id} && !$player->{pprivs}->{sticky} && !$player->{pprivs}->{serveradmin}) {
$set_sticky{$player->{p_id}} = 1 if(!exists($set_sticky{$player->{p_id}}));
$player->setSticky(1);
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{sticky}{message2}});
$player->sendMessage(@message);
if(!$player->{pprivs}->{registered}) {
&log($log, "[STICKY-CHANNEL] Stuck player ".$player->{nick}." ".$player->getFlags()." to channel ".$settings{sticky}{channel}->{name});
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[STICKY-CHANNEL] Stuck player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." to channel ".$settings{sticky}{channel}->{name}.".");
}
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." set sticky.");
}
elsif($player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." set sticky.");
}
}
}
}
# auto registration channel
if($config{"REGISTER-CHANNEL"}{"Enabled"}) {
if($player->{c_id} != $settings{register}{channel}->{id}){
$old_channel{$player->{p_id}} = $player->{c_id} ;
}
if(!$player->{pprivs}->{registered} && !$player->{pprivs}->{allowed_reg}) {
if($config{"REGISTER-CHANNEL"}{"Automove"}) {
if($player->move($settings{register}{channel}->{id})) {
$player->setSticky(1) if($config{"REGISTER-CHANNEL"}{"Sticky"});
}
}
if($player->{c_id} == $settings{register}{channel}->{id} && !$player->{pprivs}->{registered}) {
$ts2->execute("sppriv " . $player->{p_id} . " privilege_canregister 1");
my @message1 = &parseMessage($player,$channel,$server,$version,@{$settings{register}{message1}});
$player->sendMessage(@message1);
my @message2 = &parseMessage($player,$channel,$server,$version,@{$settings{register}{message2}});
$player->sendMessage(@message2);
}
}
elsif(!$player->{pprivs}->{serveradmin} && $player->{pprivs}->{registered} && $player->{c_id} == $settings{register}{channel}->{id} && $player->{c_id} != $settings{sticky}{channel}->{id}) {
$player->setSticky(0) if($config{"REGISTER-CHANNEL"}{"Sticky"});
$player->move($old_channel{$player->{p_id}}) if($old_channel{$player->{p_id}});
&log($log, "[REGISTER-CHANNEL] ".$player->{nick}." ".$player->getFlags()." is now registered. Loginname: ".$player->{loginname});
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." is now registered. Loginname: ".$player->{loginname});
}
}
}
}
# admin channel
if($config{"ADMIN-CHANNEL"}{"Enabled"} && !$settings{protectadmins}{safromlist}) {
if(!$player->{pprivs}->{serveradmin} && $player->{c_id} == $settings{admin}{channel}->{id}) {
$player->setServeradmin(1);
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{admin}{content}});
$player->sendMessage(@message);
&log($log, "[ADMIN-CHANNEL] ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." is now Serveradmin.");
foreach my $player2 (@playerlist) {
if($player2->{p_id} != $player->{p_id} && $player2->{pprivs}->{serveradmin}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." is now Serveradmin.");
}
}
}
}
# protected admin
if($config{"PROTECTED-ADMINS"}{"Enabled"}) {
if(!$player->{pprivs}->{serveradmin} && $protected_admin){
$player->setServeradmin(1);
my @message1 = &parseMessage($player,$channel,$server,$version,@{$settings{protectadmins}{message1}});
$player->sendMessage(@message1);
&log($log, "[PROTECTED-ADMINS] Granted SA privileges to ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags());
foreach my $player2 (@playerlist) {
if($player2->{p_id} != $player->{p_id} && $player2->{pprivs}->{serveradmin}) {
$player2->sendMessage("Granted SA privileges to ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags().". Reason: Protected Admin");
}
}
}
elsif($settings{"protectadmins"}{"safromlist"} && $player->{pprivs}->{serveradmin} && !$protected_admin && !$protected){
$player->setServeradmin(0);
my @message2 = &parseMessage($player,$channel,$server,$version,@{$settings{protectadmins}{message2}});
$player->sendMessage(@message2);
&log($log, "[PROTECTED-ADMINS] Revoked SA privileges from ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags());
foreach my $player2 (@playerlist) {
if($player2->{p_id} != $player->{p_id} && $player2->{pprivs}->{serveradmin}) {
$player2->sendMessage("Revoked SA privileges from ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags().". Reason: No protected Admin");
}
}
}
}
# kick channel
if($config{"KICK-CHANNEL"}{"Enabled"} && !$protected) {
if(!$player->{pprivs}->{serveradmin} && $player->{c_id} == $settings{kick}{channel}->{id}) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{kick}{content}});
$player->sendMessage(@message);
&punish($player,$settings{kick});
if($settings{"kick"}{"punishment"} eq "move") {
$ts2->execute("kick " . $player->{p_id});
}
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}){
$player2->sendMessage($player->{nick}." ".$player->getFlags()." have a bad day ;-)");
}
elsif($player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}){
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." have a bad day ;-)");
}
}
}
}
# warn idlers
if($config{"WARN-IDLERS"}{"Enabled"} && !$protected) {
if($player->{idletime} >= $settings{warnidler}{idletime} && $player->{idletime} <= ($settings{warnidler}{idletime} + $settings{repeat})) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{warnidler}{content}});
$player->sendMessage(@message);
if(!$player->{pprivs}->{registered}) {
&log($log, "[WARN-IDLERS] Warned player ".$player->{nick}." ".$player->getFlags()." after ".formatTime($player->{idletime}).".");
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[WARN-IDLERS] Warned player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." after ".formatTime($player->{idletime}).".");
}
}
}
# move idlers
if($config{"MOVE-IDLERS"}{"Enabled"} && !$protected) {
if($player->{idletime} >= $settings{moveidler}{idletime} && !$player->{pprivs}->{sticky} && $player->{c_id} != $settings{moveidler}{channel}->{id}) {
$player->move($settings{moveidler}{channel}->{id});
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{moveidler}{content}});
$player->sendMessage(@message);
if(!$player->{pprivs}->{registered}) {
&log($log, "[WARN-IDLERS] Moved player ".$player->{nick}." ".$player->getFlags()." after ".formatTime($player->{idletime}).".");
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[WARN-IDLERS] Moved player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." after ".formatTime($player->{idletime}).".");
}
}
}
# bad nickname
if($config{"BAD-NICKNAME"}{"Enabled"} && !$protected) {
if($player->{logintime} <= $settings{repeat} && !exists($nicks_not_checked{$player->{p_id}})) {
$nicks_not_checked{$player->{p_id}} = time();
}
if(exists($nicks_not_checked{$player->{p_id}})) {
foreach(@{$settings{badnick}{content}}) {
if(lc($player->{nick}) =~ /$_/i) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{badnick}{content2}});
$player->sendMessage(@message);
&punish($player,$settings{badnick});
if(!$player->{pprivs}->{registered}) {
&log($log, "[BAD-NICKNAME] Punished player ".$player->{nick}." ".$player->getFlags()." for a bad nickname.");
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[BAD-NICKNAME] Punished player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." for a bad nickname.");
}
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Bad Nick Protection");
}
elsif($player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." punished. Reason: Bad Nick Protection");
}
}
}
}
delete $nicks_not_checked{$player->{p_id}};
}
}
# bad channel
if($config{"BAD-CHANNEL"}{"Enabled"} && !$protected) {
if($channel->{flags}->{unregistered}) {
foreach(@{$settings{badchan}{content}}) {
if(lc($channel->{name}) =~ /$_/i) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{badchan}{content2}});
$player->sendMessage(@message);
&punish($player,$settings{badchan});
if(!$player->{pprivs}->{registered}) {
&log($log, "[BAD-CHANNEL] Punished player ".$player->{nick}." ".$player->getFlags()." for creating channel ".$channel->{name});
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[BAD-CHANNEL] Punished player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." for creating channel ".$channel->{name});
}
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Bad Channel Protection");
}
elsif($player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." punished. Reason: Bad Channel Protection");
}
}
}
}
}
}
# anti rec
if($config{"ANTI-REC"}{"Enabled"} && !$protected) {
if($player->{pflags}->{recording}) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{antirec}{content}});
$player->sendMessage(@message);
&punish($player,$settings{antirec});
if($settings{"antirec"}{"punishment"} eq "move") {
$ts2->execute("kick " . $player->{p_id});
}
if(!$player->{pprivs}->{registered}) {
&log($log, "[ANTI-REC] Punished player ".$player->{nick}." ".$player->getFlags()." for recording.");
}
elsif($player->{pprivs}->{registered}) {
&log($log, "[ANTI-REC] Punished player ".$player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." for recording.");
}
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Record Protection");
}
elsif($player2->{pprivs}->{serveradmin} && $player->{pprivs}->{registered}) {
$player2->sendMessage($player->{nick}." [".$player->{loginname}."] ".$player->getFlags()." punished. Reason: Record Protection");
}
}
}
}
# take over protection
if($config{"TAKE-OVER-PROTECTION"}{"Enabled"}) {
if($player->{pprivs}->{serveradmin} && !$player->{pprivs}->{registered}) {
$player->setServeradmin(0);
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{takeover}{content}});
$player->sendMessage(@message);
&punish($player,$settings{takeover});
if($settings{"takeover"}{"punishment"} eq "move") {
$ts2->execute("kick " . $player->{p_id});
}
&log($log, "[TAKE-OVER-PROTECTION] Punished player ".$player->{nick}." ".$player->getFlags());
foreach my $player2 (@playerlist) {
if($player2->{p_id} != $player->{p_id} && $player2->{pprivs}->{serveradmin}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Take over Protection");
}
}
}
}
# auto afk
if($config{"AUTO-AFK"}{"Enabled"} && !$protected) {
if($player->{c_id} != $settings{autoafk}{channel}->{id} && $player->{pflags}->{away} && !$player->{pprivs}->{sticky}) {
if($player->move($settings{autoafk}{channel}->{id})) {
$old_channels{$player->{p_id}} = $player->{c_id} if(!exists($old_channels{$player->{p_id}}));
}
}
elsif(!$player->{pflags}->{away} && exists($old_channels{$player->{p_id}})) {
if($player->{c_id} == $settings{autoafk}{channel}->{id}) {
$player->move($old_channels{$player->{p_id}});
}
delete $old_channels{$player->{p_id}};
}
}
# anti flood
if($config{"ANTI-FLOOD"}{"Enabled"}) {
if($player->{logintime} <= $settings{repeat}) {
if(!exists($connections{$player->{ip}})) {
$connections{$player->{ip}} = [time(), 1];
}
else {
my $remaining_connections = $settings{antiflood}{connections}-@{$connections{$player->{ip}}}[1];
@{$connections{$player->{ip}}}[1]++ if(time()-@{$connections{$player->{ip}}}[0] <= $settings{antiflood}{seconds});
if(!$remaining_connections) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{antiflood}{content}});
$player->sendMessage(@message);
&punish($player,$settings{antiflood});
if($settings{"antiflood"}{"punishment"} eq "move") {
$ts2->execute("kick " . $player->{p_id});
}
&log($log, "[ANTI-FLOOD] Add IP address ".$player->{ip}." to banlist");
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Flood Protection");
}
}
}
}
}
}
# stats message
if($config{"STATS-MESSAGE"}{"Enabled"}) {
if($last_stats + $settings{stats}{interval} < time()) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{stats}{content}});
$player->sendMessage(@message);
$sent_stats = 1;
}
}
# bug detection
if($config{"BUG-DETECTION"}{"Enabled"}) {
if($player->{logintime} <= $settings{repeat} && !exists($exploits_not_checked{$player->{p_id}})) {
$exploits_not_checked{$player->{p_id}} = time();
}
if(exists($exploits_not_checked{$player->{p_id}})) {
if(length($player->{nick}) > 29 || !parseRtfString($player->{nick}) || !parseNullbyteString($player->{nick})) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{bugdetection}{content}});
$player->sendMessage(@message);
&punish($player,$settings{bugdetection});
if($settings{"bugdetection"}{"punishment"} eq "move") {
ts2->execute("kick " . $player->{p_id});
}
&log($log, "[BUG-DETECTION] Exploit attempt detected while checking nickname of player ".$player->{nick}." ".$player->getFlags());
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Bug / Exploit Protection");
}
}
}
delete $exploits_not_checked{$player->{p_id}};
}
if(length($channel->{name}) > 29 || !parseRtfString($channel->{name}) || !parseNullbyteString($channel->{name})) {
my @message = &parseMessage($player,$channel,$server,$version,@{$settings{bugdetection}{content}});
$player->sendMessage(@message);
&punish($player,$settings{bugdetection});
if($settings{"bugdetection"}{"punishment"} eq "move") {
$ts2->execute("kick " . $player->{p_id});
}
&log($log, "[BUG-DETECTION] Exploit attempt detected while checking channel of player ".$player->{nick}." ".$player->getFlags());
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin}) {
$player2->sendMessage($player->{nick}." ".$player->getFlags()." punished. Reason: Bug / Exploit Protection");
}
}
}
}
}
# kick idlers
if($config{"KICK-IDLERS"}{"Enabled"}) {
my $kicked = $server->kickIdlers($settings{kickidler}{idletime},$settings{kickidler}{targets},$settings{kickidler}{reason});
my $x = "player";
$x = "players" if($kicked > 1);
&log($log, "[KICK-IDLERS] Kicked ".$kicked." idle ".$x." from server.") if($kicked);
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin} && $kicked) {
$player2->sendMessage("Kicked ".$kicked." idle ".$x." from server.");
}
}
}
# update banlist
if($config{"UPDATE-BANLIST"}{"Enabled"}) {
foreach($ts2->getBanlist) {
if($_->{mins} == "0") {
$ts2->deleteBan($_->{b_id});
$ts2->addBan($_->{ip}, $settings{banupd}{mins});
&log($log, "[UPDATE-BANLIST] Converted permanent ban of IP ".$_->{ip}." into a ".$settings{banupd}{mins}." minute timeban.");
foreach my $player2 (@playerlist) {
if($player2->{pprivs}->{serveradmin}) {
$player2->sendMessage("Converted permanent ban of IP ".$_->{ip}." into a ".$settings{banupd}{mins}." minute timeban.");
}
}
}
}
}
# advert message
if($config{"ADVERT-MESSAGE"}{"Enabled"}) {
if($last_advert + $settings{advert}{interval} < time()) {
$server->sendMessage(@{$settings{advert}{content}});
$last_advert = time();
}
}
# auto servertype
if($config{"AUTO-SERVERTYPE"}{"Enabled"}) {
if($last_serverset + $settings{serverset}{interval} < time()) {
if($server->{server_currentusers} > $settings{serverset}{clients}) {
if($server->{server_clan_server}) {
$server->setModePublic();
&log($log, "[AUTO-SERVERTYPE] Changed type of server ".$server->{server_name}." (".$server->{server_currentusers}."/".$server->{server_maxusers}.") to public.");
foreach my $player (@playerlist) {
if($player->{pprivs}->{serveradmin}) {
$player->sendMessage("Changed type of server to public. Current players: ".$server->{server_currentusers}."/".$server->{server_maxusers});
}
}
}
}
else {
if(!$server->{server_clan_server}) {
$server->setModeClan();
&log($log, "[AUTO-SERVERTYPE] Changed type of server ".$server->{server_name}." (".$server->{server_currentusers}."/".$server->{server_maxusers}.") to clan.");
foreach my $player (@playerlist) {
if($player->{pprivs}->{serveradmin}) {
$player->sendMessage("Changed type of server to clan. Current players: ".$server->{server_currentusers}."/".$server->{server_maxusers});
}
}
}
}
$last_serverset = time();
}
}
# reload config
if($last_config_reload + $settings{reload} < time()) {
%config = &readConfig();
%settings = %{&checkFeatureSettings($ts2,\%config)};
$last_config_reload = time();
}
# reset stats timer
if($sent_stats) {
$last_stats = time();
$sent_stats = 0;
}
# delete outdated entries from hashes
my $first_player = (@playerlist) ? shift(@playerlist) : 0;
foreach(keys(%new_players)) { delete $new_players{$_} if((time()-$settings{repeat}) > $new_players{$_}); }
foreach(keys(%set_sticky)) { delete $set_sticky{$_} if($first_player && $_ < $first_player->{p_id}); }
foreach(keys(%old_channel)) { delete $old_channel{$_} if($first_player && $_ < $first_player->{p_id}); }
foreach(keys(%old_channels)) { delete $old_channels{$_} if($first_player && $_ < $first_player->{p_id}); }
foreach(keys(%connections)) { delete $connections{$_} if(time()-@{$connections{$_}}[0] > $settings{antiflood}{seconds}); }
# wait for x seconds
sleep $settings{repeat};
}
};
# catch and log critical errors
if($@) {
&log($log, &trim($@));
}
exit(1);
- ts2perlmod.rar (201,5 KiB)