const fetch = (...args) =>
import("node-fetch").then(({ default: fetch }) => fetch(...args))
let controller = new AbortController()
require("dotenv").config()
const RCC_HOST = process.env.RCC_HOST
var convert = require("xml-js")
let url = "http://" + RCC_HOST + ":8000" // change this to rcc soap
async function OpenGame(jobid, port, ip, placeid, creatorid) {
return new Promise(async (resolve, reject) => {
let json = {
Mode: "GameServer",
GameId: "game1",
Settings: {
IsRobloxPlace: false,
PlaceId: 1,
CreatorId: 1,
GameId: "00000000-0000-0000-0000-000000000132",
GsmInterval: 50,
MaxPlayers: 100,
MaxGameInstances: 52,
ApiKey: "egg",
GameCode: "AAAAAAAAAAAAAA-a",
PreferredPlayerCapacity: 10,
DatacenterId: 1,
PlaceVisitAccessKey: "rbx_evt_ftp",
UniverseId: 13058,
PlaceFetchUrl: "https://mete0r.xyz/asset?id=11",
MatchmakingContextId: 1,
CreatorType: "User",
PlaceVersion: 123,
BaseUrl: "mete0r.xyz",
MachineAddress: "localhost",
JobId: "game1",
PreferredPort: 53640,
},
}
json.GameId = jobid
json.Settings.PreferredPort = port
json.Settings.MachineAddress = ip
json.Settings.JobId = jobid
json.Settings.PlaceId = parseFloat(placeid)
json.Settings.UniverseId = json.Settings.PlaceId
json.Settings.CreatorId = creatorid
json.Settings.GameId = jobid
let xml = `
${jobid}
60
2
1
game1
${JSON.stringify(json)}
`
//console.log(encodeURIComponent(JSON.stringify(json)))
try {
const result = await fetch(
url +
"/opengame/" +
jobid +
"/" +
encodeURIComponent(JSON.stringify(json)),
)
const data = await result.text()
return resolve(data)
} catch (error) {
return reject(error)
}
})
}
async function OpenGame2020(jobid, port, ip, placeid, creatorid) {
return new Promise(async (resolve, reject) => {
let json = {
Mode: "GameServer",
GameId: "game1",
Settings: {
IsRobloxPlace: false,
PlaceId: 1,
CreatorId: 1,
GameId: "00000000-0000-0000-0000-000000000132",
GsmInterval: 50,
MaxPlayers: 100,
MaxGameInstances: 52,
ApiKey: "egg",
GameCode: "AAAAAAAAAAAAAA-a",
PreferredPlayerCapacity: 10,
DatacenterId: 1,
PlaceVisitAccessKey: "rbx_evt_ftp",
UniverseId: 13058,
PlaceFetchUrl: "https://mete0r.xyz/asset?id=11",
MatchmakingContextId: 1,
CreatorType: "User",
PlaceVersion: 123,
BaseUrl: "mete0r.xyz",
MachineAddress: "localhost",
JobId: "game1",
PreferredPort: 53640,
},
}
json.GameId = jobid
json.Settings.PreferredPort = port
json.Settings.MachineAddress = ip
json.Settings.JobId = jobid
json.Settings.PlaceId = parseFloat(placeid)
json.Settings.UniverseId = json.Settings.PlaceId
json.Settings.CreatorId = creatorid
json.Settings.GameId = jobid
json.Settings.PlaceFetchUrl =
"https://mete0r.xyz/asset?id=" + parseFloat(placeid)
let xml = `
${jobid}
60
2
1
game1
${JSON.stringify(json)}
`
//console.log(encodeURIComponent(JSON.stringify(json)))
try {
const result = await fetch(
url +
"/opengame2020/" +
jobid +
"/" +
encodeURIComponent(JSON.stringify(json)),
)
const data = await result.text()
return resolve(data)
} catch (error) {
return reject(error)
}
})
}
async function CloseJob(jobid) {
return new Promise(async (resolve, reject) => {
var xml = {
_declaration: {
_attributes: { version: "1.0", encoding: "UTF - 8" },
},
"SOAP-ENV:Envelope": {
_attributes: {
"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": {
"ns1:CloseJob": {
"ns1:jobID": { _text: "Test" },
},
},
},
}
xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:CloseJob"][
"ns1:jobID"
]._text = jobid
const body = convert.js2xml(xml, { compact: true, spaces: 4 })
try {
const result = await fetch(url + "/closejob/" + jobid)
const data = await result.text()
return resolve(data)
} catch (error) {
return reject(error)
}
})
}
async function OpenRender(userid, closeup) {
return new Promise(async (resolve, reject) => {
try {
const result = await fetch(
url + "/openrender/" + userid + "/" + closeup,
)
const data = await result.text()
//console.log(data)
if (data === '{"status": "error","error":"Already started"}') {
return resolve(JSON.parse(data))
}
const convertedData = convert.xml2js(data, {
compact: true,
spaces: 4,
})
return resolve(convertedData)
} catch (error) {
return reject(error)
}
})
}
async function OpenRenderAsset(assetid, type) {
return new Promise(async (resolve, reject) => {
try {
const result = await fetch(
url + "/openrenderasset/" + assetid + "/" + type,
)
const data = await result.text()
//console.log(data)
if (data === '{"status": "error","error":"Already started"}') {
return resolve(JSON.parse(data))
}
const convertedData = convert.xml2js(data, {
compact: true,
spaces: 4,
})
return resolve(convertedData)
} catch (error) {
return reject(error)
}
})
}
async function lol2() {
const lol = await OpenRender(0)
console.log(
lol["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:OpenJobResponse"][
"ns1:OpenJobResult"
][0]["ns1:value"]._text,
)
}
async function RenewLease(jobid, expiration) {
return new Promise(async (resolve, reject) => {
var xml = {
_declaration: {
_attributes: { version: "1.0", encoding: "UTF-8" },
},
"SOAP-ENV:Envelope": {
_attributes: {
"xmlns:SOAP-ENV":
"http://schemas.xmlsoap.org/soap/envelope/",
"xmlns:ns1": "http://roblox.com/",
"xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
},
"SOAP-ENV:Body": {
"ns1:RenewLease": {
"ns1:jobID": { _text: "Test" },
"ns1:expirationInSeconds": { _text: "100" },
},
},
},
}
xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][
"ns1:jobID"
]._text = jobid
xml["SOAP-ENV:Envelope"]["SOAP-ENV:Body"]["ns1:RenewLease"][
"ns1:expirationInSeconds"
]._text = expiration
const body = convert.js2xml(xml, { compact: true, spaces: 4 })
try {
const result = await fetch(
url + "/renewlease/" + jobid + "/" + expiration,
)
const data = await result.text()
return resolve(data)
} catch (error) {
return reject(error)
}
})
}
async function Execute(jobid, json) {
return new Promise(async (resolve, reject) => {
try {
const result = await fetch(
url +
"/executejson/" +
jobid +
"/" +
encodeURIComponent(JSON.stringify(json)),
)
const data = await result.text()
return resolve(data)
} catch (error) {
return reject(error)
}
})
}
async function GetAllJobs() {
return new Promise(async (resolve, reject) => {
const xmlData = (xml = {
_declaration: {
_attributes: { version: "1.0", encoding: "UTF - 8" },
},
"SOAP-ENV:Envelope": {
_attributes: {
"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": { "ns1:GetAllJobsEx": {} },
},
})
const body = convert.js2xml(xmlData, { compact: true, spaces: 4 })
try {
const result = await fetch(url, { method: "POST", body })
const data = await result.text()
const convertedData = convert.xml2js(data, {
compact: true,
spaces: 4,
})
return resolve(
convertedData["SOAP-ENV:Envelope"]["SOAP-ENV:Body"][
"ns1:GetAllJobsExResponse"
]["ns1:GetAllJobsExResult"],
)
} catch (error) {
return reject(error)
}
})
}
//RenewLease('game2',"69530318916789546987353800")
async function lol() {
let res = await GetAllJobs()
//console.dir(res,{ depth: null })
let exists = false
if (res != "{}") {
if (Array.isArray(res["ns1:Job"]) === false) {
console.log("asd")
//console.log(res['ns1:Job']['ns1:id']._text)
if (res["ns1:Job"]["ns1:id"]._text === "game2") {
exists = true
}
} else {
res["ns1:Job"].forEach(element => {
if (element["ns1:id"]?._text === "game2") {
exists = true
}
})
}
}
console.log(exists)
}
//lol()
//GetAllJobs()
//OpenGame('game2','3333','127.0.0.1','2')
module.exports = {
OpenGame,
CloseJob,
RenewLease,
GetAllJobs,
OpenRender,
OpenRenderAsset,
OpenGame2020,
Execute,
}