summaryrefslogtreecommitdiff
path: root/plugin_loader/injector.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugin_loader/injector.py')
-rw-r--r--plugin_loader/injector.py85
1 files changed, 85 insertions, 0 deletions
diff --git a/plugin_loader/injector.py b/plugin_loader/injector.py
new file mode 100644
index 00000000..771d5c51
--- /dev/null
+++ b/plugin_loader/injector.py
@@ -0,0 +1,85 @@
+#Injector code from https://github.com/SteamDeckHomebrew/steamdeck-ui-inject. More info on how it works there.
+
+from aiohttp import ClientSession
+from logging import info
+from asyncio import sleep
+
+BASE_ADDRESS = "http://localhost:8080"
+
+class Tab:
+ def __init__(self, res) -> None:
+ self.title = res["title"]
+ self.id = res["id"]
+ self.ws_url = res["webSocketDebuggerUrl"]
+
+ self.websocket = None
+ self.client = None
+
+ async def open_websocket(self):
+ self.client = ClientSession()
+ self.websocket = await self.client.ws_connect(self.ws_url)
+
+ async def listen_for_message(self):
+ async for message in self.websocket:
+ yield message
+
+ async def _send_devtools_cmd(self, dc, receive=True):
+ if self.websocket:
+ await self.websocket.send_json(dc)
+ return (await self.websocket.receive_json()) if receive else None
+ raise RuntimeError("Websocket not opened")
+
+ async def evaluate_js(self, js):
+ await self.open_websocket()
+ res = await self._send_devtools_cmd({
+ "id": 1,
+ "method": "Runtime.evaluate",
+ "params": {
+ "expression": js,
+ "userGesture": True
+ }
+ })
+ await self.client.close()
+ return res
+
+ async def get_steam_resource(self, url):
+ await self.open_websocket()
+ res = await self._send_devtools_cmd({
+ "id": 1,
+ "method": "Runtime.evaluate",
+ "params": {
+ "expression": f'(async function test() {{ return await (await fetch("{url}")).text() }})()',
+ "userGesture": True,
+ "awaitPromise": True
+ }
+ })
+ await self.client.close()
+ return res["result"]["result"]["value"]
+
+ def __repr__(self):
+ return self.title
+
+async def get_tabs():
+ async with ClientSession() as web:
+ res = {}
+
+ while True:
+ try:
+ res = await web.get("{}/json".format(BASE_ADDRESS))
+ break
+ except:
+ print("Steam isn't available yet. Wait for a moment...")
+ await sleep(5)
+
+ if res.status == 200:
+ res = await res.json()
+ return [Tab(i) for i in res]
+ else:
+ raise Exception("/json did not return 200. {}".format(await res.text()))
+
+async def inject_to_tab(tab_name, js):
+ tabs = await get_tabs()
+ tab = next((i for i in tabs if i.title == tab_name), None)
+ if not tab:
+ raise ValueError("Tab {} not found in running tabs".format(tab_name))
+ info(await tab.evaluate_js(js))