mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-15 18:13:40 +03:00
120 lines
4.0 KiB
Python
120 lines
4.0 KiB
Python
from aiohttp import ClientSession
|
|
from injector import inject_to_tab
|
|
import uuid
|
|
|
|
class Utilities:
|
|
def __init__(self, context) -> None:
|
|
self.context = context
|
|
self.util_methods = {
|
|
"ping": self.ping,
|
|
"http_request": self.http_request,
|
|
"confirm_plugin_install": self.confirm_plugin_install,
|
|
"execute_in_tab": self.execute_in_tab,
|
|
"inject_css_into_tab": self.inject_css_into_tab,
|
|
"remove_css_from_tab": self.remove_css_from_tab,
|
|
"open_plugin_store": self.open_plugin_store
|
|
}
|
|
|
|
async def confirm_plugin_install(self, request_id):
|
|
return await self.context.plugin_browser.confirm_plugin_install(request_id)
|
|
|
|
async def http_request(self, method="", url="", **kwargs):
|
|
async with ClientSession() as web:
|
|
async with web.request(method, url, **kwargs) as res:
|
|
return {
|
|
"status": res.status,
|
|
"headers": dict(res.headers),
|
|
"body": await res.text()
|
|
}
|
|
|
|
async def ping(self, **kwargs):
|
|
return "pong"
|
|
|
|
async def execute_in_tab(self, tab, run_async, code):
|
|
try:
|
|
result = await inject_to_tab(tab, code, run_async)
|
|
if "exceptionDetails" in result["result"]:
|
|
return {
|
|
"success": False,
|
|
"result": result["result"]
|
|
}
|
|
|
|
return {
|
|
"success": True,
|
|
"result" : result["result"]["result"].get("value")
|
|
}
|
|
except Exception as e:
|
|
return {
|
|
"success": False,
|
|
"result": e
|
|
}
|
|
|
|
async def inject_css_into_tab(self, tab, style):
|
|
try:
|
|
css_id = str(uuid.uuid4())
|
|
|
|
result = await inject_to_tab(tab,
|
|
f"""
|
|
(function() {{
|
|
const style = document.createElement('style');
|
|
style.id = "{css_id}";
|
|
document.head.append(style);
|
|
style.textContent = `{style}`;
|
|
}})()
|
|
""", False)
|
|
|
|
if "exceptionDetails" in result["result"]:
|
|
return {
|
|
"success": False,
|
|
"result": result["result"]
|
|
}
|
|
|
|
return {
|
|
"success": True,
|
|
"result" : css_id
|
|
}
|
|
except Exception as e:
|
|
return {
|
|
"success": False,
|
|
"result": e
|
|
}
|
|
|
|
async def remove_css_from_tab(self, tab, css_id):
|
|
try:
|
|
result = await inject_to_tab(tab,
|
|
f"""
|
|
(function() {{
|
|
let style = document.getElementById("{css_id}");
|
|
|
|
if (style.nodeName.toLowerCase() == 'style')
|
|
style.parentNode.removeChild(style);
|
|
}})()
|
|
""", False)
|
|
|
|
if "exceptionDetails" in result["result"]:
|
|
return {
|
|
"success": False,
|
|
"result": result
|
|
}
|
|
|
|
return {
|
|
"success": True
|
|
}
|
|
except Exception as e:
|
|
return {
|
|
"success": False,
|
|
"result": e
|
|
}
|
|
|
|
async def open_plugin_store(self):
|
|
await inject_to_tab("SP", """
|
|
(function() {
|
|
wpRequire = webpackJsonp.push([[], { get_require: (mod, _exports, wpRequire) => mod.exports = wpRequire }, [["get_require"]]]);
|
|
const all = () => Object.keys(wpRequire.c).map((x) => wpRequire.c[x].exports).filter((x) => x);
|
|
router = all().map(m => {
|
|
if (typeof m !== "object") return undefined;
|
|
for (let prop in m) { if (m[prop]?.Navigate) return m[prop]}
|
|
}).find(x => x)
|
|
router.NavigateToExternalWeb("http://127.0.0.1:1337/browser/redirect")
|
|
})();
|
|
""") |