From b386e32f5d11cd64edefa103059379d9d02ac41b Mon Sep 17 00:00:00 2001 From: ChocoTaco1 Date: Fri, 27 Nov 2020 00:27:57 -0500 Subject: [PATCH] Discord bot connectivity --- Classic/scripts/LakRabbitGame.cs | 4 + Classic/scripts/autoexec/zzDiscordBot.cs | 282 +++++++++++++++++++++++ 2 files changed, 286 insertions(+) create mode 100644 Classic/scripts/autoexec/zzDiscordBot.cs diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index 8f7e06b..83821f2 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -716,6 +716,10 @@ function Armor::damageObject(%data, %targetObject, %sourceObject, %position, %am } Game.recalcScore(%sourceObject.client); + + //Code for DarkTigers discordBot + if(discord.lastState $= "Connected") + discordBotProcess("lakMApoints", %sourceObject, %points, %hitType, %weapon, %distance, %vel); } // borlak -- make a sound when you hit someone diff --git a/Classic/scripts/autoexec/zzDiscordBot.cs b/Classic/scripts/autoexec/zzDiscordBot.cs new file mode 100644 index 0000000..efc38bc --- /dev/null +++ b/Classic/scripts/autoexec/zzDiscordBot.cs @@ -0,0 +1,282 @@ +//discordKill(); to kill bot connection +//discordCon(); to force connect +//sendToDiscord(%message, %channel); to send a message manually + +//exec("scripts/autoexec/zzDiscordBot.cs"); + +$discordBot::AuthKey[0] = ""; +$discordBot::IP[0] = ""; +$discordBot::reconnectTimeout = 3 * 60000; +$discordBot::AuthSet = 0; +$discordBot::autoStart = 1; + + +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); + %type = getTaggedString(%msgType); + switch$(%type) + { + case "msgExplosionKill" or "msgSuicide" or "msgVehicleSpawnKill" or "msgVehicleCrash" or "msgVehicleKill" or "msgTurretSelfKill" or "msgTurretSelfKill" or "msgCTurretKill" or "msgTurretKill" or + "msgSelfKill" or "msgOOBKill" or "msgCampKill" or "msgTeamKill" or "msgLavaKill" or "msgLightningKill" or "MsgRogueMineKill" or "MsgHeadshotKill" or "MsgRearshotKill" or "MsgLegitKill": + %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)); + %message = stripChars(%message, "\cp\co\c0\c6\c7\c8\c9"); + sendToDiscord(%message,2); + } +} + +function discordBotProcess(%type, %var1, %var2, %var3, %var4, %var5, %var6) +{ + //echo(%type SPC %var1 SPC %var2 SPC %var3 SPC %var4 SPC %var5 SPC %var6); + + 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)"; + } + 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) + %s = "s"; + %hitType = %var3; + %weapon = %var4; + %distance = %var5; + %vel = %var6; + if(%points) + %msg = getTaggedString(%sourceObject.client.name) SPC "receives" SPC %points @ %s SPC "points! [" @ %hitType SPC %weapon @ "] [Distance:" SPC %distance @ "] [Speed:" SPC %vel @ "]"; + } + + if(%msg !$= "") + { + %msg = stripChars(%msg, "\cp\co\c0\c6\c7\c8\c9"); + sendToDiscord(%msg, 2); + } +} + +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") + sendToDiscord(%log, 1); +} + +}; + +if(!isActivePackage(discordPackage)) + activatePackage(discordPackage); + +function sendToDiscord(%msg,%channel) +{ + if(isObject(discord) && %msg !$= "") + { + if(discord.lastState $= "Connected") + { + switch(%channel) + { + case 1: + discord.send("MSG1" SPC %msg @ "\n"); + case 2: + discord.send("MSG2" SPC %msg @ "\n"); + case 3: + discord.send("MSG3" SPC %msg @ "\n"); + case 4: + discord.send("MSG4" SPC %msg @ "\n"); + case 5: + discord.send("MSG5" SPC %msg @ "\n"); + } + } + } +} + +function discordCon(){ + if(discord.lastState !$= "Connected"){ + if(isEventPending($discordBot::reconnectEvent)) + cancel($discordBot::reconnectEvent); + if(isObject(discord)) + discord.delete(); + new TCPObject(discord); + discord.lastState = "Connecting"; + discord.connect($discordBot::IP[$discordBot::AuthSet]); + } +} +function discordKill(){ + if(isEventPending($discordBot::reconnectEvent)) + cancel($discordBot::reconnectEvent); + discord.delete(); +} + +function discord::onDNSFailed(%this){ + %this.lastState = "DNSFailed"; + error(%this.lastState); +} + +function discord::onConnectFailed(%this){ + %this.lastState = "ConnectFailed"; + error(%this.lastState); + discord.delete(); + if(isEventPending($discordBot::reconnectEvent)) + cancel($discordBot::reconnectEvent); + $discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon"); +} + +function discord::onDNSResolved(%this){ + %this.lastState = "DNSResolved"; + error(%this.lastState); +} + +function discord::onConnected(%this){ + %this.lastState = "Connected"; + error(%this.lastState); + discord.send("AUTH" SPC $discordBot::AuthKey[$discordBot::AuthSet]); +} + +function discord::onDisconnect(%this){ + %this.lastState = "Disconnected"; + error(%this.lastState); + discord.delete(); + if(isEventPending($discordBot::reconnectEvent)) + cancel($discordBot::reconnectEvent); + $discordBot::reconnectEvent = schedule($discordBot::reconnectTimeout,0,"discordCon"); +} + +function discord::onLine(%this, %line){ + %lineStrip = stripChars(%line,"\r\n"); + %cmd = getWord(%lineStrip,0); + switch$(%cmd){ + case "Discord": + //messageAll( 'MsgDiscord', '\c3Discord: \c4%1 %2',getWord(%lineStrip,1),getWords(%lineStrip,2,getWordCount(%lineStrip) -1)); + case "PING": + discord.send("PONG"); + default: + error("Bad Command"); + error( %line ); + } +} +if(!isObject(discord) && $discordBot::autoStart) + discordCon(); \ No newline at end of file