import aiohttp
import asyncio
import certifi
import ssl
BASE_URL = 'https://editor.netsblox.org'
SSL_CONTEXT = ssl.create_default_context(cafile = certifi.where())
def escape(s: str) -> str:
return s.replace('"', '\\"')
async def main():
async with aiohttp.ClientSession() as session:
async with session.get(f'{BASE_URL}/services', ssl = SSL_CONTEXT) as res:
services_meta = await res.json(content_type = None) services = [x['name'] for x in services_meta]
services.sort()
async def get_rpcs(service: str):
async with session.get(f'{BASE_URL}/services/{service}', ssl = SSL_CONTEXT) as res:
raw = await res.json(content_type = None) rpcs = [(k, [x['name'] for x in v['args']]) for k, v in raw['rpcs'].items()]
rpcs.sort(key = lambda v: v[0])
return rpcs
rpcs_meta = await asyncio.gather(*[asyncio.ensure_future(get_rpcs(x)) for x in services])
with open('src/rpcs.rs', 'w') as f:
f.write("pub(crate) const SERVICE_INFO: &'static [(&'static str, &'static [(&'static str, &'static [&'static str])])] = [\n")
for i in range(len(services)):
service = services[i]
rpcs = rpcs_meta[i]
f.write(f' ("{escape(service)}", [\n')
for rpc, args in rpcs:
trans_args = [f'"{escape(x)}"' for x in args]
f.write(f' ("{escape(rpc)}", [{", ".join(trans_args)}].as_slice()),\n')
f.write(' ].as_slice()),\n')
f.write('].as_slice();')
def main_sync():
loop = asyncio.new_event_loop()
loop.run_until_complete(main())
loop.run_until_complete(asyncio.sleep(1)) loop.close()
if __name__ == '__main__':
main_sync()