From 319da9746f31213738af0162580aa05966361873 Mon Sep 17 00:00:00 2001 From: hkc Date: Sun, 7 Jul 2024 15:23:30 +0300 Subject: [PATCH] Moved stuff around, added time Not a last commit, huh? --- async-bot.py | 68 +++++++++++++++++++++++++++++-------- pictures/casey.png | Bin 18071 -> 19837 bytes pictures/hello.png | Bin 0 -> 802 bytes pictures/mogus.png | Bin 0 -> 491 bytes pictures/niko_standing.png | Bin 0 -> 991 bytes pictures/os_boat.png | Bin 0 -> 2366 bytes settings.json | 38 +++++++++++++++------ 7 files changed, 80 insertions(+), 26 deletions(-) create mode 100644 pictures/hello.png create mode 100644 pictures/mogus.png create mode 100644 pictures/niko_standing.png create mode 100644 pictures/os_boat.png diff --git a/async-bot.py b/async-bot.py index fa2fc72..b3a2545 100644 --- a/async-bot.py +++ b/async-bot.py @@ -1,5 +1,5 @@ import asyncio -from typing import NewType, Optional +from typing import Callable, NewType, Optional from socketio import AsyncClient, AsyncSimpleClient from aiohttp import ClientSession from aiohttp_socks import ProxyConnector @@ -8,6 +8,7 @@ from base64 import b64decode from random import choice, randint from json import load from time import time as time_now +import datetime PixelMap = NewType("PixelMap", dict[int, bool]) @@ -29,6 +30,8 @@ class AsyncBotManager: self.avoid: set[int] = set() self.animations: list[Animation] = [] + self.animation_functions: list[Callable[[], PixelMap]] = [] + self._written_boxes = 0 self._read_boxes = 0 self._last_printout = time_now() @@ -38,10 +41,11 @@ class AsyncBotManager: @staticmethod def get_text_image(text: str, font: ImageFont.ImageFont | ImageFont.FreeTypeFont) -> Image.Image: left, top, right, bottom = font.getbbox(text) - with Image.new("LA", (int(right - left) + 4, int(bottom - top) + 4), 0) as im: + with Image.new("LA", (int(right - left) + 4, int(bottom - top) + 8), 0) as im: draw = ImageDraw.Draw(im) draw.rectangle((0, 0, im.width, im.height), (0, 0)) - draw.text((left + 2, top + 2), text, font=font, fill=(255, 0)) + draw.text((left + 2, top + 2), text, font=font, fill=(255, 0), + anchor="lt") alpha = im.convert("L").filter(ImageFilter.MaxFilter(5)) im.putalpha(alpha) @@ -60,6 +64,17 @@ class AsyncBotManager: def put_text(self, x: int, y: int, text: str, font: str, size: int = 8): self.put_image(x, y, self.get_text_image(text, self.get_font(font, size))) + + def get_image_diff(self, ox: int, oy: int, im: Image.Image) -> PixelMap: + pixmap = PixelMap({}) + for y in range(im.height): + for x in range(im.width): + l, a = im.getpixel((x, y)) # type: ignore + index = x + ox + (y + oy) * 1000 + if a and index not in self.avoid: + pixmap[index] = l > 0 + return pixmap + def put_image(self, ox: int, oy: int, im: Image.Image): for y in range(im.height): for x in range(im.width): @@ -174,6 +189,10 @@ class AsyncBotManager: print(f"I/O: {incoming:7.2f}/s | {outgoing:7.2f}/s") print(f"Alive workers: {len(self._active)}") + if len(self._active) < 5: + self._shutdown = True + return + n_correct, n_wrong = 0, 0 for index, expected in self.difference.items(): y, x = divmod(index, 1000) @@ -193,6 +212,10 @@ class AsyncBotManager: self.difference.update( pixmaps[frame_index % len(pixmaps)] ) + + for func in self.animation_functions: + self.difference.update(func()) + except Exception as e: print(f"Listener died: {e!r}") self._shutdown = True @@ -208,22 +231,21 @@ class AsyncBotManager: async with ClientSession(connector=proxy) as http: async with AsyncSimpleClient(http_session=http) as sio: await sio.connect(f"{self.base}/socket.io") - offset = randint(0, 1000000) + offset = 0 while not self._shutdown: diff = list(self.difference.items()) + diff = sorted(diff, key=lambda kv: kv[0]) for _ in range(100): index, expected = diff[offset % len(diff)] - offset += randint(0, 100) + offset += randint(0, 1000) y, x = divmod(index, 1000) current = self.canvas.getpixel((x, y)) > 0 # type: ignore if current != expected: - # print(f"[{bot_index:2d}] swap {x:3d} {y:3d}") self._written_boxes += 1 await sio.emit("toggle_bit", {"index": index}) await asyncio.sleep(delay) - break - self._active.add(bot_index) - await asyncio.sleep(0.01) + self._active.add(bot_index) + await sio.receive(0.1) async def __aenter__(self): self._listener_task = asyncio.create_task(self.listener()) @@ -277,13 +299,27 @@ async def amain() -> None: mgr.put_image(elem["x"], elem["y"], im) print("ADD image", elem) + elif elem["type"] == "time": + time_format = elem["format"] + pos_x, pos_y = elem["x"], elem["y"] + font = mgr.get_font(elem.get("font", "default"), elem.get("size", 8)) + def update() -> PixelMap: + now = datetime.datetime.now(datetime.timezone.utc) + txt = now.strftime(time_format) + img = mgr.get_text_image(txt, font) + pixmap = mgr.get_image_diff(pos_x, pos_y, img) + img.close() + return pixmap + mgr.animation_functions.append(update) elif elem["type"] == "tile": with Image.open(elem["path"]).convert("LA") as im: - for i in range(elem.get("ry", 1)): - for j in range(elem.get("rx", 1)): - x = elem["x"] + im.width * j - y = elem["y"] + im.height * i - mgr.put_image(x, y, im) + for oy in range(elem.get("h", im.height)): + for ox in range(elem.get("w", im.width)): + l, a = im.getpixel((ox % im.width, oy % im.height)) # type: ignore + if a: + x, y = elem["x"] + ox, elem["y"] + oy + index = x + y * 1000 + mgr.put_bit(index, l > 0) print("ADD tile", elem) elif elem["type"] == "animation": with Image.open(elem["path"]) as anim: @@ -371,7 +407,9 @@ async def amain() -> None: ) for ret in res: - print(ret) + print("RETURN", repr(ret)) + + mgr._shutdown = True if __name__ == "__main__": diff --git a/pictures/casey.png b/pictures/casey.png index f226bae4aa821e6294840996c7609ae299ef4bf4..4588c3bbce78e20e3a43654b01e8a80b5c06b053 100644 GIT binary patch delta 13051 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
    Y5-ltRfp_ z&%x2w)L6U8dY_Tgx#6sC_z>oLI_cYO*FN&)m31p}TmGN@^hcI^#doI}3a{clM*n{Y zOs}0jSE_VAQ0Y^azNFuS&?>S8WjSECerj=72;!r4FGqpARLbo|+WNCKBNO-WEk1(y zwI+F!l;1=Rp^oFBGG#l$NcC}#qa%oMTk^^ltKEERGfmk58(Wtw#M@<3h&z)Ja~tqeYC`xYkDhA&<|GSvNF3qb*|%lcF^{4NFnEs9}4Pg&Z4 zKI>E0>6J^;N#LB{H3A{EmV$T|dS@dH?+{{tYci_@{0++XALK?YCT_dSUR8NahmxVH z;O$BTSWLOL5EQIvpWAdFOM8Aa*XTDl8Nht3%pU!}LUkORK4n-ZmHAfHm1V2eHjFa$ zdoLk`0Jx5QgR8D7%^^jLoG+bO&Ql3LU`fbTOYb7&bG70UfBP@sFN>r>w1SV#9`ZGwN{~2a4<^EZOqTl5 z?Ki&qscC`##3m@^u|$v*1L~e((Ys7pK<+m*orR_dFh90zTwGZk^;xdI07w=C?K|7= z$8;MltQCzvnwV6-l~!`}VSWurryXaUQG%~f(V)=Oe>(MNUm;> z0SLW+RyLe)e;&M`*l%}PVS)laZMn@i9A9~hjwryyQi-(U+h5?CH zp%OAzZh3=HVVsU|08Nhp#kN}f0NhcqQ8?-^^wXuD0JF|QZ5ym9(H^TdlsPeTprvBb zNe~DpI$cDR33yHyt@on-EcMXZ_Rew<46GBmEiSyillpN{W z*$L?_i+W#MNm&`mg}_@sSS{MQ%e$OOXWoNYJyjeH+4fusi+C<1HnJCom*t+l>!A8; z%ed#afa=cItj^M35ABW94B(d5SHy7CqrO_?F{&x}Pb<(H5uwTE7~@P^MXTpFPq-bn zPAo9^;6&!+vla!7lDFjvBFSg`)mumPU(bS*rBxp?ESNgm8;eS;Yps`-?S2$;P%xJ9 z@R}Ynnm$N}3FpjYW;W_dyyIc`NlbE=&anEe=$js=8LjFMC1>wafZrF|n+5~*IO@qk zhWRS~s8s-fhcp=5+AV66@Zb`57Cr?V_M2>ZQT0S+|>p17ztr+!2S0yi_yl|WpAQCu(fip6Nmo!6Bqkyjq6kUoN>2AyEfx(b;>iB33l}TMelaKF>d?ateH8@r z_2s!bOu+jb|ffq7zE^2Px{q1oo-|2D+v&{W_r z`3qOvw{~_1 z2Lnx?C|o2%p32q-T?YF}HGQ7j3o>mo&?}K2HA>9km_*++bK)vq#U7+tuxhk;N~>+T zttxV+(8(x#n%nFWQHTB_4F1rlSS<5X(SEx;1H9>M^~g{}|Jt>Ts6H*8>nyh;%VY6R z{ZmQFYp3cf{aHrJ+rJ%~+d$5pN&46?O&nu9<)gfD7xfhBj|Yd@A4@di$1g6DYOG4e z{#kaIA@-ow{d^b>=6ar$+xZ6b+4d~#(Df+5jKV}-q)CD7L0?gsNqyV&X2Y9zb@;ZZ zU#wb883eNtrtgQG@~4LQR;js04(yHhhM%T6Ot^IERGb^RemUOE$XNjHPt+TbD@;XQ zr4&BolD=y#PP}-=9=Gs~I2`Y5>ASl7xfyxc?OxvI@b{i*0$R@HWy^M&2EJ2PTcW!# zkXMRt%Xxv`&srnx2%bORFXsl);{=9WA>>I(edU7bFQ_E) zFa+AGF?Iv~__(o5ur28ntNtZR^TU0Ev)qUEMpGd6&Kutn>M L?&C^To5=qIacR%u delta 11415 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 literal 0 HcmV?d00001 diff --git a/pictures/niko_standing.png b/pictures/niko_standing.png new file mode 100644 index 0000000000000000000000000000000000000000..45226edc5ae8c772733590c7ec2fdfad442f14a6 GIT binary patch literal 991 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