From 41b904494fc8db6288bb45d46530a9ce17aaa6f6 Mon Sep 17 00:00:00 2001 From: hkc Date: Thu, 4 Jul 2024 12:13:10 +0300 Subject: [PATCH] Added *working* pwoxy support and [...] script to stream into ffmpeg for live preview --- .gitignore | 1 + async-bot.py | 25 +++++++++++++++++++------ casey565.png | Bin 0 -> 27081 bytes stream.py | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 casey565.png create mode 100644 stream.py diff --git a/.gitignore b/.gitignore index afb47ad..7f62b1f 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ image.png logs.txt rgb111-full.png state-new.json +settings.json diff --git a/async-bot.py b/async-bot.py index 08c06c3..4b76a23 100644 --- a/async-bot.py +++ b/async-bot.py @@ -3,7 +3,7 @@ import asyncio from typing import Optional from socketio import AsyncSimpleClient from aiohttp import ClientSession -from aiohttp_proxy import ProxyConnector +from aiohttp_socks import ProxyConnector from PIL import Image, ImageFont, ImageDraw, ImageFilter from base64 import b64decode from random import choice @@ -68,7 +68,7 @@ class AsyncBotManager: else: print("unknown event", event, data) - async def writer(self, proxy_url: Optional[str] = None): + async def writer(self, bot_index: int, proxy_url: Optional[str] = None): proxy = ProxyConnector.from_url(proxy_url) if proxy_url else None async with ClientSession(connector=proxy) as http: async with AsyncSimpleClient(http_session=http) as sio: @@ -77,14 +77,14 @@ class AsyncBotManager: try: event, data = await sio.receive(0.1) if event not in ("full_state", "batched_bit_toggles"): - print("!!!", event, data) + print(bot_index, "!!!", event, data) except Exception: pass index, target = choice(list(self.difference.items())) y, x = divmod(index, 1000) curr = self.canvas.getpixel((x, y)) > 0 # type: ignore if curr != target: - print("swap", x, y, index) + print(bot_index, "swap", x, y) await sio.emit("toggle_bit", { "index": index }) @@ -124,14 +124,27 @@ async def amain(): mgr.difference[ndx_start] = r > 128 mgr.difference[ndx_start + 1] = g > 128 mgr.difference[ndx_start + 2] = b > 128 + elif elem["type"] == "rgb565": + ox, oy = elem["x"], elem["y"] + with Image.open(elem["path"]).convert("RGB") as im: + for y in range(im.height): + for x in range(im.width): + r, g, b = im.getpixel((x, y)) # type: ignore + ndx_start: int = (x + ox + (y + oy) * 250) * 16 + color = (r >> 3) << 13 + color |= (g >> 2) << 5 + color |= (b >> 3) + + for i in range(16): + mgr.difference[ndx_start + i] = ((color >> i) & 1) > 0 if (n_proxies := len(settings["proxies"])): await asyncio.gather(*[ - mgr.writer(settings["proxies"][i % n_proxies]) for i in range(settings["n_bots"]) + mgr.writer(i, settings["proxies"][i % n_proxies]) for i in range(settings["n_bots"]) ], return_exceptions=True) else: await asyncio.gather(*[ - mgr.writer() for _ in range(settings["n_bots"]) + mgr.writer(i) for i in range(settings["n_bots"]) ], return_exceptions=True) diff --git a/casey565.png b/casey565.png new file mode 100644 index 0000000000000000000000000000000000000000..c380ea3feebd423777ca11abe9b5a8c402943598 GIT binary patch literal 27081 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