Added *working* pwoxy support and [...]

script to stream into ffmpeg for live preview
This commit is contained in:
Casey 2024-07-04 12:13:10 +03:00
parent 2ce6f3db4a
commit 41b904494f
Signed by: hkc
GPG Key ID: F0F6CFE11CDB0960
4 changed files with 56 additions and 6 deletions

1
.gitignore vendored
View File

@ -11,3 +11,4 @@ image.png
logs.txt logs.txt
rgb111-full.png rgb111-full.png
state-new.json state-new.json
settings.json

View File

@ -3,7 +3,7 @@ import asyncio
from typing import Optional from typing import Optional
from socketio import AsyncSimpleClient from socketio import AsyncSimpleClient
from aiohttp import ClientSession from aiohttp import ClientSession
from aiohttp_proxy import ProxyConnector from aiohttp_socks import ProxyConnector
from PIL import Image, ImageFont, ImageDraw, ImageFilter from PIL import Image, ImageFont, ImageDraw, ImageFilter
from base64 import b64decode from base64 import b64decode
from random import choice from random import choice
@ -68,7 +68,7 @@ class AsyncBotManager:
else: else:
print("unknown event", event, data) 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 proxy = ProxyConnector.from_url(proxy_url) if proxy_url else None
async with ClientSession(connector=proxy) as http: async with ClientSession(connector=proxy) as http:
async with AsyncSimpleClient(http_session=http) as sio: async with AsyncSimpleClient(http_session=http) as sio:
@ -77,14 +77,14 @@ class AsyncBotManager:
try: try:
event, data = await sio.receive(0.1) event, data = await sio.receive(0.1)
if event not in ("full_state", "batched_bit_toggles"): if event not in ("full_state", "batched_bit_toggles"):
print("!!!", event, data) print(bot_index, "!!!", event, data)
except Exception: except Exception:
pass pass
index, target = choice(list(self.difference.items())) index, target = choice(list(self.difference.items()))
y, x = divmod(index, 1000) y, x = divmod(index, 1000)
curr = self.canvas.getpixel((x, y)) > 0 # type: ignore curr = self.canvas.getpixel((x, y)) > 0 # type: ignore
if curr != target: if curr != target:
print("swap", x, y, index) print(bot_index, "swap", x, y)
await sio.emit("toggle_bit", { await sio.emit("toggle_bit", {
"index": index "index": index
}) })
@ -124,14 +124,27 @@ async def amain():
mgr.difference[ndx_start] = r > 128 mgr.difference[ndx_start] = r > 128
mgr.difference[ndx_start + 1] = g > 128 mgr.difference[ndx_start + 1] = g > 128
mgr.difference[ndx_start + 2] = b > 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"])): if (n_proxies := len(settings["proxies"])):
await asyncio.gather(*[ 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) ], return_exceptions=True)
else: else:
await asyncio.gather(*[ await asyncio.gather(*[
mgr.writer() for _ in range(settings["n_bots"]) mgr.writer(i) for i in range(settings["n_bots"])
], return_exceptions=True) ], return_exceptions=True)

BIN
casey565.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

36
stream.py Normal file
View File

@ -0,0 +1,36 @@
from base64 import b64decode
from socketio import SimpleClient
from requests import get
from sys import stdout
BASE_URL = "https://onemillioncheckboxes.com"
canvas = bytearray(1000000)
with get(f"{BASE_URL}/api/initial-state") as req:
data = req.json()
buffer = b64decode(data["full_state"].encode() + b"=")
canvas[:] = buffer
with SimpleClient() as sio:
sio.connect(f"{BASE_URL}/socket.io")
while True:
name, data = sio.receive()
if name == "batched_bit_toggles":
bits_on, bits_off, timestamp = data
for ndx in bits_on:
byte, bit = divmod(ndx, 8)
canvas[byte] |= (1 << bit)
for ndx in bits_off:
byte, bit = divmod(ndx, 8)
canvas[byte] &= 0xFF ^ (1 << bit)
elif name == "full_state":
buffer = b64decode(data["full_state"].encode() + b"=")
canvas[:] = buffer
stdout.buffer.write(canvas)
stdout.buffer.flush()