TacoServer/Classic/scripts/autoexec/dtBanSystem.cs

310 lines
9.5 KiB
C#
Raw Normal View History

2020-12-01 21:43:18 +00:00
//$Host::dtBanlist = "prefs/dtBanlist.cs";
2021-01-05 00:04:52 +00:00
//$Host::KickBanTime = 20; is 20 Minutes
//$Host::BanTime = 43200; is One Month
//$Host::BanTime = 129600; is Three Months
//$Host::BanTime = 259200; is Six Months
//$Host::BanTime = 518400; is 1 year
//$Host::BanTime = 1000000; is Until you unban them (Forever)
//$Host::BanTime = BAN; is Until you unban them (Forever)
//$dtBanList::GUID3555379 = "DAY OF THE YEAR BANNED \t YEAR BANNED \t HOUR BANNED \t MINUTE BANNED \t TIME TO BE BANNED";
//$dtBanList::GUID3555379 = "4\t2021\t18\t31\t518400";
2020-12-01 21:43:18 +00:00
2021-05-21 01:49:45 +00:00
//TO UNBAN SOMEONE WITHOUT RESTARTING THE SERVER
2022-04-11 21:22:00 +00:00
//banList();in console
//unbanIndex(%index) %index is the number next to the players name from listBans();
2021-05-21 01:49:45 +00:00
//Example: unban(555555,"22.222.222.222"); put ip in quotes
2020-12-19 00:53:57 +00:00
package dtBan
{
function ClassicLoadBanlist()
{
$ClassicPermaBans = 0;
if(isFile($Host::dtBanlist))
exec($Host::dtBanlist);
$ClassicWhitelists = 0;
exec($Host::ClassicWhitelist);
}
2020-12-01 21:19:17 +00:00
2021-01-05 00:04:52 +00:00
function BanList::add(%guid, %ipAddress, %time){
if(%time > 999999){
%time = "BAN";
}
2022-04-11 21:22:00 +00:00
%name = getClientBanName(%guid, %ipAddress);
2021-01-05 00:04:52 +00:00
if (%guid > 0){
2022-04-11 21:22:00 +00:00
$dtBanList::GUID[%guid] = dtBanMark() TAB %time TAB %name;
2021-01-05 00:04:52 +00:00
}
if (getSubStr(%ipAddress, 0, 3) $= "IP:"){
%bareIP = getSubStr(%ipAddress, 3, strLen(%ipAddress));
%bareIP = getSubStr(%bareIP, 0, strstr(%bareIP, ":"));
%bareIP = strReplace(%bareIP, ".", "_"); // variable access bug workaround
2022-04-11 21:22:00 +00:00
// add IP ban
$dtBanList::IP[%bareIP] = dtBanMark() TAB %time TAB %name;
}
%found = 0;
for (%i = 0; %i < $dtBanList::NameListCount; %i++){
if(getField($dtBanList::NameList[%i], 0) $= %name){
%found =1;
if(%guid > 0)
$dtBanList::NameList[%i] = setField($dtBanList::NameList[%i], 1, %guid);
if(getSubStr(%ipAddress, 0, 3) $= "IP:")
$dtBanList::NameList[%i] = setField($dtBanList::NameList[%i], 2, %bareIP);
break;
}
}
if(!%found){
$dtBanList::NameListCount = ($dtBanList::NameListCount > 0) ? $dtBanList::NameListCount : 0;
$dtBanList::NameList[$dtBanList::NameListCount] = %name TAB %guid TAB %bareIP;
$dtBanList::NameListCount++;
2021-01-05 00:04:52 +00:00
}
// write out the updated bans to the file
2022-04-11 21:22:00 +00:00
saveBanList();
2020-12-19 00:53:57 +00:00
}
2021-01-05 00:04:52 +00:00
function banList_checkIP(%client){
%ip = %client.getAddress();
%ip = getSubStr(%ip, 3, strLen(%ip));
%ip = getSubStr(%ip, 0, strstr(%ip, ":"));
%ip = strReplace(%ip, ".", "_");
%time = $dtBanList::IP[%ip];
if(%time $= "BAN")
return 1;
2022-04-11 21:22:00 +00:00
if (getFieldCount(%time) > 0){
2021-01-05 00:04:52 +00:00
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
if (%delta < getField(%time,4))
return 1;
else{
2022-04-11 21:22:00 +00:00
for (%i = 0; %i < $dtBanList::NameListCount; %i++){
if(getField($dtBanList::NameList[%i], 2) $= %ip){
unbanIndex(%i);
break;
}
}
2021-01-05 00:04:52 +00:00
$dtBanList::IP[%ip] = "";
2022-04-11 21:22:00 +00:00
saveBanList();
2021-01-05 00:04:52 +00:00
}
}
return 0;
2020-12-19 00:53:57 +00:00
}
2021-01-05 00:04:52 +00:00
function banList_checkGUID(%guid){
%time = $dtBanList::GUID[%guid];
if(%time $= "BAN")
return 1;
2022-04-11 21:22:00 +00:00
if (getFieldCount(%time) > 0){
2021-01-05 00:04:52 +00:00
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
if (%delta < getField(%time,4))
return 1;
else{
2022-04-11 21:22:00 +00:00
for (%i = 0; %i < $dtBanList::NameListCount; %i++){
if(getField($dtBanList::NameList[%i], 1) $= %guid){
unbanIndex(%i);
break;
}
}
$dtBanList::GUID[%guid] = "";
saveBanList();
2021-01-05 00:04:52 +00:00
}
}
return 0;
2020-12-19 00:53:57 +00:00
}
2020-12-01 21:19:17 +00:00
};
2020-12-19 00:53:57 +00:00
2022-04-11 21:22:00 +00:00
if (!isActivePackage(dtBan)){
2020-12-19 00:53:57 +00:00
activatePackage(dtBan);
2022-04-11 21:22:00 +00:00
}
2021-01-05 00:04:52 +00:00
2022-04-11 21:22:00 +00:00
function saveBanList(){
if(!isEventPending($banEvent))
$banEvent = schedule(1000,0,"export","$dtBanList*", $Host::dtBanlist);
}
function getClientBanName(%guid, %ip){
%found = 0;
for (%i = 0; %i < ClientGroup.getCount(); %i++){
%client = ClientGroup.getObject(%i);
if(%guid > 0 && %client.guid $= %guid){
%found = 1;
break;
}
else if(%client.getAddress() $= %ip){
%found = 1;
break;
}
}
if(%found){
%authInfo = %client.getAuthInfo();
%realName = getField( %authInfo, 0 );
if(%realName !$= "")
%name = %realName;
else
%name = stripChars( detag( getTaggedString( %client.name ) ), "\cp\co\c6\c7\c8\c9\c0" );
return trim(%name);
}
return 0;
}
2021-01-06 00:56:05 +00:00
2021-01-05 00:04:52 +00:00
function getBanCount(%d, %year, %h, %n){
2022-04-11 21:22:00 +00:00
if(%d && %year && %h && %n){
%dif = formattimestring("yy") - %year;
%days += 365 * (%dif-1);
%days += 365 - %d;
%days += dtBanDay();
%ht = %nt = 0;
if(formattimestring("H") > %h){
%ht = formattimestring("H") - %h;
}
else if(formattimestring("H") < %h){
%ht = 24 - %h;
%ht = formattimestring("H")+ %ht;
}
if(formattimestring("n") > %n){
%nt = formattimestring("n") - %n;
}
else if(formattimestring("n") < %n){
%nt = 60 - %n;
%nt = formattimestring("n") + %nt;
}
return mfloor((%days * 1440) + (%ht*60) + %nt);
}
return 0;
2021-01-05 00:04:52 +00:00
//return mfloor((%days * 1440) + (%ht*60) + %nt) TAB (%days * 1440) TAB (%ht*60) TAB %nt;
2020-12-01 21:19:17 +00:00
}
2021-01-05 00:04:52 +00:00
2021-01-06 00:56:05 +00:00
function dtBanDay(){
%date = formattimestring("mm dd yy");
%m = getWord(%date,0);%d = getWord(%date,1);%y = getWord(%date,2);
%count = 0;
if(%y % 4 < 1){%days[2] = "29";}else{%days[2] = "28";} // leap year
%days[1] = "31";%days[3] = "31";
%days[4] = "30"; %days[5] = "31"; %days[6] = "30";
%days[7] = "31"; %days[8] = "31"; %days[9] = "30";
%days[10] = "31"; %days[11] = "30"; %days[12] = "31";
for(%i = 1; %i <= %m-1; %i++){
%count += %days[%i];
}
return %count + %d;
}
2021-01-05 00:04:52 +00:00
function dtBanMark(){
2020-12-01 21:19:17 +00:00
%date = formattimestring("mm dd yy");
%m = getWord(%date,0);%d = getWord(%date,1);%y = getWord(%date,2);
%count = 0;
if(%y % 4 < 1){%days[2] = "29";}else{%days[2] = "28";} // leap year
%days[1] = "31";%days[3] = "31";
%days[4] = "30"; %days[5] = "31"; %days[6] = "30";
%days[7] = "31"; %days[8] = "31"; %days[9] = "30";
%days[10] = "31"; %days[11] = "30"; %days[12] = "31";
2021-01-05 00:04:52 +00:00
for(%i = 1; %i <= %m-1; %i++){
2020-12-01 21:19:17 +00:00
%count += %days[%i];
}
2021-01-05 00:04:52 +00:00
return %count + %d TAB formattimestring("yy") TAB formattimestring("H") TAB formattimestring("n");
}
2020-12-01 21:19:17 +00:00
2022-04-11 21:22:00 +00:00
function banList(){
$dtBanList::NameListCount = ($dtBanList::NameListCount > 0) ? $dtBanList::NameListCount : 0;
if(!$dtBanList::NameListCount){
error("No bans, see" SPC $Host::dtBanlist SPC "for older system entries");
}
else{
for (%i = 0; %i < $dtBanList::NameListCount; %i++){
%fieldList = $dtBanList::NameList[%i];
error("index:" @ %i SPC "Name:" @ getField(%fieldList,0) SPC "GUID:" @ getField(%fieldList,1) SPC "IP:" @ getField(%fieldList,2));
}
if($dtBanList::NameListCount > 0){
error("Use unbanIndex(%index); to unban user from the list ");
}
}
}
function unbanIndex(%index){
%fieldList = $dtBanList::NameList[%index];
%name = getField(%fieldList, 0);
if(getFieldCount(%fieldList) > 1){
for(%i = %index; %i < $dtBanList::NameListCount -1; %i++) {
$dtBanList::NameList[%i] =$dtBanList::NameList[%i+1];
}
$dtBanList::NameList[%i] = "";
$dtBanList::NameListCount--;
error("Name" SPC getField(%fieldList,0) SPC "UNBANNED");
%guid = getField(%fieldList,1);
if($dtBanList::GUID[%guid] !$= ""){
$dtBanList::GUID[%guid] = "";
error("GUID" SPC %guid SPC "UNBANNED");
}
%ip = getField(%fieldList,2);
if($dtBanList::IP[%ip] !$= ""){
$dtBanList::IP[%ip] = "";
error("IP" SPC %ip SPC "UNBANNED");
}
}
else{
for(%i = %index; %i < $dtBanList::NameListCount -1; %i++) {
$dtBanList::NameList[%i] =$dtBanList::NameList[%i+1];
}
$dtBanList::NameList[%i] = "";
$dtBanList::NameListCount--;
error("Error removing invalid index");
}
saveBanList();
return %name;
}
function banListClean(){
%count = 0;
for(%i = 0; %i < $dtBanList::NameListCount; %i++) {
%ban = 1;
%banField = $dtBanList::NameList[%i];
%guid = getField(%banField,1);
%ip = getField(%banField,2);
%time = $dtBanList::IP[%ip];
if(%time !$= "BAN" && getFieldCount(%time) > 0){
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
if (%delta > getField(%time,4)){
$dtBanList::IP[%ip] = "";
%ban = 0;
}
}
%time = $dtBanList::GUID[%guid];
if(%time !$= "BAN" && getFieldCount(%time) > 0){
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
if (%delta > getField(%time,4)){
$dtBanList::GUID[%guid] = "";
%ban = 0;
}
}
if(%banField !$= "" && %ban){
%tempList[%count] = %banField;
%count++;
}
}
for(%i = 0; %i < %count; %i++) {
$dtBanList::NameList[%i] = %tempList[%i];
}
$dtBanList::NameListCount = %count;
}
//old method
function unbanold(%guid,%ip){
%ip = strReplace(%ip, ".", "_");
for (%i = 0; %i < $dtBanList::NameListCount; %i++){
if(getField($dtBanList::NameList[%i], 2) $= %ip || getField($dtBanList::NameList[%i], 1) $= %guid){
unbanIndex(%i);
return;
}
}
2021-01-05 00:04:52 +00:00
if($dtBanList::GUID[%guid] !$= ""){
$dtBanList::GUID[%guid] = "";
error("GUID" SPC %guid SPC "UNBANNED");
}
if($dtBanList::IP[%ip] !$= ""){
$dtBanList::IP[%ip] = "";
error("IP" SPC %ip SPC "UNBANNED");
}
2022-04-11 21:22:00 +00:00
saveBanList();
}