MonkeyBusiness/pyeamu.py

104 lines
3.1 KiB
Python
Raw Normal View History

2022-08-26 10:39:11 +00:00
from urllib.parse import urlunparse, urlencode
import uvicorn
from fastapi import FastAPI, Request, Response
import config
import modules
from core_common import core_process_request, core_prepare_response, E
2022-11-15 14:03:37 +00:00
def urlpathjoin(parts, sep="/"):
2022-08-26 10:39:11 +00:00
return sep + sep.join([x.lstrip(sep) for x in parts])
server_address = f"{config.ip}:{config.port}"
2022-11-15 14:03:37 +00:00
server_services_url = urlunparse(
("http", server_address, config.services_prefix, None, None, None)
)
2022-09-05 23:42:04 +00:00
keepalive_address = "127.0.0.1"
2022-08-26 10:39:11 +00:00
app = FastAPI()
for router in modules.routers:
app.include_router(router)
if __name__ == "__main__":
print("https://github.com/drmext/MonkeyBusiness")
print(" __ __ _ ")
print("| \/ | ___ _ __ | | _____ _ _ ")
print("| |\/| |/ _ \| '_ \| |/ / _ \ | | |")
print("| | | | (_) | | | | < __/ |_| |")
print("|_| |_|\___/|_| |_|_|\_\___|\__, |")
print(" |___/ ")
print(" ____ _ ")
print("| __ ) _ _ ___(_)_ __ ___ ___ ___ ")
print("| _ \| | | / __| | '_ \ / _ \/ __/ __|")
print("| |_) | |_| \__ \ | | | | __/\__ \__ \\")
print("|____/ \__,_|___/_|_| |_|\___||___/___/")
print()
print(f"<services>{server_services_url}</services>")
2022-11-15 14:03:37 +00:00
print('<url_slash __type="bool">1</url_slash>')
2022-08-26 10:39:11 +00:00
print()
uvicorn.run("pyeamu:app", host=config.ip, port=config.port, reload=True)
@app.post(urlpathjoin([config.services_prefix, "/{gameinfo}/services/get"]))
async def services_get(request: Request):
request_info = await core_process_request(request)
services = {}
for service in modules.routers:
2022-11-15 14:03:37 +00:00
model_blacklist = services.get("model_blacklist", [])
model_whitelist = services.get("model_whitelist", [])
2022-08-26 10:39:11 +00:00
2022-11-15 14:03:37 +00:00
if request_info["model"] in model_blacklist:
2022-08-26 10:39:11 +00:00
continue
2022-11-15 14:03:37 +00:00
if model_whitelist and request_info["model"] not in model_whitelist:
2022-08-26 10:39:11 +00:00
continue
2022-11-15 14:03:37 +00:00
k = (service.tags[0] if service.tags else service.prefix).strip("/")
2022-08-26 10:39:11 +00:00
if k not in services:
2022-11-15 14:03:37 +00:00
services[k] = urlunparse(
("http", server_address, service.prefix, None, None, None)
)
2022-08-26 10:39:11 +00:00
keepalive_params = {
2022-09-05 23:42:04 +00:00
"pa": keepalive_address,
"ia": keepalive_address,
"ga": keepalive_address,
"ma": keepalive_address,
2022-08-26 10:39:11 +00:00
"t1": 2,
"t2": 10,
}
2022-11-15 14:03:37 +00:00
services["keepalive"] = urlunparse(
(
"http",
keepalive_address,
"/keepalive",
None,
urlencode(keepalive_params),
None,
)
)
services["ntp"] = urlunparse(("ntp", "pool.ntp.org", "/", None, None, None))
services["services"] = urlunparse(
("http", server_address, "/core", None, None, None)
)
2022-08-26 10:39:11 +00:00
response = E.response(
E.services(
expire=10800,
2022-11-15 14:03:37 +00:00
mode="operation",
2022-08-26 10:39:11 +00:00
product_domain=1,
2022-11-15 14:03:37 +00:00
*[E.item(name=k, url=services[k]) for k in services],
2022-08-26 10:39:11 +00:00
)
)
response_body, response_headers = await core_prepare_response(request, response)
return Response(content=response_body, headers=response_headers)