Removed watchdog :/

This commit is contained in:
Casey 2024-07-07 19:27:41 +03:00
parent 29ee0546c3
commit 5df9dd4598
Signed by: hkc
GPG Key ID: F0F6CFE11CDB0960
2 changed files with 154 additions and 179 deletions

View File

@ -1,7 +1,7 @@
import asyncio import asyncio
from typing import Callable, NewType, Optional from typing import Callable, NewType, Optional
from socketio import AsyncClient, AsyncSimpleClient from socketio import AsyncClient, AsyncSimpleClient
from aiohttp import ClientSession from aiohttp import ClientSession, ClientTimeout
from aiohttp_socks import ProxyConnector from aiohttp_socks import ProxyConnector
from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageSequence, ImageChops from PIL import Image, ImageFont, ImageDraw, ImageFilter, ImageSequence, ImageChops
from base64 import b64decode from base64 import b64decode
@ -15,6 +15,8 @@ PixelMap = NewType("PixelMap", dict[int, bool])
Animation = NewType("Animation", tuple[list[PixelMap], float]) Animation = NewType("Animation", tuple[list[PixelMap], float])
Font = ImageFont.FreeTypeFont | ImageFont.ImageFont Font = ImageFont.FreeTypeFont | ImageFont.ImageFont
TIMEOUT = ClientTimeout(120)
class AsyncBotManager: class AsyncBotManager:
def __init__(self, base: str = "https://onemillioncheckboxes.com"): def __init__(self, base: str = "https://onemillioncheckboxes.com"):
self.base = base self.base = base
@ -38,6 +40,7 @@ class AsyncBotManager:
self._active: set[int] = set() self._active: set[int] = set()
self.reader_event = asyncio.Event() self.reader_event = asyncio.Event()
self.ready_event = asyncio.Event()
@staticmethod @staticmethod
def get_text_image(text: str, font: ImageFont.ImageFont | ImageFont.FreeTypeFont) -> Image.Image: def get_text_image(text: str, font: ImageFont.ImageFont | ImageFont.FreeTypeFont) -> Image.Image:
@ -143,17 +146,19 @@ class AsyncBotManager:
async def listener(self) -> None: async def listener(self) -> None:
try: try:
async with ClientSession() as http: async with ClientSession(timeout=TIMEOUT) as http:
print("Getting initial state")
async with http.get(f"{self.base}/api/initial-state") as req: async with http.get(f"{self.base}/api/initial-state") as req:
data = await req.json() data = await req.json()
buffer = b64decode(data["full_state"].encode() + b"=") buffer = b64decode(data["full_state"].encode() + b"=")
self.canvas.paste(Image.frombytes("1", (1000, 1000), buffer)) self.canvas.paste(Image.frombytes("1", (1000, 1000), buffer))
self._last_update = data["timestamp"] self._last_update = data["timestamp"]
print("Initial state received")
async with AsyncSimpleClient(http_session=http) as sio: async with AsyncSimpleClient(http_session=http) as sio:
await sio.connect(f"{self.base}/socket.io") await sio.connect(f"{self.base}/socket.io")
while not self._shutdown: while not self._shutdown:
try: try:
async with asyncio.timeout(10): async with asyncio.timeout(20):
event, data = await sio.receive() event, data = await sio.receive()
except TimeoutError: except TimeoutError:
print("Reading failed") print("Reading failed")
@ -162,6 +167,7 @@ class AsyncBotManager:
await sio.connect(f"{self.base}/socket.io") await sio.connect(f"{self.base}/socket.io")
continue continue
self.reader_event.set() self.reader_event.set()
self.ready_event.set()
if event == "full_state": if event == "full_state":
buffer = b64decode(data["full_state"].encode() + b"=") buffer = b64decode(data["full_state"].encode() + b"=")
image = Image.frombytes("1", (1000, 1000), buffer) image = Image.frombytes("1", (1000, 1000), buffer)
@ -191,7 +197,7 @@ class AsyncBotManager:
print(f"I/O: {incoming:7.2f}/s | {outgoing:7.2f}/s") print(f"I/O: {incoming:7.2f}/s | {outgoing:7.2f}/s")
print(f"Alive workers: {len(self._active)}") print(f"Alive workers: {len(self._active)}")
if len(self._active) < 5: if len(self._active) < 2:
self._shutdown = True self._shutdown = True
return return
@ -230,9 +236,11 @@ class AsyncBotManager:
delay: float = 0.25, delay: float = 0.25,
): ):
proxy = ProxyConnector.from_url(proxy_url) if proxy_url else None proxy = ProxyConnector.from_url(proxy_url) if proxy_url else None
async with ClientSession(connector=proxy) as http: await self.ready_event.wait()
async with ClientSession(connector=proxy, timeout=TIMEOUT) as http:
async with AsyncSimpleClient(http_session=http) as sio: async with AsyncSimpleClient(http_session=http) as sio:
await sio.connect(f"{self.base}/socket.io") await sio.connect(f"{self.base}/socket.io")
print(f"Writer {bot_index} connected")
offset = 0 offset = 0
while not self._shutdown: while not self._shutdown:
diff = list(self.difference.items()) diff = list(self.difference.items())
@ -262,22 +270,7 @@ async def amain() -> None:
with open("settings.json", "r") as fp: with open("settings.json", "r") as fp:
settings = load(fp) settings = load(fp)
mgr = AsyncBotManager() async with AsyncBotManager() as mgr:
async def watchdog():
listener_task = asyncio.create_task(mgr.listener(), name="Listener")
while True:
try:
async with asyncio.timeout(30):
await mgr.reader_event.wait()
except TimeoutError:
print("WATCHDOG TIMER PASSED")
listener_task.cancel()
listener_task = asyncio.create_task(mgr.listener())
watchdog_task = asyncio.create_task(watchdog(), name="Watchdog")
for avoid in settings["avoid"]: for avoid in settings["avoid"]:
if avoid["type"] == "rect": if avoid["type"] == "rect":
mgr.add_avoid_rect( mgr.add_avoid_rect(
@ -427,7 +420,6 @@ async def amain() -> None:
print("RETURN", repr(ret)) print("RETURN", repr(ret))
mgr._shutdown = True mgr._shutdown = True
watchdog_task.cancel()
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -1,9 +1,12 @@
{ {
"url": "https://onemillioncheckboxes.com", "url": "https://onemillioncheckboxes.com",
"font": "./ic8x8u.ttf", "font": "./ic8x8u.ttf",
"proxies": [], "proxies": [
"n_bots": 5, "",
"delay": 0.125, "socks5://127.0.0.1:9999"
],
"n_bots": 4,
"delay": 0.5,
"avoid": [ "avoid": [
{ {
"type": "rect", "type": "rect",
@ -57,26 +60,6 @@
"x": 0, "x": 0,
"y": 128 "y": 128
}, },
{
"type": "rgb565",
"path": "./pictures/niko_standing.png",
"x": 116,
"y": 132
},
{
"type": "rgb565",
"path": "./pictures/hello.png",
"x": 112,
"y": 203
},
{
"type": "text",
"font": "/usr/share/fonts/TTF/comic.ttf",
"size": 20,
"x": 250,
"y": 492,
"text": "You like kissing, don't you?"
},
{ {
"type": "animation", "type": "animation",
"path": "./pictures/neko.gif", "path": "./pictures/neko.gif",