From b1860ce065b34cc6337e7a59aab475dde066a593 Mon Sep 17 00:00:00 2001 From: hkc Date: Tue, 9 Jul 2024 18:09:55 +0300 Subject: [PATCH] Proxy support in workers and stuff --- live-viewer.py | 2 +- pictures/linus.png | Bin 0 -> 30986 bytes swarm/settings.json | 28 ++++++++---------------- swarm/worker.py | 51 ++++++++++++++++++++++++++++++-------------- 4 files changed, 45 insertions(+), 36 deletions(-) create mode 100644 pictures/linus.png diff --git a/live-viewer.py b/live-viewer.py index d9471bd..a54d856 100644 --- a/live-viewer.py +++ b/live-viewer.py @@ -46,7 +46,7 @@ class App(tk.Tk): ts = datetime.fromtimestamp(self._last_update / 1000) path = ts.strftime(SCREENSHOTS_TMPL) print("SAVED", path) - self._image.save(path) + self._image.save(path, lossless=True) self.after(10000, self._save_image) diff --git a/pictures/linus.png b/pictures/linus.png new file mode 100644 index 0000000000000000000000000000000000000000..d563b87da31049caafdd402189ad430405c986fd GIT binary patch literal 30986 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 bit + for oy in [0, 4, 2, 6, 1, 3, 5, 7]: + for y in range(oy, 1000, 8): + for x in range(1000): + index = (x + y * 1000 + offset) % 1000000 + byte, bit = divmod(index, 8) + mask = 0x80 >> bit - if self.shmem.buf[OFFSET_AVOID + byte] & mask: - continue + if self.shmem.buf[OFFSET_AVOID + byte] & mask: + continue - if (self.shmem.buf[OFFSET_MASK + byte] & mask) == 0: - continue + if (self.shmem.buf[OFFSET_MASK + byte] & mask) == 0: + continue - if (self.shmem.buf[OFFSET_CANVAS + byte] & mask) != ( - self.shmem.buf[OFFSET_STATE + byte] & mask - ): - await self.queue.put(index) + if (self.shmem.buf[OFFSET_CANVAS + byte] & mask) != ( + self.shmem.buf[OFFSET_STATE + byte] & mask + ): + await self.queue.put(index) async def writer(self, bot_index: int, proxy: Optional[str] = None): connector = ProxyConnector.from_url(proxy) if proxy else None @@ -105,14 +109,29 @@ class WorkerManager: self.shmem.close() -async def main(): - async with WorkerManager() as mgr: +async def main(config_path: str = "worker.json", *_): + with open(config_path, "r") as fp: + config = json.load(fp) + + n_bots = config.get("n_bots", 1) + + async with WorkerManager(config.get("shmem", "omcb-bot")) as mgr: + + mgr.delay = config.get("delay", mgr.delay) + + workers = [] + if proxies := config.get("proxy", []): + workers.extend([mgr.writer(i, proxies[i % len(proxies)]) for i in range(n_bots)]) + else: + workers.extend([mgr.writer(i) for i in range(n_bots)]) + await asyncio.gather( mgr.queue_manager(), mgr.status_display(), - *[mgr.writer(i) for i in range(4)] + *workers ) if __name__ == "__main__": - asyncio.run(main()) + from sys import argv + asyncio.run(main(*argv[1:]))