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}