TacoServer/Classic/scripts/autoexec/zzDiscordBot.cs

465 lines
18 KiB
C#
Raw Normal View History

2020-11-27 05:27:57 +00:00
//discordKill(); to kill bot connection
//discordCon(); to force connect
//sendToDiscord(%message, %channel); to send a message manually
//exec("scripts/autoexec/zzDiscordBot.cs");
2022-02-17 21:09:49 +00:00
//ip of the bot
2022-09-03 14:21:36 +00:00
$discordBot::IP = "";
2020-11-27 05:27:57 +00:00
$discordBot::reconnectTimeout = 3 * 60000;
2022-02-17 21:09:49 +00:00
//auto connect on start
2021-04-13 16:31:23 +00:00
$discordBot::autoStart = 0;
//used on the bot to help split thigns up
2022-02-17 21:09:49 +00:00
$discordBot::cmdSplit = "%c%";
$discordBot::cmdSubSplit = "%t%";
2022-03-03 19:00:33 +00:00
//These are set via the bot
2022-02-17 21:09:49 +00:00
$discordBot::monitorChannel = 0;
$discordBot::serverFeed = 1;
2022-03-03 19:00:33 +00:00
2020-11-27 05:27:57 +00:00
package discordPackage
{
//function chatMessageAll( %sender, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 )
//{
//parent::chatMessageAll( %sender, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10 );
//if ( getsubstr(detag(%a2),0,1) !$= "/" ){
//sendToDiscord(%sender.nameBase SPC %a2,1);
//}
//}
function messageAll(%msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13)
{
parent::messageAll(%msgType, %msgString, %a1, %a2, %a3, %a4, %a5, %a6, %a7, %a8, %a9, %a10, %a11, %a12, %a13);
2021-04-13 16:31:23 +00:00
%type = getTaggedString(%msgType);
2020-11-27 05:27:57 +00:00
switch$(%type)
{
case "msgExplosionKill" or "msgSuicide" or "msgVehicleSpawnKill" or "msgVehicleCrash" or "msgVehicleKill" or "msgTurretSelfKill" or "msgTurretSelfKill" or "msgCTurretKill" or "msgTurretKill" or
2022-02-17 21:09:49 +00:00
"msgSelfKill" or "msgOOBKill" or "msgCampKill" or "msgTeamKill" or "msgLavaKill" or "msgLightningKill" or "MsgRogueMineKill" or "MsgHeadshotKill" or "MsgRearshotKill" or "MsgLegitKill":
2020-11-27 05:27:57 +00:00
%message = getTaggedString(%msgString);
%message = strreplace(%message,"%1",getTaggedString(%a1));
%message = strreplace(%message,"%2",getTaggedString(%a2));
%message = strreplace(%message,"%3",getTaggedString(%a3));
%message = strreplace(%message,"%4",getTaggedString(%a4));
%message = strreplace(%message,"%5",getTaggedString(%a5));
%message = strreplace(%message,"%6",getTaggedString(%a6));
%message = strreplace(%message,"%7",getTaggedString(%a7));
%message = strreplace(%message,"%8",getTaggedString(%a8));
2020-11-27 05:27:57 +00:00
%message = stripChars(%message, "\cp\co\c0\c6\c7\c8\c9");
2021-04-13 16:31:23 +00:00
sendToDiscordEmote(%message, $discordBot::serverFeed);
}
2021-04-13 16:31:23 +00:00
if($missionName !$= $discordBot::cm && ClientGroup.getCount() > 2){
sendToDiscordEmote("The mission changed to" SPC $missionName, $discordBot::serverFeed);
$discordBot::cm = $missionName;
}
2020-11-27 05:27:57 +00:00
}
function CTFGame::flagCap(%game, %player)
{
if(discord.lastState $= "Connected")
discordBotProcess("flagCap", %game, %player, %var3, %var4, %var5, %var6);
parent::flagCap(%game, %player);
}
function CTFGame::playerTouchEnemyFlag(%game, %player, %flag)
{
if(discord.lastState $= "Connected")
discordBotProcess("touchEnemyFlag", %game, %player, %flag, %var4, %var5, %var6);
parent::playerTouchEnemyFlag(%game, %player, %flag);
}
function CTFGame::playerDroppedFlag(%game, %player)
{
if(discord.lastState $= "Connected")
discordBotProcess("droppedFlag", %game, %player, %var3, %var4, %var5, %var6);
parent::playerDroppedFlag(%game, %player);
}
function CTFGame::flagReturn(%game, %flag, %player)
{
parent::flagReturn(%game, %flag, %player);
if(discord.lastState $= "Connected")
discordBotProcess("flagReturn", %game, %flag, %player, %var4, %var5, %var6);
}
function SCtFGame::flagCap(%game, %player)
{
if(discord.lastState $= "Connected")
discordBotProcess("flagCap", %game, %player, %var3, %var4, %var5, %var6);
parent::flagCap(%game, %player);
}
function SCtFGame::playerTouchEnemyFlag(%game, %player, %flag)
{
if(discord.lastState $= "Connected")
discordBotProcess("touchEnemyFlag", %game, %player, %flag, %var4, %var5, %var6);
parent::playerTouchEnemyFlag(%game, %player, %flag);
}
function SCtFGame::playerDroppedFlag(%game, %player)
{
if(discord.lastState $= "Connected")
discordBotProcess("droppedFlag", %game, %player, %var3, %var4, %var5, %var6);
parent::playerDroppedFlag(%game, %player);
}
function SCtFGame::flagReturn(%game, %flag, %player)
{
parent::flagReturn(%game, %flag, %player);
if(discord.lastState $= "Connected")
discordBotProcess("flagReturn", %game, %flag, %player, %var4, %var5, %var6);
}
function LakRabbitGame::playerTouchFlag(%game, %player, %flag)
{
if(discord.lastState $= "Connected")
discordBotProcess("lakTouchFlag", %game, %player, %flag, %var4, %var5, %var6);
parent::playerTouchFlag(%game, %player, %flag);
}
// In LakRabbitGame.cs inside lakrabbit override
// function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC)
// {
// Armor::damageObject(%data, %targetObject, %sourceObject, %position, %amount, %damageType, %momVec, %mineSC);
// if(discord.lastState $= "Connected")
// discordBotProcess("lakMApoints", %sourceObject, %points, %hitType, %weapon, %distance, %vel);
// }
function dtEventLog(%log, %save)
{
parent::dtEventLog(%log, %save);
if(discord.lastState $= "Connected")
2021-04-13 16:31:23 +00:00
sendToDiscord(%log, $discordBot::monitorChannel);
2020-11-27 05:27:57 +00:00
}
2020-12-21 21:58:03 +00:00
function LogMessage(%client, %msg, %cat){
if(discord.lastState $= "Connected")
2021-04-13 16:31:23 +00:00
sendToDiscord("Message" SPC %client.nameBase SPC %msg, $discordBot::monitorChannel);
2020-12-21 21:58:03 +00:00
parent::LogMessage(%client, %msg, %cat);
}
2020-11-27 05:27:57 +00:00
2022-09-03 14:21:36 +00:00
function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch ){
parent::onConnect( %client, %name, %raceGender, %skin, %voice, %voicePitch );
if(%client.getAddress() !$= "Local" && discord.lastState $= "Connected"){
%ip = %client.getAddress();
%ip = getSubStr(%ip, 3, strLen(%ip));
%ip = getSubStr(%ip, 0, strstr(%ip, ":"));
%authInfo = %client.getAuthInfo();
%guid = getField( %authInfo, 3 );
%realName = getField( %authInfo, 0 );
%name = (%realName !$= "") ? %realName : stripChars( detag( getTaggedString( %client.name ) ), "\cp\co\c6\c7\c8\c9\c0");
discord.send("CONDATA" @ $discordBot::cmdSplit @ %name @ $discordBot::cmdSplit @ %ip @ $discordBot::cmdSplit @ %guid @ "\r\n");
}
}
function GameConnection::onDrop(%client, %reason){
if(%client.getAddress() !$= "Local" && discord.lastState $= "Connected"){
%ip = %client.getAddress();
%ip = getSubStr(%ip, 3, strLen(%ip));
%ip = getSubStr(%ip, 0, strstr(%ip, ":"));
%authInfo = %client.getAuthInfo();
%guid = getField( %authInfo, 3 );
%realName = getField( %authInfo, 0 );
%name = (%realName !$= "") ? %realName : stripChars( detag( getTaggedString( %client.name ) ), "\cp\co\c6\c7\c8\c9\c0");
discord.send("DROPDATA" @ $discordBot::cmdSplit @ %name @ $discordBot::cmdSplit @ %ip @ $discordBot::cmdSplit @ %guid @ "\r\n");
}
parent::onDrop(%client, %reason);
}
2020-11-27 05:27:57 +00:00
};
if(!isActivePackage(discordPackage))
activatePackage(discordPackage);
2021-04-13 16:31:23 +00:00
function discordBotProcess(%type, %var1, %var2, %var3, %var4, %var5, %var6)
{
//echo(%type SPC %var1 SPC %var2 SPC %var3 SPC %var4 SPC %var5 SPC %var6);
2021-04-13 16:31:23 +00:00
switch$ (%type)
{
case "flagCap":
%game = %var1;
%player = %var2;
%flag = %player.holdingFlag;
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false);
%msg = getTaggedString(%player.client.name) SPC "captured the" SPC getTaggedString(%game.getTeamName(%flag.team)) SPC "flag. (Held:" SPC %held @ ")";
case "touchEnemyFlag":
%game = %var1;
%player = %var2;
%flag = %var3;
if(!%player.flagTossWait)
{
%grabspeed = mFloor(VectorLen(setWord(%player.getVelocity(), 2, 0)) * 3.6);
if(%flag.isHome)
%msg = getTaggedString(%player.client.name) SPC "took the" SPC getTaggedString(%game.getTeamName(%flag.team)) SPC "flag. (Speed:" SPC %grabspeed @ "Kph)";
else if(!%flag.isHome)
%msg = getTaggedString(%player.client.name) SPC "took the" SPC getTaggedString(%game.getTeamName(%flag.team)) SPC "flag in the field. (Speed:" SPC %grabspeed @ "Kph)";
2021-04-13 16:31:23 +00:00
}
case "droppedFlag":
%game = %var1;
%player = %var2;
%flag = %player.holdingFlag;
%held = %game.formatTime(getSimTime() - %game.flagHeldTime[%flag], false);
%msg = getTaggedString(%player.client.name) SPC "dropped the" SPC getTaggedString(%game.getTeamName(%flag.team)) SPC "flag. (Held:" SPC %held @ ")";
case "flagReturn":
%game = %var1;
%flag = %var2;
%player = %var3;
if(%player !$= "")
%msg = getTaggedString(%player.client.name) SPC "returned the" SPC getTaggedString(%game.getTeamName(%flag.team)) SPC "flag.";
else
%msg = "The" SPC getTaggedString(%game.getTeamName(%flag.team)) SPC "flag was returned to base.";
case "lakTouchFlag":
%game = %var1;
%player = %var2;
%flag = %var3;
if(!%player.client.flagDeny && %player.getState() !$= "Dead" && PlayingPlayers() > 1)
%msg = getTaggedString(%player.client.name) SPC "has taken the flag.";
case "lakMApoints":
%sourceObject = %var1;
%points = %var2;
if(%points !$=1)
2021-04-13 16:31:23 +00:00
%s = "s";
%hitType = %var3;
%weapon = %var4;
%distance = %var5;
%vel = %var6;
if(%points)
%msg = getTaggedString(%sourceObject.client.name) SPC "receives" SPC %points SPC "point" @ %s @ "! [" @ %hitType SPC %weapon @ "] [Distance:" SPC %distance @ "] [Speed:" SPC %vel @ "]";
2021-04-13 16:31:23 +00:00
}
2021-04-13 16:31:23 +00:00
if(%msg !$= "")
{
%msg = stripChars(%msg, "\cp\co\c0\c6\c7\c8\c9");
sendToDiscordEmote(%msg, $discordBot::serverFeed);
}
}
2020-11-27 05:27:57 +00:00
function sendToDiscord(%msg,%channel)
{
if(isObject(discord) && %msg !$= "")
{
if(discord.lastState $= "Connected")
2020-12-21 21:58:03 +00:00
{
2022-02-17 21:09:49 +00:00
discord.send("MSG" @ $discordBot::cmdSplit @ (%channel) @ $discordBot::cmdSplit @ "0" @ $discordBot::cmdSplit @ %msg @ "\r\n");
2021-04-13 16:31:23 +00:00
}
}
}
function sendToDiscordEmote(%msg,%channel)//emote filter will be applyed used in server feed
{
if(isObject(discord) && %msg !$= "")
{
if(discord.lastState $= "Connected")
{
2022-02-17 23:55:27 +00:00
discord.send("MSG" @ $discordBot::cmdSplit @ (%channel) @ $discordBot::cmdSplit @ "emote" @ $discordBot::cmdSplit @ %msg @ "\r\n");
2020-11-27 05:27:57 +00:00
}
}
}
function discordCon(){
2022-03-03 19:00:33 +00:00
if(discord.lastState !$= "Connected" && discord.lastState !$= "Connecting"){
2020-11-27 05:27:57 +00:00
if(isEventPending($discordBot::reconnectEvent))
cancel($discordBot::reconnectEvent);
if(isObject(discord))
discord.delete();
new TCPObject(discord);
2020-11-27 05:27:57 +00:00
discord.lastState = "Connecting";
2022-03-03 19:00:33 +00:00
//discord.connect($discordBot::IP);
discord.schedule(1000, "connect", $discordBot::IP);
//discord.schedule(5000, "send", "AUTH" @ $discordBot::cmdSplit @ $discordBot::cmdSplit @ $Host::GameName @ "\r\n");
2020-11-27 05:27:57 +00:00
}
}
function discordKill(){
if(isEventPending($discordBot::reconnectEvent))
cancel($discordBot::reconnectEvent);
2020-11-27 05:27:57 +00:00
discord.delete();
}
function discord::onDNSFailed(%this){
%this.lastState = "DNSFailed";
2022-03-03 19:00:33 +00:00
error("Discord" SPC %this.lastState);
2020-11-27 05:27:57 +00:00
}
function discord::onConnectFailed(%this){
if(isEventPending($discordBot::reconnectEvent))
cancel($discordBot::reconnectEvent);
$discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon");
2022-03-03 19:00:33 +00:00
%this.lastState = "ConnectFailed";
error("Discord" SPC %this.lastState);
discord.delete();
2020-11-27 05:27:57 +00:00
}
function discord::onDNSResolved(%this){
%this.lastState = "DNSResolved";
2022-03-03 19:00:33 +00:00
error("Discord" SPC %this.lastState);
2020-11-27 05:27:57 +00:00
}
function discord::onConnected(%this){
2022-03-03 19:00:33 +00:00
discord.schedule(1000, "send", "AUTH" @ $discordBot::cmdSplit @ $discordBot::cmdSplit @ $Host::GameName @ "\r\n");
2020-11-27 05:27:57 +00:00
%this.lastState = "Connected";
2022-03-03 19:00:33 +00:00
error("Discord" SPC %this.lastState);
2020-11-27 05:27:57 +00:00
}
function discord::onDisconnect(%this){
2022-03-03 19:00:33 +00:00
if(%this.lastState $= "Connecting" && $discordBot::failCon++ < 20){
schedule(5000,0,"discordCon");
}
2020-11-27 05:27:57 +00:00
if(isEventPending($discordBot::reconnectEvent))
cancel($discordBot::reconnectEvent);
$discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon");
2022-03-03 19:00:33 +00:00
%this.lastState = "Disconnected";
error("Discord" SPC %this.lastState);
discord.delete();
2020-11-27 05:27:57 +00:00
}
function discord::onLine(%this, %line){
%lineStrip = stripChars(%line,"\r\n");
%cmd = getWord(%lineStrip,0);
switch$(%cmd){
2020-12-21 21:58:03 +00:00
//case "Discord":
//messageAll( 'MsgDiscord', '\c3Discord: \c4%1 %2',getWord(%lineStrip,1),getWords(%lineStrip,2,getWordCount(%lineStrip) -1));
2022-03-03 19:00:33 +00:00
case "GETSTAT":
%mon = getWord(%lineStrip,1);
%year = getWord(%lineStrip,2);
%var = getWord(%lineStrip,3);
2022-03-03 19:00:33 +00:00
%game = getWord(%lineStrip,4);
if(%game $= ""){// default if not valid
%game = "CTFGame";
}
2022-03-03 19:00:33 +00:00
%returnIndex = getWord(%lineStrip,5);
%nameList = $lData::name[%var,%game,"month",%mon,%year];
%dataList = $lData::data[%var,%game,"month",%mon,%year];
%nameList = strreplace(%nameList,"\t","%t");
%dataList = strreplace(%dataList,"\t","%t");
error("Discord" SPC "GETSTAT" SPC %var SPC %mon SPC %year SPC %game SPC %returnIndex);
discord.schedule(32,"send","SINSTAT" @ "%c%" @ %nameList @ "%c%" @ %dataList @ "%c%" @ %returnIndex @ "%c%" @ %var @ "\r\n");
case "GENSTATS":
if(!$genStatsLockout){
$genStatsLockout = 1;
%month = getWord(%lineStrip,1);
%year = getWord(%lineStrip,2);
%game = getWord(%lineStrip,3);
if(%game $= ""){// default if not valid
%game = "CTFGame";
}
2022-03-03 19:00:33 +00:00
if(%month > 0 && %year > 0){
schedule(1000, 0, "sendLDATA", %month, %year, %game);
2022-03-03 19:00:33 +00:00
}
}
else{
sendToDiscord("Already Building Please Wait", $discordBot::monitorChannel);
}
2020-11-27 05:27:57 +00:00
case "PING":
2021-04-13 16:31:23 +00:00
discord.send("PONG" @ $discordBot::cmdSplit @ "\r\n");
case "PINGAVG":
%min = 10000;
%max = -10000;
%lowCount = %lowPing = 0;
2021-04-13 16:31:23 +00:00
for(%i = 0; %i < ClientGroup.getCount(); %i++){
%cl = ClientGroup.getObject(%i);
%ping = %cl.isAIControlled() ? 0 : %cl.getPing();
2021-04-13 16:31:23 +00:00
%min = (%ping < %min) ? %ping : %min;
%max = (%ping > %max) ? %ping : %max;
if(%ping < 250){
%lowCount++;
%lowPing += %ping;
2021-04-13 16:31:23 +00:00
}
%pc++;
%pingT += %ping;
2021-04-13 16:31:23 +00:00
}
%lowCount = (%lowCount == 0) ? 1 : %lowCount;
if(!%pc){
sendToDiscord("Ping AVG:" @ 0 SPC "Low Avg:" @ 0 SPC "Min:" @ 0 SPC "Max:" @ 0, $discordBot::monitorChannel);
2021-04-13 16:31:23 +00:00
}
else{
%avg = mFloor(%pingT/%pc);
%lavg = mFloor(%lowPing/%lowCount);
sendToDiscord("Ping AVG:" @ %avg SPC "Low Avg:" @ %lavg SPC "Min:" @ %min SPC "Max:" @ %max, $discordBot::monitorChannel);
}
case "PINGLIST":
if(isObject(discord) && discord.lastState $= "Connected"){
if(ClientGroup.getCount() > 0){
for(%i = 0; %i < ClientGroup.getCount(); %i++){
%cl = ClientGroup.getObject(%i);
%ping = %cl.isAIControlled() ? 0 : %cl.getPing();
2021-04-13 16:31:23 +00:00
%msg = %cl.namebase @ $discordBot::cmdSubSplit @ %ping @ $discordBot::cmdSubSplit @ %i;
2022-03-03 19:00:33 +00:00
discord.schedule(%i*32,"send","MSGSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ %msg @ "\r\n");
2021-04-13 16:31:23 +00:00
}
2022-03-03 19:00:33 +00:00
discord.schedule((%i+1)*32,"send","PROCSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ "msgList" @ "\r\n");
2021-04-13 16:31:23 +00:00
}
}
2022-04-11 21:22:00 +00:00
case "BANLIST":
2022-04-25 17:50:57 +00:00
%found = 0;
for (%i = 0; %i < 100; %i++){
if($dtBanList::NameList[%i] !$= ""){
2022-04-11 21:22:00 +00:00
%fieldList = $dtBanList::NameList[%i];
2022-04-25 17:50:57 +00:00
%msg = "Index:" @ %i SPC "Name:" @ getField(%fieldList,0) SPC "GUID:" @ getField(%fieldList,1);
%found++;
discord.schedule(%found*32,"send","MSGSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ %msg @ "\r\n");
2022-04-11 21:22:00 +00:00
}
2022-04-25 17:50:57 +00:00
}
if(%found > 0){
discord.schedule((%found+1)*32,"send","PROCSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ "banList" @ "\r\n");
2022-04-11 21:22:00 +00:00
}
else{
sendToDiscord("No active bans, see ban file for manual/older entries", $discordBot::monitorChannel);
}
case "UNBANINDEX":
%var = getWord(%lineStrip,1);
2022-04-25 17:50:57 +00:00
if($dtBanList::NameList[%var] !$= ""){
2022-04-11 21:22:00 +00:00
%name = unbanIndex(%var);
2022-04-25 17:50:57 +00:00
sendToDiscord("User:" @ %name SPC "has been unbanned", $discordBot::monitorChannel);
2022-04-11 21:22:00 +00:00
}
else{
sendToDiscord("Invalid Index", $discordBot::monitorChannel);
}
2020-11-27 05:27:57 +00:00
default:
2022-03-03 19:00:33 +00:00
error("Discord Bad Command" SPC %line);
2020-11-27 05:27:57 +00:00
}
}
2022-03-03 19:00:33 +00:00
if(!isObject(discord) && $discordBot::autoStart){
discordCon();
}
function sendLDATA(%month, %year, %game){
2022-03-03 19:00:33 +00:00
%file = new FileObject();
RootGroup.add(%file);
%folderPath = "serverStats/LData/*.cs";
%count = getFileCount(%folderPath);
%found = 0;
for (%i = 0; %i < %count; %i++){
%filepath = findNextfile(%folderPath);
%fieldPath =strreplace(%filePath,"-","\t");
%g = getField(%fieldPath,1);
2022-03-03 19:00:33 +00:00
%m = getField(%fieldPath,2); // 0 path / 1 game / 2 mon / 3 year / 4 type / 5 .cs
%y = getField(%fieldPath,3);
//%lType = getField(%fieldPath,4);
//error(%g SPC %game SPC %m SPC %month SPC %y SPC %year);
if(%month $= %m && %y $= %year && %g $= %game){
2022-03-03 19:00:33 +00:00
%found = 1;
break;
}
}
if(isFile(%filepath) && %found){
sendToDiscord("Building Big Stats", $discordBot::monitorChannel);
%file.OpenForRead(%filepath);
%i = 0;
while(!%file.isEOF()){
%line = %file.readLine();
if(strPos(%line,"%tguid") == -1){
discord.schedule((%i++)*32,"send","STATSDATA" @ "%c%" @ %month @ "%c%" @ %game @ "%c%" @ %line @ "\r\n");
2022-03-03 19:00:33 +00:00
}
}
//error("Sent LData To Discord" SPC %month SPC %year SPC %game SPC %i);
discord.schedule((%i++*32)+1000,"send","PROCSTACK" @ $discordBot::cmdSplit @ ($discordBot::monitorChannel) @ $discordBot::cmdSplit @ "buildStats" @ $discordBot::cmdSplit @ %month @ $discordBot::cmdSplit @ %year @ $discordBot::cmdSplit @ %game @ $discordBot::cmdSplit @ "\r\n");
2022-03-03 19:00:33 +00:00
schedule((%i++*32)+1000, 0, "unlockStatGen");
}
else{
sendToDiscord("Error no file found", $discordBot::monitorChannel);
$genStatsLockout = 0;
}
%file.close();
%file.delete();
}
function unlockStatGen(){
$genStatsLockout = 0;
2022-04-25 17:50:57 +00:00
}