493 lines
15 KiB
JavaScript
493 lines
15 KiB
JavaScript
require('dotenv').config();
|
|
const exec = require('child_process').exec;
|
|
|
|
const Discord = require('discord.js');
|
|
const https = require('http');
|
|
const fs = require('fs');
|
|
const parser = require('fast-xml-parser');
|
|
const bot = new Discord.Client();
|
|
const TOKEN = process.env.TOKEN;
|
|
var defport = 530;
|
|
var defip = "localhost";
|
|
var currentvote = false;
|
|
var thumbsup = 0;
|
|
var thumbsdown = 0;
|
|
var msgid;
|
|
|
|
|
|
const isRunning = (query, cb) => {
|
|
let platform = process.platform;
|
|
let cmd = '';
|
|
switch (platform) {
|
|
case 'win32' : cmd = `tasklist`; break;
|
|
case 'darwin' : cmd = `ps -ax | grep ${query}`; break;
|
|
case 'linux' : cmd = `ps -A`; break;
|
|
default: break;
|
|
}
|
|
exec(cmd, (err, stdout, stderr) => {
|
|
cb(stdout.toLowerCase().indexOf(query.toLowerCase()) > -1);
|
|
});
|
|
}
|
|
|
|
|
|
bot.login(TOKEN);
|
|
|
|
bot.on('ready', () => {
|
|
console.info(`Logged in as ${bot.user.tag}!`);
|
|
});
|
|
|
|
const options = {
|
|
hostname: defip,
|
|
port: defport,
|
|
path: '',
|
|
method: 'POST',
|
|
headers: {
|
|
'Accept': 'text/xml',
|
|
'Cache-Control': 'no-cache',
|
|
'Pragma': 'no-cache',
|
|
'SOAPAction': 'Execute'
|
|
}
|
|
};
|
|
|
|
bot.on('message', msg => {
|
|
if (msg.author.bot) {
|
|
return;
|
|
}
|
|
if (msg.channel.id != process.env.CHANNEL) { return; }
|
|
|
|
var message = msg.content
|
|
|
|
if (!msg.content.startsWith(process.env.PREFIX))
|
|
{
|
|
if (msg.mentions.has(bot.user.id) && msg.content.includes(" ")) {
|
|
message = message.substring(message.indexOf(" ") + 1)
|
|
}
|
|
else
|
|
{
|
|
return;
|
|
};
|
|
}
|
|
else
|
|
{
|
|
message = message.substring(1);
|
|
}
|
|
|
|
var messageArray = message.includes(" ") ? message.split(' ') : [ message ];
|
|
|
|
switch (messageArray[0].toLowerCase())
|
|
{
|
|
case "prefix":
|
|
msg.channel.send(`The Current prefix is: \`${process.env.PREFIX}\``);
|
|
break;
|
|
case "help":
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setColor('#0099ff')
|
|
.setTitle('SOAP Commands')
|
|
.setAuthor('RCCService.exe', 'https://i.imgur.com/52zkGiZ.png')
|
|
.setDescription('Here are the commands for RCC SOAP Bot:\n\n;help\n;execute (<string> script) | ;x\n;viewgame | ;vg\n;viewconsole | ;vc\n;votereset')
|
|
.setTimestamp()
|
|
.setFooter('Coded by Yakov and Linus man himself', 'https://i.imgur.com/9cPv812.png');
|
|
|
|
msg.channel.send(exampleEmbed);
|
|
break;
|
|
case "restart":
|
|
if (msg.author.id == process.env.ADMIN) {
|
|
msg.reply('Restarting...')
|
|
.then(msg => bot.destroy())
|
|
.then(() => bot.login(TOKEN));
|
|
} else {
|
|
msg.reply('UNAUTHORIZED! :no_entry:');
|
|
}
|
|
break;
|
|
case "srestart":
|
|
if (msg.author.id == process.env.ADMIN) {
|
|
msg.reply('Server Restarting...');
|
|
exec("taskkill /im \"RCCServiceSOAP.exe\" /t");
|
|
exec("cd C:\\RCCSoap && start RCCServiceSOAP.bat 530");
|
|
} else {
|
|
msg.reply('UNAUTHORIZED! :no_entry:');
|
|
}
|
|
break;
|
|
case "start":
|
|
if (msg.author.id == process.env.ADMIN) {
|
|
if(messageArray.length <= 1)
|
|
{
|
|
msg.reply('Missing Parameter `Port`');
|
|
return;
|
|
}
|
|
isRunning('RCCServiceSOAP.exe', (status) => {
|
|
if (status)
|
|
{
|
|
msg.reply("RCCService.exe is already open.");
|
|
return;
|
|
}
|
|
exec(`cd C:\\RCCSoap && start RCCServiceSOAP.bat ${messageArray[1]}`);
|
|
defport = messageArray[1]
|
|
msg.reply(`Started on port ${messageArray[1]}!`)
|
|
.then(msg => bot.destroy())
|
|
.then(() => bot.login(TOKEN));
|
|
});
|
|
}
|
|
else
|
|
{
|
|
msg.reply('UNAUTHORIZED! :no_entry:');
|
|
}
|
|
break;
|
|
case "stop":
|
|
if (msg.author.id == process.env.ADMIN) {
|
|
exec(`taskkill /im "RCCServiceSOAP.exe" /t`);
|
|
msg.reply('Server Stopped! :white_check_mark:')
|
|
.then(msg => bot.destroy())
|
|
.then(() => bot.login(TOKEN));
|
|
} else {
|
|
msg.reply('UNAUTHORIZED! :no_entry:');
|
|
}
|
|
break;
|
|
case "vc":
|
|
exec(`rccscreenshot.exe`);
|
|
setTimeout(function(){
|
|
screenshot(msg);
|
|
}, 500);
|
|
break;
|
|
case "viewconsole":
|
|
exec(`rccscreenshot.exe`);
|
|
setTimeout(function(){
|
|
screenshot(msg);
|
|
}, 500);
|
|
break;
|
|
case "vg":
|
|
viewgame(msg);
|
|
break;
|
|
case "viewgame":
|
|
viewgame(msg);
|
|
break;
|
|
case "x":
|
|
if(messageArray.length <= 1)
|
|
{
|
|
msg.reply('Missing Parameter `Script`');
|
|
return;
|
|
}
|
|
execute(message, msg);
|
|
break;
|
|
case "execute":
|
|
if(messageArray.length <= 1)
|
|
{
|
|
msg.reply('Missing Parameter `Script`');
|
|
return;
|
|
}
|
|
execute(message, msg);
|
|
break;
|
|
case "helloworld":
|
|
HelloWorld(msg)
|
|
break;
|
|
case "votereset":
|
|
votereset(msg);
|
|
break;
|
|
}
|
|
|
|
async function votereset(msg)
|
|
{
|
|
if (currentvote)
|
|
{
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setDescription("A vote reset has already been started!")
|
|
.setColor('#FA7513')
|
|
.addField("Jump to message", `[Click Here](https://discord.com/channels/${msg.guild.id}/${msg.channel.id}/${msgid})`)
|
|
.setTimestamp()
|
|
msg.channel.send(exampleEmbed);
|
|
return;
|
|
}
|
|
else {
|
|
currentvote = true;
|
|
}
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setTitle("Vote Reset has Started!")
|
|
.setDescription("Use reactions to vote! Vote will be ending in 30 seconds.")
|
|
.setColor('#0099ff')
|
|
.setTimestamp()
|
|
msg.channel.send(exampleEmbed).then(function (message) {
|
|
message.react("👍")
|
|
message.react("👎")
|
|
msgid = message.id;
|
|
setTimeout(function(){
|
|
try {
|
|
voteconcluded(msg);
|
|
}
|
|
catch{}
|
|
}, 30000);
|
|
});
|
|
}
|
|
|
|
function voteconcluded(msg) {
|
|
var result = thumbsup >= thumbsdown;
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setTitle("The vote reset has been concluded!")
|
|
.setDescription(result ? "The vote has won, RCC is being resetted..." : "The vote has lost!")
|
|
.setColor(result ? '#0099ff': '#FA7513')
|
|
.setTimestamp()
|
|
msg.channel.send(exampleEmbed);
|
|
currentvote = false;
|
|
thumbsdown = thumbsup = 0;
|
|
msgid = "0";
|
|
if (result)
|
|
{
|
|
exec("taskkill /im \"RCCServiceSOAP.exe\" /t");
|
|
exec("cd C:\\RCCSoap && start RCCServiceSOAP.bat 530");
|
|
}
|
|
}
|
|
|
|
function screenshot(msg){
|
|
if (!fs.existsSync("screenshot.png")) {
|
|
msg.reply("An Unknown Error has occurred, Is RCC Running?");
|
|
return;
|
|
}
|
|
|
|
msg.channel.send({ files: ['./screenshot.png'] });
|
|
|
|
setTimeout(function(){
|
|
try {
|
|
fs.unlinkSync("screenshot.png");
|
|
}
|
|
catch{}
|
|
}, 2000);
|
|
}
|
|
|
|
async function PrintEmbedOfLuaTypes(msg, value, luatype){
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setColor('#0099ff')
|
|
.setAuthor('RCCService.exe', 'https://i.imgur.com/52zkGiZ.png')
|
|
.addFields(
|
|
{ name: 'Return Data:', value: value, inline: true},
|
|
{ name: 'Lua Type:', value: luatype, inline: true},
|
|
)
|
|
.setTimestamp()
|
|
msg.channel.send(exampleEmbed);
|
|
}
|
|
|
|
async function contentVarible(content2) {
|
|
return `<?xml version="1.0" encoding="UTF - 8"?>
|
|
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://roblox.com/RCCServiceSoap" xmlns:ns1="http://roblox.com/" xmlns:ns3="http://roblox.com/RCCServiceSoap12"><SOAP-ENV:Body>
|
|
${content2}
|
|
</SOAP-ENV:Body></SOAP-ENV:Envelope>`
|
|
}
|
|
|
|
async function ErrorOccurred(msg, e)
|
|
{
|
|
msg.reply("An error has occurred! :x:");
|
|
console.error(e);
|
|
}
|
|
|
|
async function CreateEmbed(msg,color,title,field) {
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setColor(color)
|
|
.setTitle(title)
|
|
.setAuthor('RCCService.exe', 'https://i.imgur.com/52zkGiZ.png')
|
|
.addFields(
|
|
{ name: 'Message', value: "```" + `${field}`+"```", inline: true },
|
|
)
|
|
msg.channel.send(exampleEmbed)
|
|
}
|
|
|
|
async function HelloWorld(msg){
|
|
const adsads = https.request(options, res => {
|
|
res.setEncoding('utf8');
|
|
res.on('data', function (chunk) {
|
|
try {
|
|
var parsedXML = parser.parse(chunk);
|
|
CreateEmbed(msg, "#008000", "Hello World!", parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:HelloWorldResponse"]["ns1:HelloWorldResult"])
|
|
} catch(e) {console.error(e)}
|
|
})
|
|
})
|
|
var HelloWorldContent = "<ns1:HelloWorld></ns1:HelloWorld>";
|
|
console.log(await contentVarible(HelloWorldContent))
|
|
adsads.write(await contentVarible(HelloWorldContent));
|
|
adsads.end();
|
|
|
|
|
|
}
|
|
|
|
async function viewgame(msg){
|
|
try {
|
|
const request = https.request(options, res => {
|
|
res.setEncoding('utf8');
|
|
var body = '';
|
|
var chunks = [];
|
|
res.on('readable', function () {
|
|
var chunk = this.read() || '';
|
|
|
|
body += chunk;
|
|
});
|
|
|
|
res.on('end', function () {
|
|
var parsedXML = parser.parse(body)
|
|
let image = new Buffer.from(parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"][0]["ns1:value"], "base64")
|
|
fs.writeFile("out.png", image, 'base64', function(err) {
|
|
console.log(err);
|
|
});
|
|
msg.channel.send({ files: ['./out.png'] });
|
|
});
|
|
})
|
|
var content2 = `<ns1:Execute>
|
|
<ns1:jobID>Test</ns1:jobID>
|
|
<ns1:script>
|
|
<ns1:name>SOAP</ns1:name>
|
|
<ns1:script>
|
|
return game:GetService("ThumbnailGenerator"):Click("PNG", 4000, 2000, true)</ns1:script>
|
|
<ns1:arguments>
|
|
</ns1:arguments>
|
|
</ns1:script>
|
|
</ns1:Execute>`;
|
|
//console.log(await contentVarible(content2))
|
|
request.write(await contentVarible(content2));
|
|
request.end();
|
|
}
|
|
catch{ msg.reply("An Unknown Error has occurred, Is RCC Running?"); }
|
|
}
|
|
|
|
async function execute(message, msg){
|
|
message = message.substring(message.indexOf(" ") + 1);
|
|
if (msg.author.id == "3600780812240814059" || msg.author.id == "632025609970647051") {msg.reply("**Unauthorized!**"); return;}
|
|
if (message.includes("HttpGet") || message.includes("HttpPost") || message.includes("fenv") || message.includes("while true do") || message.includes("SetUploadUrl") || message.includes("crash__") || message.includes("ModuleScript") || message.includes("\\77") || message.includes("\\11") || message.includes("do print(\"") || message.includes("do print()") || message.includes("math.huge do") || message.includes(":ExecuteScript")) {msg.reply("**CENSORED CODE DETECTED!** :no_entry: "); return;}
|
|
if (message.startsWith("`") && message.endsWith("`"))
|
|
{
|
|
if (message.startsWith("```") && message.endsWith("```")) message = message.substring(message.startsWith("```lua") ? 6 : 3, message.length - 3); else message = message.substring(1, message.length - 1);
|
|
}
|
|
//console.log(message);
|
|
const req = https.request(options, res => { //go on?
|
|
//console.log('STATUS: ' + res.statusCode);
|
|
//console.log('HEADERS: ' + JSON.stringify(res.headers));
|
|
res.setEncoding('utf8');
|
|
res.on('data', function (chunk) {
|
|
//console.log('BODY: ' + chunk);
|
|
//console.log(chunk)
|
|
try {
|
|
var parsedXML = parser.parse(chunk)
|
|
} catch(e) {ErrorOccurred(msg,e);}
|
|
//console.log(parsedXML)
|
|
// console.log(parsedXML['SOAP-ENV:Fault']);
|
|
//var tObj = parser.getTraversalObj(chunk,xmlOptions);
|
|
// var jsonObj = parser.convertToJson(tObj,xmlOptions);
|
|
if (parsedXML["SOAP-ENV:Envelope"] && parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"] && parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["SOAP-ENV:Fault"] != undefined) ***REMOVED***
|
|
{
|
|
var errormsg = parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["SOAP-ENV:Fault"]["faultstring"];
|
|
var noline = !errormsg.startsWith("SOAP");
|
|
if (!noline)
|
|
{
|
|
var parsed = errormsg.split(":");
|
|
var line = parsed[1];
|
|
var message = parsed[2];
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setColor('#F60E0E')
|
|
.setTitle('An error has occurred!')
|
|
.setAuthor('RCCService.exe', 'https://i.imgur.com/52zkGiZ.png')
|
|
.addFields(
|
|
{ name: 'Message', value: message, inline: true },
|
|
{ name: 'Line', value: line, inline: true }
|
|
)
|
|
.setTimestamp()
|
|
msg.channel.send(exampleEmbed);
|
|
}
|
|
else
|
|
{
|
|
try {
|
|
const exampleEmbed = new Discord.MessageEmbed()
|
|
.setColor('#F60E0E')
|
|
.setTitle('An error has occurred!')
|
|
.setAuthor('RCCService.exe', 'https://i.imgur.com/52zkGiZ.png')
|
|
.addFields(
|
|
{ name: 'Message', value: errormsg, inline: true },
|
|
)
|
|
.setTimestamp()
|
|
msg.channel.send(exampleEmbed);
|
|
} catch(e){
|
|
msg.channel.send(`An error has occurred:\n\`\`\`${e}\`\`\``);
|
|
}
|
|
}
|
|
//msg.reply(errormsg);
|
|
}
|
|
else if (parsedXML["SOAP-ENV:Envelope"] && parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"] && parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"] != undefined) //&& parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["SOAP-ENV:ExecuteResponse"]["SOAP-ENV:ExecuteResult"] != undefined) {
|
|
if (parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"])
|
|
{
|
|
var LuaType = parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"]["ns1:type"]
|
|
switch (LuaType)
|
|
{
|
|
case "LUA_TSTRING":
|
|
PrintEmbedOfLuaTypes(msg,parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"]["ns1:value"], LuaType)
|
|
break;
|
|
case "LUA_TBOOLEAN":
|
|
PrintEmbedOfLuaTypes(msg,parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"]["ns1:value"] ? "true" : "false", LuaType)
|
|
break;
|
|
case "LUA_TTABLE":
|
|
//parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["SOAP-ENV:ExecuteResponse"]["SOAP-ENV:ExecuteResult"]["ns1:table"]
|
|
console.log(parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"]["ns1:table"])
|
|
PrintEmbedOfLuaTypes(msg, `\`\`\`json\n${JSON.stringify(parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"]["ns1:table"])}\`\`\``, LuaType)
|
|
break;
|
|
case "LUA_TNUMBER":
|
|
PrintEmbedOfLuaTypes(msg,parsedXML["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:ExecuteResponse"]["ns1:ExecuteResult"]["ns1:value"], LuaType)
|
|
break;
|
|
default:
|
|
msg.reply("Unknown Return Type!");
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
else{
|
|
msg.reply("Executed! :white_check_mark:");
|
|
}
|
|
|
|
});
|
|
})
|
|
|
|
req.on('error', error => {
|
|
console.error(error);
|
|
})
|
|
|
|
var content2 = ` <ns1:Execute>
|
|
<ns1:jobID>Test</ns1:jobID>
|
|
<ns1:script>
|
|
<ns1:name>SOAP</ns1:name>
|
|
<ns1:script>${message}</ns1:script>
|
|
<ns1:arguments>
|
|
</ns1:arguments>
|
|
</ns1:script>
|
|
</ns1:Execute>`;
|
|
|
|
var content = await contentVarible(content2);
|
|
|
|
req.write(content);
|
|
req.end();
|
|
}
|
|
});
|
|
|
|
bot.on('messageReactionAdd', (messageReaction, user) => {
|
|
if(user.bot) return;
|
|
const { message, emoji } = messageReaction;
|
|
if(message.id === msgid) {
|
|
switch(emoji.name){
|
|
case "👍":
|
|
thumbsup++;
|
|
break;
|
|
case "👎":
|
|
thumbsdown++;
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
|
|
bot.on('messageReactionRemove', (messageReaction, user) => {
|
|
if(user.bot) return;
|
|
const { message, emoji } = messageReaction;
|
|
|
|
if(message.id === msgid) {
|
|
switch(emoji.name){
|
|
case "👍":
|
|
thumbsup--;
|
|
break;
|
|
case "👎":
|
|
thumbsdown--;
|
|
break;
|
|
}
|
|
}
|
|
});
|