├── README.md ├── client ├── Dockerfile ├── Pipfile ├── Pipfile.lock └── app │ ├── __init__.py │ ├── __main__.py │ ├── config.py │ ├── core │ ├── __init__.py │ ├── globals.py │ ├── mother_base.py │ ├── sign.py │ ├── stats.py │ └── user.py │ ├── main.py │ └── utils │ ├── __init__.py │ ├── logger.py │ └── req.py ├── docker-compose.deploy.yml ├── docker-compose.yml ├── motherbase ├── Dockerfile ├── Pipfile ├── Pipfile.lock └── app │ ├── __init__.py │ ├── __main__.py │ ├── interactors │ ├── __init__.py │ ├── client.py │ ├── client_connection.py │ ├── tasks.py │ └── users.py │ ├── main.py │ ├── router.py │ ├── schema.py │ └── settings.py ├── pixel-proxy ├── Dockerfile ├── fedor.conf └── nginx.conf └── pxb-botnet.png /README.md: -------------------------------------------------------------------------------- 1 | # VK Pixel Battle 2019/20 Botnet 2 | A tool written for BAGOSI during the VK Pixel Battle 2019 annual event.\ 3 | Some of the features remains unpolished so they are not going to be in this release. 4 | 5 | **Authors:** @kumfc & @3vilWind 6 | 7 | \ 8 | ![](https://github.com/kumfc/pixel-battle-botnet/raw/master/pxb-botnet.png) 9 | 10 | 11 | **Deploying on single machine:**\ 12 | *Deploying it on multiple machines is pointless until you have 1000+ bots* 13 | 14 | 0. Set client node role to manager 15 | 16 | 1. Init 17 | ``` 18 | docker swarm init 19 | docker service create --name registry --publish published=5000,target=5000 registry:2 20 | iptables -I DOCKER-USER -p tcp --destination-port 5000 -j DROP 21 | ``` 22 | 23 | 2. Start 24 | ``` 25 | docker-compose -f /root/pixel-battle-botnet-dev/docker-compose.deploy.yml build 26 | docker-compose -f /root/pixel-battle-botnet-dev/docker-compose.deploy.yml push 27 | docker stack deploy -c /root/pixel-battle-botnet-dev/docker-compose.deploy.yml pixel 28 | ``` 29 | 30 | 3. Kill 31 | ``` 32 | docker stack rm pixel 33 | ``` 34 | -------------------------------------------------------------------------------- /client/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.7 2 | 3 | ENV PYTHONUNBUFFERED=1 4 | 5 | COPY Pipfile / 6 | COPY Pipfile.lock / 7 | RUN pip install pipenv && pipenv install --system --deploy 8 | 9 | COPY app /app 10 | WORKDIR / 11 | 12 | 13 | CMD ["python", "-m", "app"] 14 | -------------------------------------------------------------------------------- /client/Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | name = "pypi" 3 | url = "https://pypi.org/simple" 4 | verify_ssl = true 5 | 6 | [dev-packages] 7 | 8 | [packages] 9 | aiohttp = "*" 10 | js2py = "*" 11 | 12 | [requires] 13 | python_version = "3.7" 14 | -------------------------------------------------------------------------------- /client/Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "a4edc42c054b7e00913a238efc51b953a1b1ca24f90cf0a1cf3cc3e7473f74cd" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": { 8 | "python_version": "3.7" 9 | }, 10 | "sources": [ 11 | { 12 | "name": "pypi", 13 | "url": "https://pypi.org/simple", 14 | "verify_ssl": true 15 | } 16 | ] 17 | }, 18 | "default": { 19 | "aiohttp": { 20 | "hashes": [ 21 | "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0", 22 | "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6", 23 | "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf", 24 | "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9", 25 | "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e", 26 | "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0", 27 | "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329", 28 | "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2", 29 | "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40", 30 | "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a", 31 | "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4", 32 | "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de", 33 | "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9", 34 | "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9", 35 | "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb", 36 | "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076", 37 | "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de", 38 | "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907", 39 | "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d", 40 | "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536", 41 | "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d", 42 | "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54", 43 | "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc", 44 | "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212", 45 | "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9", 46 | "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d", 47 | "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b", 48 | "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7", 49 | "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81", 50 | "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c", 51 | "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895", 52 | "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297", 53 | "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb", 54 | "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe", 55 | "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242", 56 | "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0", 57 | "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2" 58 | ], 59 | "index": "pypi", 60 | "version": "==3.7.4" 61 | }, 62 | "async-timeout": { 63 | "hashes": [ 64 | "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f", 65 | "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3" 66 | ], 67 | "version": "==3.0.1" 68 | }, 69 | "attrs": { 70 | "hashes": [ 71 | "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", 72 | "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" 73 | ], 74 | "version": "==20.3.0" 75 | }, 76 | "chardet": { 77 | "hashes": [ 78 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 79 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 80 | ], 81 | "version": "==3.0.4" 82 | }, 83 | "idna": { 84 | "hashes": [ 85 | "sha256:5205d03e7bcbb919cc9c19885f9920d622ca52448306f2377daede5cf3faac16", 86 | "sha256:c5b02147e01ea9920e6b0a3f1f7bb833612d507592c837a6c49552768f4054e1" 87 | ], 88 | "version": "==3.1" 89 | }, 90 | "js2py": { 91 | "hashes": [ 92 | "sha256:6e5628abfff2fb4051e8e77a353e44831f474e2ceb865278271897f7f326aeb6", 93 | "sha256:bf87cb4432944470f11fed9c1cb8d0312dd505e7b867362f55102f24379ab94f" 94 | ], 95 | "index": "pypi", 96 | "version": "==0.66" 97 | }, 98 | "multidict": { 99 | "hashes": [ 100 | "sha256:018132dbd8688c7a69ad89c4a3f39ea2f9f33302ebe567a879da8f4ca73f0d0a", 101 | "sha256:051012ccee979b2b06be928a6150d237aec75dd6bf2d1eeeb190baf2b05abc93", 102 | "sha256:05c20b68e512166fddba59a918773ba002fdd77800cad9f55b59790030bab632", 103 | "sha256:07b42215124aedecc6083f1ce6b7e5ec5b50047afa701f3442054373a6deb656", 104 | "sha256:0e3c84e6c67eba89c2dbcee08504ba8644ab4284863452450520dad8f1e89b79", 105 | "sha256:0e929169f9c090dae0646a011c8b058e5e5fb391466016b39d21745b48817fd7", 106 | "sha256:1ab820665e67373de5802acae069a6a05567ae234ddb129f31d290fc3d1aa56d", 107 | "sha256:25b4e5f22d3a37ddf3effc0710ba692cfc792c2b9edfb9c05aefe823256e84d5", 108 | "sha256:2e68965192c4ea61fff1b81c14ff712fc7dc15d2bd120602e4a3494ea6584224", 109 | "sha256:2f1a132f1c88724674271d636e6b7351477c27722f2ed789f719f9e3545a3d26", 110 | "sha256:37e5438e1c78931df5d3c0c78ae049092877e5e9c02dd1ff5abb9cf27a5914ea", 111 | "sha256:3a041b76d13706b7fff23b9fc83117c7b8fe8d5fe9e6be45eee72b9baa75f348", 112 | "sha256:3a4f32116f8f72ecf2a29dabfb27b23ab7cdc0ba807e8459e59a93a9be9506f6", 113 | "sha256:46c73e09ad374a6d876c599f2328161bcd95e280f84d2060cf57991dec5cfe76", 114 | "sha256:46dd362c2f045095c920162e9307de5ffd0a1bfbba0a6e990b344366f55a30c1", 115 | "sha256:4b186eb7d6ae7c06eb4392411189469e6a820da81447f46c0072a41c748ab73f", 116 | "sha256:54fd1e83a184e19c598d5e70ba508196fd0bbdd676ce159feb412a4a6664f952", 117 | "sha256:585fd452dd7782130d112f7ddf3473ffdd521414674c33876187e101b588738a", 118 | "sha256:5cf3443199b83ed9e955f511b5b241fd3ae004e3cb81c58ec10f4fe47c7dce37", 119 | "sha256:6a4d5ce640e37b0efcc8441caeea8f43a06addace2335bd11151bc02d2ee31f9", 120 | "sha256:7df80d07818b385f3129180369079bd6934cf70469f99daaebfac89dca288359", 121 | "sha256:806068d4f86cb06af37cd65821554f98240a19ce646d3cd24e1c33587f313eb8", 122 | "sha256:830f57206cc96ed0ccf68304141fec9481a096c4d2e2831f311bde1c404401da", 123 | "sha256:929006d3c2d923788ba153ad0de8ed2e5ed39fdbe8e7be21e2f22ed06c6783d3", 124 | "sha256:9436dc58c123f07b230383083855593550c4d301d2532045a17ccf6eca505f6d", 125 | "sha256:9dd6e9b1a913d096ac95d0399bd737e00f2af1e1594a787e00f7975778c8b2bf", 126 | "sha256:ace010325c787c378afd7f7c1ac66b26313b3344628652eacd149bdd23c68841", 127 | "sha256:b47a43177a5e65b771b80db71e7be76c0ba23cc8aa73eeeb089ed5219cdbe27d", 128 | "sha256:b797515be8743b771aa868f83563f789bbd4b236659ba52243b735d80b29ed93", 129 | "sha256:b7993704f1a4b204e71debe6095150d43b2ee6150fa4f44d6d966ec356a8d61f", 130 | "sha256:d5c65bdf4484872c4af3150aeebe101ba560dcfb34488d9a8ff8dbcd21079647", 131 | "sha256:d81eddcb12d608cc08081fa88d046c78afb1bf8107e6feab5d43503fea74a635", 132 | "sha256:dc862056f76443a0db4509116c5cd480fe1b6a2d45512a653f9a855cc0517456", 133 | "sha256:ecc771ab628ea281517e24fd2c52e8f31c41e66652d07599ad8818abaad38cda", 134 | "sha256:f200755768dc19c6f4e2b672421e0ebb3dd54c38d5a4f262b872d8cfcc9e93b5", 135 | "sha256:f21756997ad8ef815d8ef3d34edd98804ab5ea337feedcd62fb52d22bf531281", 136 | "sha256:fc13a9524bc18b6fb6e0dbec3533ba0496bbed167c56d0aabefd965584557d80" 137 | ], 138 | "version": "==5.1.0" 139 | }, 140 | "pyjsparser": { 141 | "hashes": [ 142 | "sha256:2b12842df98d83f65934e0772fa4a5d8b123b3bc79f1af1789172ac70265dd21", 143 | "sha256:be60da6b778cc5a5296a69d8e7d614f1f870faf94e1b1b6ac591f2ad5d729579" 144 | ], 145 | "version": "==2.7.1" 146 | }, 147 | "pytz": { 148 | "hashes": [ 149 | "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da", 150 | "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798" 151 | ], 152 | "version": "==2021.1" 153 | }, 154 | "six": { 155 | "hashes": [ 156 | "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", 157 | "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" 158 | ], 159 | "version": "==1.15.0" 160 | }, 161 | "typing-extensions": { 162 | "hashes": [ 163 | "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", 164 | "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", 165 | "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" 166 | ], 167 | "markers": "python_version < '3.8'", 168 | "version": "==3.7.4.3" 169 | }, 170 | "tzlocal": { 171 | "hashes": [ 172 | "sha256:643c97c5294aedc737780a49d9df30889321cbe1204eac2c2ec6134035a92e44", 173 | "sha256:e2cb6c6b5b604af38597403e9852872d7f534962ae2954c7f35efcb1ccacf4a4" 174 | ], 175 | "version": "==2.1" 176 | }, 177 | "yarl": { 178 | "hashes": [ 179 | "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e", 180 | "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434", 181 | "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366", 182 | "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3", 183 | "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec", 184 | "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959", 185 | "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e", 186 | "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c", 187 | "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6", 188 | "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a", 189 | "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6", 190 | "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424", 191 | "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e", 192 | "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f", 193 | "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50", 194 | "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2", 195 | "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc", 196 | "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4", 197 | "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970", 198 | "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10", 199 | "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0", 200 | "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406", 201 | "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896", 202 | "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643", 203 | "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721", 204 | "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478", 205 | "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724", 206 | "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e", 207 | "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8", 208 | "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96", 209 | "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25", 210 | "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76", 211 | "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2", 212 | "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2", 213 | "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c", 214 | "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a", 215 | "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71" 216 | ], 217 | "version": "==1.6.3" 218 | } 219 | }, 220 | "develop": {} 221 | } 222 | -------------------------------------------------------------------------------- /client/app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kumfc/pixel-battle-botnet/b1ce385db6fa9552832ce85d9390c4db89f262ab/client/app/__init__.py -------------------------------------------------------------------------------- /client/app/__main__.py: -------------------------------------------------------------------------------- 1 | from asyncio import run 2 | from app.main import main 3 | import traceback 4 | 5 | if __name__ == '__main__': 6 | run(main()) 7 | traceback.print_exc() 8 | -------------------------------------------------------------------------------- /client/app/config.py: -------------------------------------------------------------------------------- 1 | mode = 1 # 1 - with morherbase, 2 - single client 2 | time_delay_between_paint = 61 3 | use_proxy = True 4 | field_size = 636000 5 | max_width = 1590 6 | drawlog = False 7 | 8 | single_db = 'mine.json' 9 | single_task = 'navalny_tasks.txt' 10 | -------------------------------------------------------------------------------- /client/app/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kumfc/pixel-battle-botnet/b1ce385db6fa9552832ce85d9390c4db89f262ab/client/app/core/__init__.py -------------------------------------------------------------------------------- /client/app/core/globals.py: -------------------------------------------------------------------------------- 1 | class ClientGlobals: 2 | def __init__(self): 3 | self.bruh_moment = 0 4 | self.task_handler = list() 5 | self.user_handler = list() 6 | self.stats = None 7 | self.proxy_list = list() -------------------------------------------------------------------------------- /client/app/core/mother_base.py: -------------------------------------------------------------------------------- 1 | import socket 2 | import time 3 | import asyncio 4 | import json 5 | import uuid 6 | from app.main import g 7 | import app.utils.logger as log 8 | import app.utils.req as r 9 | from app.core.user import User 10 | 11 | 12 | class MotherBase: 13 | def __init__(self, mother_url): 14 | self.alive = False 15 | self.url = mother_url 16 | # self.id = str(uuid.uuid4()) 17 | self.id = socket.gethostname() 18 | 19 | async def run_interaction_loop(self): 20 | while True: 21 | if len(g.task_handler) == 0: 22 | await self.get_tasks() 23 | if int(time.time()) % 20 == 0: 24 | await self.send_stats() 25 | await asyncio.sleep(1) 26 | 27 | async def shutdown(self): 28 | log.warning(f'Client shutting down...') 29 | await r.post(f'{self.url}/c/shutdown', data={'id': self.id}) 30 | 31 | async def get_tasks(self): 32 | can_run = int(g.stats.get_stats_assoc()['can_draw']) 33 | data = await r.post(f'{self.url}/c/get-pixels', data={'id': self.id, 'expected_count': can_run}) 34 | 35 | if data is None: 36 | return 37 | 38 | if 'pixels' in data and len(data['pixels']) > 0: 39 | g.task_handler.extend(data['pixels']) 40 | log.info(f'Retrieved {len(data["pixels"])} tasks from the base.') 41 | 42 | async def send_stats(self): 43 | stat = g.stats.get_stats_assoc() # maybe g.bruh_moment 44 | await r.post(f'{self.url}/c/send-stats', data={'id': self.id, 'statistics': stat}) 45 | 46 | async def get_users(self): 47 | while True: 48 | data = await r.post(f'{self.url}/c/get-users', data={'id': self.id}) 49 | 50 | if data is None: 51 | continue 52 | 53 | if data['status'] == 'success' and len(data['users']) > 0: 54 | break 55 | await asyncio.sleep(15) 56 | 57 | users = data['users'] 58 | log.info(f'Retrieved {len(users)} users from the base.') 59 | for user in users: 60 | g.user_handler.append(User(user['vk_websocket'], user['vk_id'], user['delay'])) 61 | -------------------------------------------------------------------------------- /client/app/core/sign.py: -------------------------------------------------------------------------------- 1 | import struct 2 | import js2py as js 3 | import app.utils.logger as log 4 | from app import config 5 | 6 | 7 | def get_sign(pw): 8 | window = "var window = {WebSocket: 1, parseInt: parseInt, Math: Math};" 9 | document = "document = {createElement: function(e){ return ({tagName: e.toUpperCase()}) }}; setTimeout = function(a, b){ return; };" 10 | res = js.eval_js(document + window + pw) 11 | return res 12 | 13 | 14 | def prepare_pixel_packet(x, y, color, flag = 0): 15 | e = {'color': color, 'flag': flag, 'x': x, 'y': y} 16 | packet = convert(e) 17 | if config.drawlog: 18 | log.info(f'Painting {[x, y, color]}, sign {struct.pack("= '3.5.3'", 68 | "version": "==3.0.1" 69 | }, 70 | "attrs": { 71 | "hashes": [ 72 | "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836", 73 | "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99" 74 | ], 75 | "markers": "python_version >= '3.6'", 76 | "version": "==22.2.0" 77 | }, 78 | "chardet": { 79 | "hashes": [ 80 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 81 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 82 | ], 83 | "version": "==3.0.4" 84 | }, 85 | "idna": { 86 | "hashes": [ 87 | "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", 88 | "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" 89 | ], 90 | "markers": "python_version >= '3.5'", 91 | "version": "==3.4" 92 | }, 93 | "motor": { 94 | "hashes": [ 95 | "sha256:462fbb824f4289481c158227a2579d6adaf1ec7c70cf7ebe60ed6ceb321e5869", 96 | "sha256:d035c09ab422bc50bf3efb134f7405694cae76268545bd21e14fb22e2638f84e" 97 | ], 98 | "index": "pypi", 99 | "version": "==2.0.0" 100 | }, 101 | "multidict": { 102 | "hashes": [ 103 | "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9", 104 | "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8", 105 | "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03", 106 | "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710", 107 | "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161", 108 | "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664", 109 | "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569", 110 | "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067", 111 | "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313", 112 | "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706", 113 | "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2", 114 | "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636", 115 | "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49", 116 | "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93", 117 | "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603", 118 | "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0", 119 | "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60", 120 | "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4", 121 | "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e", 122 | "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1", 123 | "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60", 124 | "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951", 125 | "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc", 126 | "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe", 127 | "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95", 128 | "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d", 129 | "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8", 130 | "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed", 131 | "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2", 132 | "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775", 133 | "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87", 134 | "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c", 135 | "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2", 136 | "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98", 137 | "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3", 138 | "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe", 139 | "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78", 140 | "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660", 141 | "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176", 142 | "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e", 143 | "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988", 144 | "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c", 145 | "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c", 146 | "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0", 147 | "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449", 148 | "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f", 149 | "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde", 150 | "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5", 151 | "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d", 152 | "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac", 153 | "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a", 154 | "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9", 155 | "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca", 156 | "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11", 157 | "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35", 158 | "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063", 159 | "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b", 160 | "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982", 161 | "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258", 162 | "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1", 163 | "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52", 164 | "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480", 165 | "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7", 166 | "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461", 167 | "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d", 168 | "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc", 169 | "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779", 170 | "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a", 171 | "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547", 172 | "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0", 173 | "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171", 174 | "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf", 175 | "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d", 176 | "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba" 177 | ], 178 | "markers": "python_version >= '3.7'", 179 | "version": "==6.0.4" 180 | }, 181 | "pillow": { 182 | "hashes": [ 183 | "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040", 184 | "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8", 185 | "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65", 186 | "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2", 187 | "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627", 188 | "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07", 189 | "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef", 190 | "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535", 191 | "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c", 192 | "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc", 193 | "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3", 194 | "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1", 195 | "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c", 196 | "sha256:32a44128c4bdca7f31de5be641187367fe2a450ad83b833ef78910397db491aa", 197 | "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32", 198 | "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502", 199 | "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4", 200 | "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f", 201 | "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812", 202 | "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636", 203 | "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20", 204 | "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c", 205 | "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91", 206 | "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe", 207 | "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b", 208 | "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad", 209 | "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9", 210 | "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72", 211 | "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4", 212 | "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de", 213 | "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29", 214 | "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee", 215 | "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c", 216 | "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7", 217 | "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11", 218 | "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c", 219 | "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c", 220 | "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448", 221 | "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b", 222 | "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20", 223 | "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228", 224 | "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd", 225 | "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699", 226 | "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b", 227 | "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2", 228 | "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4", 229 | "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c", 230 | "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f", 231 | "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2", 232 | "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c", 233 | "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3", 234 | "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193", 235 | "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48", 236 | "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02", 237 | "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8", 238 | "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e", 239 | "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f", 240 | "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b", 241 | "sha256:e6ea6b856a74d560d9326c0f5895ef8050126acfdc7ca08ad703eb0081e82b74", 242 | "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb", 243 | "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0" 244 | ], 245 | "index": "pypi", 246 | "version": "==9.3.0" 247 | }, 248 | "pydantic": { 249 | "hashes": [ 250 | "sha256:14e598055b65d2e6cedf10dc3de6ad1bb04ca3eec348e4af1cf5e5e496deab55", 251 | "sha256:1d42c7408cde8a224c2bb969bfb9dca21f3b1eec37a92044be8bcd7d35ea5826", 252 | "sha256:433dda6200104d7aa38c27a6ea52485e69931042556065402281cc73a57fd680", 253 | "sha256:51dec047b44f0de4dbfa301b73df605918088348b951b8b4616127249febfe30", 254 | "sha256:548c284237b0c61e0e785ad03167c75723f22000f82e8104d8981fdf50ce14e8", 255 | "sha256:60b8956b57045224294691b78a6a4be0f321271a9f1c2a7fef25248e4c4f20df", 256 | "sha256:6eea211e8b427841a16f43fa739ac06059db6af0d167476b928dbb237d870b77", 257 | "sha256:76b241172d6e22403e116e1d3b7305b6a9479323f8168f2fcb300ffe698443b9", 258 | "sha256:90310c1c5945b4fe2ff7bd69e306e54d192e55d22480657ddd6d2519cf2f12ba", 259 | "sha256:93f7f510fc366b99dace4a3d1f036aafcfe908092c5f2572ad4a96be24da199c", 260 | "sha256:ae48129396bd5acfaef1cdaaa959ac8ab5d02c026b1fdffb421dc6fa81d7861d", 261 | "sha256:be4e0263ef515ae14f06e9fb372843f00bdb218ec4f2f04beb3480ac1538a9a9", 262 | "sha256:bf9e5dd5e0e7e64541508f657c63bf6ab869109cb39f017f935acfeb64ea9be8", 263 | "sha256:cd777c102ba31bc9992093c2e9f778c21b3965566d1fa5ac9f9b7cea2e67fe2a", 264 | "sha256:d09adff1c70351a8750941dd39fda25447eab2e3cdb5b2aade340f69f6f53e84", 265 | "sha256:e77e5f640f1093bf417b841d9b4148bd4212bb0dbb2cbb9024aa07f2b3b260eb", 266 | "sha256:f6a1a465dd72aff0462486588a2bf905f9169e575deec1e6f6d00240fe1b4e00" 267 | ], 268 | "index": "pypi", 269 | "version": "==1.6.2" 270 | }, 271 | "pymongo": { 272 | "hashes": [ 273 | "sha256:028175dd8d2979a889153a2308e8e500b3df7d9e3fd1c33ca7fdeadf61cc87a2", 274 | "sha256:02f0e1a75d3bc0e16c7e15daf9c56185642be055e425f3b34888fc6eb1b22401", 275 | "sha256:0665412dce26b2318092a33bd2d2327d487c4490cfcde158d6946d39b1e28d78", 276 | "sha256:09b9d0f5a445c7e0ddcc021b09835aa6556f0166afc498f57dfdd72cdf6f02ad", 277 | "sha256:09de3bfc995ae8cb955abb0c9ae963c134dba1b5622be3bcc527b89b0fd4091c", 278 | "sha256:0e5536994cf2d8488c6fd9dea71df3c4dbb3e0d2ba5e695da06d9142a29a0969", 279 | "sha256:0f2c5a5984599a88d087a15859860579b825098b473d8c843f1979a83d159f2e", 280 | "sha256:1037097708498bdc85f23c8798a5c46c7bce432d77d23608ff14e0d831f1a971", 281 | "sha256:10f0fddc1d63ba3d4a4bffcc7720184c1b7efd570726ad5e2f55818da320239f", 282 | "sha256:12721d926d43d33dd3318e58dce9b0250e8a9c6e1093fa8e09f4805193ff4b43", 283 | "sha256:1410faa51ce835cc1234c99ec42e98ab4f3c6f50d92d86a2d4f6e11c97ee7a4e", 284 | "sha256:16e74b9c2aca2734c7f49f00fe68d6830a30d26df60e2ace7fe40ccb92087b94", 285 | "sha256:172db03182a22e9002157b262c1ea3b0045c73d4ff465adc152ce5b4b0e7b8d4", 286 | "sha256:174fd1000e896d0dfbc7f6d7e6a1992a4868796c7dec31679e38218c78d6a942", 287 | "sha256:1c2c5e2b00e2fadcd590c0b2e293d71215e98ed1cb635cfca2be4998d197e534", 288 | "sha256:1c9d23f62a3fa7523d849c4942acc0d9ff7081ebc00c808ee7cfdc070df0687f", 289 | "sha256:21e61a536ffed84d10376c21c13a6ed1ebefb61989a844952547c229d6aeedf3", 290 | "sha256:222591b828de10ac90064047b5d4916953f38c38b155009c4b8b5e0d33117c2b", 291 | "sha256:2406df90b2335371706c59b7d79e9633b81ed2a7ecd48c1faf8584552bdf2d90", 292 | "sha256:24e954be35ad4537840f20bbc8d75320ae647d3cb4fab12cb8fcd2d55f408e76", 293 | "sha256:26f9cc42a162faa241c82e117ac85734ae9f14343dc2df1c90c6b2181f791b22", 294 | "sha256:28565e3dbd69fe5fe35a210067064dbb6ed5abe997079f653c19c873c3896fe6", 295 | "sha256:2943d739715f265a2983ac43747595b6af3312d0a370614040959fd293763adf", 296 | "sha256:2bfc39276c0e6d07c95bd1088b5003f049e986e089509f7dbd68bb7a4b1e65ac", 297 | "sha256:2dae3b353a10c3767e0aa1c1492f2af388f1012b08117695ab3fd1f219e5814e", 298 | "sha256:2e0854170813238f0c3131050c67cb1fb1ade75c93bf6cd156c1bd9a16095528", 299 | "sha256:30245a8747dc90019a3c9ad9df987e0280a3ea632ad36227cde7d1d8dcba0830", 300 | "sha256:30ed2788a6ec68743e2040ab1d16573d7d9f6e7333e45070ce9268cbc93d148c", 301 | "sha256:32eac95bbb030b2376ffd897376c6f870222a3457f01a9ce466b9057876132f8", 302 | "sha256:34cd48df7e1fc69222f296d8f69e3957eb7c6b5aa0709d3467184880ed7538c0", 303 | "sha256:34dbf5fecf653c152edb75a35a8b15dfdc4549473484ee768aeb12c97983cead", 304 | "sha256:398fb86d374dc351a4abc2e24cd15e5e14b2127f6d90ce0df3fdf2adcc55ac1b", 305 | "sha256:3ad3a3df830f7df7e0856c2bdb54d19f5bf188bd7420985e18643b8e4d2a075f", 306 | "sha256:3b261d593f2563299062733ae003a925420a86ff4ddda68a69097d67204e43f3", 307 | "sha256:3c5cb6c93c94df76a879bad4b89db0104b01806d17c2b803c1316ba50962b6d6", 308 | "sha256:3cfc9bc1e8b5667bc1f3dbe46d2f85b3f24ff7533893bdc1203058012db2c046", 309 | "sha256:4092b660ec720d44d3ca81074280dc25c7a3718df1b6c0fe9fe36ac6ed2833e4", 310 | "sha256:42ba8606492d76e6f9e4c7a458ed4bc712603be393259a52450345f0945da2cf", 311 | "sha256:4a32f3dfcca4a4816373bdb6256c18c78974ebb3430e7da988516cd95b2bd6e4", 312 | "sha256:4a82a1c10f5608e6494913faa169e213d703194bfca0aa710901f303be212414", 313 | "sha256:4bbc0d27dfef7689285e54f2e0a224f0c7cd9d5c46d2638fabad5500b951c92f", 314 | "sha256:4d9ed67c987bf9ac2ac684590ba3d2599cdfb0f331ee3db607f9684469b3b59d", 315 | "sha256:4f6dd55dab77adf60b445c11f426ee5cdfa1b86f6d54cb937bfcbf09572333ab", 316 | "sha256:50a81b2d9f188c7909e0a1084fa969bb92a788076809c437ac1ae80393f46df9", 317 | "sha256:50b99f4d3eee6f03778fe841d6f470e6c18e744dc665156da6da3bc6e65b398d", 318 | "sha256:5136ebe8da6a1604998a8eb96be55935aa5f7129c41cc7bddc400d48e8df43be", 319 | "sha256:570ae3365b23d4fd8c669cb57613b1a90b2757e993588d3370ef90945dbeec4b", 320 | "sha256:5831a377d15a626fbec10890ffebc4c6abcd37e4126737932cd780a171eabdc1", 321 | "sha256:59c98e86c5e861032b71e6e5b65f23e6afaacea6e82483b66f1191a5021a7b4f", 322 | "sha256:5bdeb71a610a7b801416268e500e716d0fe693fb10d809e17f0fb3dac5be5a34", 323 | "sha256:5c1db7d366004d6c699eb08c716a63ae0a3e946d061cbebea65d7ce361950265", 324 | "sha256:61660710b054ae52c8fc10368e91d74719eb05554b631d7f8ca93d21d2bff2e6", 325 | "sha256:644470442beaf969df99c4e00367a817eee05f0bba5d888f1ba6fe97b5e1c102", 326 | "sha256:64ed1a5ce5e5926727eb0f87c698c4d9a7a9f7b0953683a65e9ce2b7cc5f8e91", 327 | "sha256:65a063970e15a4f338f14b820561cf6cdaf2839691ac0adb2474ddff9d0b8b0b", 328 | "sha256:65b6fddf6a7b91da044f202771a38e71bbb9bf42720a406b26b25fe2256e7102", 329 | "sha256:6af0a4b17faf26779d5caee8542a4f2cba040cea27d3bffc476cbc6ccbd4c8ee", 330 | "sha256:70b67390e27e58876853efbb87e43c85252de2515e2887f7dd901b4fa3d21973", 331 | "sha256:7219b1a726ced3bacecabef9bd114529bbb69477901373e800d7d0140baadc95", 332 | "sha256:7593cb1214185a0c5b43b96effc51ce82ddc933298ee36db7dc2bd45d61b4adc", 333 | "sha256:776f90bf2252f90a4ae838e7917638894c6356bef7265f424592e2fd1f577d05", 334 | "sha256:79f777eaf3f5b2c6d81f9ef00d87837001d7063302503bbcbfdbf3e9bc27c96f", 335 | "sha256:7c7cab8155f430ca460a6fc7ae8a705b34f3e279a57adb5f900eb81943ec777c", 336 | "sha256:7cb987b199fa223ad78eebaa9fbc183d5a5944bfe568a9d6f617316ca1c1f32f", 337 | "sha256:7ec2bb598847569ae34292f580842d37619eea3e546005042f485e15710180d5", 338 | "sha256:80d8576b04d0824f63bf803190359c0d3bcb6e7fa63fefbd4bc0ceaa7faae38c", 339 | "sha256:851f2bb52b5cb2f4711171ca925e0e05344a8452972a748a8a8ffdda1e1d72a7", 340 | "sha256:8927f22ef6a16229da7f18944deac8605bdc2c0858be5184259f2f7ce7fd4459", 341 | "sha256:8ad0515abb132f52ce9d8abd1a29681a1e65dba7b7fe13ea01e1a8db5715bf80", 342 | "sha256:8cc37b437cba909bef06499dadd91a39c15c14225e8d8c7870020049f8a549fe", 343 | "sha256:93d4e9a02c17813b34e4bd9f6fbf07310c140c8f74341537c24d07c1cdeb24d1", 344 | "sha256:944249aa83dee314420c37d0f40c30a8f6dc4a3877566017b87062e53af449f4", 345 | "sha256:9b2ed9c3b30f11cd4a3fbfc22167af7987b01b444215c2463265153fe7cf66d6", 346 | "sha256:9c3d07ea19cd2856d9943dce37e75d69ecbb5baf93c3e4c82f73b6075c481292", 347 | "sha256:9f592b202d77923498b32ddc5b376e5fa9ba280d3e16ed56cb8c932fe6d6a478", 348 | "sha256:a149377d1ff766fd618500798d0d94637f66d0ae222bb6d28f41f3e15c626297", 349 | "sha256:a17b81f22398e3e0f72bdf938e98c810286994b2bcc0a125cd5ad8fd4ea54ad7", 350 | "sha256:a424bdedfd84454d2905a861e0d4bb947cc5bd024fdeb3600c1a97d2be0f4255", 351 | "sha256:a6cbb73d9fc2282677e2b7a137d13da987bd0b13abd88ed27bba5534c226db06", 352 | "sha256:a796ef39dadf9d73af05d24937644d386495e43a7d13617aa3651d836da542c8", 353 | "sha256:aa3bca8e76f5c00ed2bb4325e0e383a547d71595926d5275d7c88175aaf7435e", 354 | "sha256:b01ce58eec5edeededf1992d2dce63fb8565e437be12d6f139d75b15614c4d08", 355 | "sha256:b0746d0d4535f56bbaa63a8f6da362f330804d578e66e126b226eebe76c2bf00", 356 | "sha256:b1223b826acbef07a7f5eb9bf37247b0b580119916dca9eae19d92b1290f5855", 357 | "sha256:b5b733694e7df22d5c049581acfc487695a6ff813322318bed8dd66f79978636", 358 | "sha256:b6793baf4639c72a500698a49e9250b293e17ae1faf11ac1699d8141194786fe", 359 | "sha256:b96e0e9d2d48948240b510bac81614458fc10adcd3a93240c2fd96448b4efd35", 360 | "sha256:bc04c92d05c142889c26810a4842273deb42e66411273cab4ad09268fe69ba69", 361 | "sha256:bdd34c57b4da51a7961beb33645646d197e41f8517801dc76b37c1441e7a4e10", 362 | "sha256:c0379447587ee4b8f983ba183202496e86c0358f47c45612619d634d1fcd82bd", 363 | "sha256:c3b70ed82f20d18d22eafc9bda0ea656605071762f7d31f3c5afc35c59d3393b", 364 | "sha256:c7c45a8a1a752002b0a7c81ab3a4c5e3b6f67f9826b16fbe3943f5329f565f24", 365 | "sha256:c8f755ff1f4ab4ca790d1d6d3229006100b301475948021b6b2757822e0d6c97", 366 | "sha256:d1a19d6c5098f1f4e11430cd74621699453cbc534dd7ade9167e582f50814b19", 367 | "sha256:d1ee773fb72ba024e7e3bb6ea8907fe52bccafcb5184aaced6bad995bd30ea20", 368 | "sha256:d42eb29ba314adfd9c11234b4b646f61b0448bf9b00f14db4b317e6e4b947e77", 369 | "sha256:d593d50815771f517d3ac4367ff716e3f3c78edae51d98e1e25791459f8848ff", 370 | "sha256:d7910135f5de1c5c3578e61d6f4b087715b15e365f11d4fa51a9cee92988b2bd", 371 | "sha256:d7c91747ec8dde51440dd594603158cc98abb3f7df84b2ed8a836f138285e4fb", 372 | "sha256:db2e11507fe9cc2a722be21ccc62c1b1295398fe9724c1f14900cdc7166fc0d7", 373 | "sha256:db5b4f8ad8607a3d612da1d4c89a84e4cf5c88f98b46365820d9babe5884ba45", 374 | "sha256:e1956f3338c10308e2f99c2c9ff46ae412035cbcd7aaa76c39ccdb806854a247", 375 | "sha256:e22d6cf5802cd09b674c307cc9e03870b8c37c503ebec3d25b86f2ce8c535dc7", 376 | "sha256:e5161167b3840e9c84c80f2534ea6a099f51749d5673b662a3dd248be17c3208", 377 | "sha256:e5e87c0eb774561c546f979342a8ff36ebee153c60a0b6c6b03ba989ceb9538c", 378 | "sha256:e6f8191a282ef77e526f8f8f63753a437e4aa4bc78f5edd8b6b6ed0eaebd5363", 379 | "sha256:e8f6979664ff477cd61b06bf8aba206df7b2334209815ab3b1019931dab643d6", 380 | "sha256:ea8824ebc9a1a5c8269e8f1e3989b5a6bec876726e2f3c33ebd036cb488277f0", 381 | "sha256:f4175fcdddf764d371ee52ec4505a40facee2533e84abf2953cda86d050cfa1f", 382 | "sha256:fe8194f107f0fa3cabd14e9e809f174eca335993c1db72d1e74e0f496e7afe1f" 383 | ], 384 | "version": "==3.13.0" 385 | }, 386 | "typing-extensions": { 387 | "hashes": [ 388 | "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", 389 | "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" 390 | ], 391 | "markers": "python_version >= '3.7'", 392 | "version": "==4.5.0" 393 | }, 394 | "yarl": { 395 | "hashes": [ 396 | "sha256:009a028127e0a1755c38b03244c0bea9d5565630db9c4cf9572496e947137a87", 397 | "sha256:0414fd91ce0b763d4eadb4456795b307a71524dbacd015c657bb2a39db2eab89", 398 | "sha256:0978f29222e649c351b173da2b9b4665ad1feb8d1daa9d971eb90df08702668a", 399 | "sha256:0ef8fb25e52663a1c85d608f6dd72e19bd390e2ecaf29c17fb08f730226e3a08", 400 | "sha256:10b08293cda921157f1e7c2790999d903b3fd28cd5c208cf8826b3b508026996", 401 | "sha256:1684a9bd9077e922300ecd48003ddae7a7474e0412bea38d4631443a91d61077", 402 | "sha256:1b372aad2b5f81db66ee7ec085cbad72c4da660d994e8e590c997e9b01e44901", 403 | "sha256:1e21fb44e1eff06dd6ef971d4bdc611807d6bd3691223d9c01a18cec3677939e", 404 | "sha256:2305517e332a862ef75be8fad3606ea10108662bc6fe08509d5ca99503ac2aee", 405 | "sha256:24ad1d10c9db1953291f56b5fe76203977f1ed05f82d09ec97acb623a7976574", 406 | "sha256:272b4f1599f1b621bf2aabe4e5b54f39a933971f4e7c9aa311d6d7dc06965165", 407 | "sha256:2a1fca9588f360036242f379bfea2b8b44cae2721859b1c56d033adfd5893634", 408 | "sha256:2b4fa2606adf392051d990c3b3877d768771adc3faf2e117b9de7eb977741229", 409 | "sha256:3150078118f62371375e1e69b13b48288e44f6691c1069340081c3fd12c94d5b", 410 | "sha256:326dd1d3caf910cd26a26ccbfb84c03b608ba32499b5d6eeb09252c920bcbe4f", 411 | "sha256:34c09b43bd538bf6c4b891ecce94b6fa4f1f10663a8d4ca589a079a5018f6ed7", 412 | "sha256:388a45dc77198b2460eac0aca1efd6a7c09e976ee768b0d5109173e521a19daf", 413 | "sha256:3adeef150d528ded2a8e734ebf9ae2e658f4c49bf413f5f157a470e17a4a2e89", 414 | "sha256:3edac5d74bb3209c418805bda77f973117836e1de7c000e9755e572c1f7850d0", 415 | "sha256:3f6b4aca43b602ba0f1459de647af954769919c4714706be36af670a5f44c9c1", 416 | "sha256:3fc056e35fa6fba63248d93ff6e672c096f95f7836938241ebc8260e062832fe", 417 | "sha256:418857f837347e8aaef682679f41e36c24250097f9e2f315d39bae3a99a34cbf", 418 | "sha256:42430ff511571940d51e75cf42f1e4dbdded477e71c1b7a17f4da76c1da8ea76", 419 | "sha256:44ceac0450e648de86da8e42674f9b7077d763ea80c8ceb9d1c3e41f0f0a9951", 420 | "sha256:47d49ac96156f0928f002e2424299b2c91d9db73e08c4cd6742923a086f1c863", 421 | "sha256:48dd18adcf98ea9cd721a25313aef49d70d413a999d7d89df44f469edfb38a06", 422 | "sha256:49d43402c6e3013ad0978602bf6bf5328535c48d192304b91b97a3c6790b1562", 423 | "sha256:4d04acba75c72e6eb90745447d69f84e6c9056390f7a9724605ca9c56b4afcc6", 424 | "sha256:57a7c87927a468e5a1dc60c17caf9597161d66457a34273ab1760219953f7f4c", 425 | "sha256:58a3c13d1c3005dbbac5c9f0d3210b60220a65a999b1833aa46bd6677c69b08e", 426 | "sha256:5df5e3d04101c1e5c3b1d69710b0574171cc02fddc4b23d1b2813e75f35a30b1", 427 | "sha256:63243b21c6e28ec2375f932a10ce7eda65139b5b854c0f6b82ed945ba526bff3", 428 | "sha256:64dd68a92cab699a233641f5929a40f02a4ede8c009068ca8aa1fe87b8c20ae3", 429 | "sha256:6604711362f2dbf7160df21c416f81fac0de6dbcf0b5445a2ef25478ecc4c778", 430 | "sha256:6c4fcfa71e2c6a3cb568cf81aadc12768b9995323186a10827beccf5fa23d4f8", 431 | "sha256:6d88056a04860a98341a0cf53e950e3ac9f4e51d1b6f61a53b0609df342cc8b2", 432 | "sha256:705227dccbe96ab02c7cb2c43e1228e2826e7ead880bb19ec94ef279e9555b5b", 433 | "sha256:728be34f70a190566d20aa13dc1f01dc44b6aa74580e10a3fb159691bc76909d", 434 | "sha256:74dece2bfc60f0f70907c34b857ee98f2c6dd0f75185db133770cd67300d505f", 435 | "sha256:75c16b2a900b3536dfc7014905a128a2bea8fb01f9ee26d2d7d8db0a08e7cb2c", 436 | "sha256:77e913b846a6b9c5f767b14dc1e759e5aff05502fe73079f6f4176359d832581", 437 | "sha256:7a66c506ec67eb3159eea5096acd05f5e788ceec7b96087d30c7d2865a243918", 438 | "sha256:8c46d3d89902c393a1d1e243ac847e0442d0196bbd81aecc94fcebbc2fd5857c", 439 | "sha256:93202666046d9edadfe9f2e7bf5e0782ea0d497b6d63da322e541665d65a044e", 440 | "sha256:97209cc91189b48e7cfe777237c04af8e7cc51eb369004e061809bcdf4e55220", 441 | "sha256:a48f4f7fea9a51098b02209d90297ac324241bf37ff6be6d2b0149ab2bd51b37", 442 | "sha256:a783cd344113cb88c5ff7ca32f1f16532a6f2142185147822187913eb989f739", 443 | "sha256:ae0eec05ab49e91a78700761777f284c2df119376e391db42c38ab46fd662b77", 444 | "sha256:ae4d7ff1049f36accde9e1ef7301912a751e5bae0a9d142459646114c70ecba6", 445 | "sha256:b05df9ea7496df11b710081bd90ecc3a3db6adb4fee36f6a411e7bc91a18aa42", 446 | "sha256:baf211dcad448a87a0d9047dc8282d7de59473ade7d7fdf22150b1d23859f946", 447 | "sha256:bb81f753c815f6b8e2ddd2eef3c855cf7da193b82396ac013c661aaa6cc6b0a5", 448 | "sha256:bcd7bb1e5c45274af9a1dd7494d3c52b2be5e6bd8d7e49c612705fd45420b12d", 449 | "sha256:bf071f797aec5b96abfc735ab97da9fd8f8768b43ce2abd85356a3127909d146", 450 | "sha256:c15163b6125db87c8f53c98baa5e785782078fbd2dbeaa04c6141935eb6dab7a", 451 | "sha256:cb6d48d80a41f68de41212f3dfd1a9d9898d7841c8f7ce6696cf2fd9cb57ef83", 452 | "sha256:ceff9722e0df2e0a9e8a79c610842004fa54e5b309fe6d218e47cd52f791d7ef", 453 | "sha256:cfa2bbca929aa742b5084fd4663dd4b87c191c844326fcb21c3afd2d11497f80", 454 | "sha256:d617c241c8c3ad5c4e78a08429fa49e4b04bedfc507b34b4d8dceb83b4af3588", 455 | "sha256:d881d152ae0007809c2c02e22aa534e702f12071e6b285e90945aa3c376463c5", 456 | "sha256:da65c3f263729e47351261351b8679c6429151ef9649bba08ef2528ff2c423b2", 457 | "sha256:de986979bbd87272fe557e0a8fcb66fd40ae2ddfe28a8b1ce4eae22681728fef", 458 | "sha256:df60a94d332158b444301c7f569659c926168e4d4aad2cfbf4bce0e8fb8be826", 459 | "sha256:dfef7350ee369197106805e193d420b75467b6cceac646ea5ed3049fcc950a05", 460 | "sha256:e59399dda559688461762800d7fb34d9e8a6a7444fd76ec33220a926c8be1516", 461 | "sha256:e6f3515aafe0209dd17fb9bdd3b4e892963370b3de781f53e1746a521fb39fc0", 462 | "sha256:e7fd20d6576c10306dea2d6a5765f46f0ac5d6f53436217913e952d19237efc4", 463 | "sha256:ebb78745273e51b9832ef90c0898501006670d6e059f2cdb0e999494eb1450c2", 464 | "sha256:efff27bd8cbe1f9bd127e7894942ccc20c857aa8b5a0327874f30201e5ce83d0", 465 | "sha256:f37db05c6051eff17bc832914fe46869f8849de5b92dc4a3466cd63095d23dfd", 466 | "sha256:f8ca8ad414c85bbc50f49c0a106f951613dfa5f948ab69c10ce9b128d368baf8", 467 | "sha256:fb742dcdd5eec9f26b61224c23baea46c9055cf16f62475e11b9b15dfd5c117b", 468 | "sha256:fc77086ce244453e074e445104f0ecb27530d6fd3a46698e33f6c38951d5a0f1", 469 | "sha256:ff205b58dc2929191f68162633d5e10e8044398d7a45265f90a0f1d51f85f72c" 470 | ], 471 | "markers": "python_version >= '3.7'", 472 | "version": "==1.8.2" 473 | } 474 | }, 475 | "develop": {} 476 | } 477 | -------------------------------------------------------------------------------- /motherbase/app/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kumfc/pixel-battle-botnet/b1ce385db6fa9552832ce85d9390c4db89f262ab/motherbase/app/__init__.py -------------------------------------------------------------------------------- /motherbase/app/__main__.py: -------------------------------------------------------------------------------- 1 | from asyncio import run 2 | from app.main import main 3 | 4 | if __name__ == '__main__': 5 | run(main()) 6 | -------------------------------------------------------------------------------- /motherbase/app/interactors/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kumfc/pixel-battle-botnet/b1ce385db6fa9552832ce85d9390c4db89f262ab/motherbase/app/interactors/__init__.py -------------------------------------------------------------------------------- /motherbase/app/interactors/client.py: -------------------------------------------------------------------------------- 1 | import asyncio 2 | 3 | from app.schema import User, ClientStatisticsSchema 4 | from app.settings import MAX_USERS_PER_CLIENT 5 | 6 | 7 | class ClientInteractor: 8 | def __init__(self, users_database): 9 | self.users_database = users_database 10 | self._sultan = False # my protiv gonok 11 | 12 | @staticmethod 13 | def print_stat(client_token, stat: ClientStatisticsSchema): 14 | print(f'[{client_token}]\nTotal: {stat.total}\nOnline: {stat.online}\nOffline: {stat.offline}\nCan draw: {stat.can_draw}') 15 | 16 | async def take_away_all_users_from_client(self, client_token): 17 | await self.users_database.update_many(filter={'client': client_token}, update={"$set": {'client': None}}) 18 | 19 | async def get_users_for_client(self, client_token): 20 | while self._sultan: 21 | await asyncio.sleep(1) 22 | self._sultan = True 23 | data = [] 24 | clients_users = await self.users_database.count_documents({'client': client_token}) 25 | if clients_users > 0: 26 | await self.take_away_all_users_from_client(client_token) 27 | needed_users = MAX_USERS_PER_CLIENT 28 | free_users = self.users_database.find({'client': None}).limit(needed_users) 29 | 30 | async for i in free_users: 31 | await self.users_database.update_one(filter={'_id': i['_id']}, update={"$set": {'client': client_token}}) 32 | data.append(User(**i).dict()) 33 | 34 | print(f'Sending {len(data)} users to {client_token}') 35 | self._sultan = False 36 | return data 37 | 38 | async def clear_all_users(self): 39 | await self.users_database.update_many(filter={}, update={"$set": {'client': None}}) 40 | -------------------------------------------------------------------------------- /motherbase/app/interactors/client_connection.py: -------------------------------------------------------------------------------- 1 | from client_connection import ClientWebsocket 2 | from aiohttp import web 3 | import json 4 | from schema import ClientConnectSchema, User 5 | from asyncio import sleep, ensure_future 6 | from settings import CLIENT_DISCONNECT_TIMEOUT, MAX_USERS_PER_CLIENT 7 | 8 | 9 | class ClientConnectionInteractor: 10 | def __init__(self, clients, users_database): 11 | self.clients = clients 12 | self.users_database = users_database 13 | 14 | async def handle(self, ws): 15 | msg = await ws.receive() 16 | if msg.type == web.WSMsgType.text: 17 | data = json.loads(msg.data) 18 | if data['type'] == 'connect': 19 | connect_data = ClientConnectSchema(**data['data']) 20 | token_client = self.get_client_by_token(connect_data.token) 21 | if token_client is None: 22 | token_client = ClientWebsocket(connect_data.token) 23 | self.clients.append(token_client) 24 | else: 25 | if hasattr(token_client, 'coroutine'): 26 | token_client.coroutine.cancel() 27 | token_client.coroutine = None 28 | else: 29 | token_client = ClientWebsocket(connect_data.token) 30 | self.clients.append(token_client) 31 | print('[+] Client with token ({}) connected!'.format(token_client.token)) 32 | await token_client.handle_connection(ws) 33 | 34 | token_client.websocket = None 35 | token_client.coroutine = ensure_future(self.wait_to_reconnect(token_client)) 36 | 37 | def get_client_by_token(self, token): 38 | for i in self.clients: 39 | if i.token == token: 40 | return i 41 | return None 42 | 43 | async def wait_to_reconnect(self, token_client): 44 | await sleep(CLIENT_DISCONNECT_TIMEOUT) 45 | token_client.coroutine = None 46 | self.clients.remove(token_client) 47 | await self.take_away_all_users_from_client(token_client) 48 | 49 | async def take_away_all_users_from_client(self, client): 50 | await self.users_database.update_many(filter={'client': client.token}, update={"$set": {'client': None}}) 51 | 52 | async def give_users_to_client(self, client, users_database): 53 | data = [] 54 | clients_users = await users_database.count_documents({'client': client.token}) 55 | needed_users = max(0, MAX_USERS_PER_CLIENT - clients_users) 56 | free_users = users_database.find({'client': None}).limit(needed_users) 57 | async for i in free_users: 58 | await users_database.update_one(filter={'_id': i['_id']}, update={"$set": {'client': client.token}}) 59 | data.append(User(**i)) 60 | 61 | await client.send_users(data) 62 | 63 | async def clear_all_users(self): 64 | await self.users_database.update_many(filter={}, update={"$set": {'client': None}}) 65 | -------------------------------------------------------------------------------- /motherbase/app/interactors/tasks.py: -------------------------------------------------------------------------------- 1 | import io 2 | from asyncio import sleep 3 | from datetime import datetime 4 | from random import shuffle 5 | 6 | import aiohttp 7 | from PIL import Image 8 | 9 | from app.schema import CreateTaskSchema, Pixel, SetEnabledTaskSchema 10 | from app.settings import CANVAS_UPDATE_TIME 11 | 12 | color_map = ["FFFFFF", "C2C2C2", "858585", "474747", "000000", "3AAFFF", "71AAEB", "4A76A8", "074BF3", 13 | "5E30EB", "FF6C5B", "FE2500", "FF218B", "99244F", "4D2C9C", "FFCF4A", "FEB43F", "FE8648", 14 | "FF5B36", "DA5100", "94E044", "5CBF0D", "C3D117", "FCC700", "D38301"] 15 | 16 | 17 | class TaskInteractor: 18 | def __init__(self, database_tasks): 19 | self.database_tasks = database_tasks 20 | self.current_canvas = None 21 | self.pixel_pool = list() 22 | 23 | async def create_task(self, data: CreateTaskSchema): 24 | await self.database_tasks.insert_one( 25 | {'name': data.name, 'is_enabled': data.is_enabled, 'creation_time': datetime.now(), 26 | 'pixels': list([i.dict() for i in data.pixels])} 27 | ) 28 | 29 | async def update_pixel_pool(self): 30 | try: 31 | self.pixel_pool = list() 32 | async for task in self.database_tasks.find(): 33 | if not task['is_enabled']: 34 | continue 35 | 36 | pixels = [] 37 | for i in task['pixels']: 38 | pixels.append(i) 39 | #shuffle(pixels) 40 | pixels.reverse() 41 | 42 | for current_pixel in pixels: 43 | pixel = Pixel(**current_pixel) 44 | if not await self.check_pixel_painted(pixel.color, pixel.x, pixel.y): 45 | self.pixel_pool.append(pixel.dict()) 46 | except IndexError: 47 | print('IndexError - Broken task!') 48 | 49 | async def get_pixels(self, cnt_needed): 50 | pixel_list = list() 51 | for pixel in self.pixel_pool: 52 | pixel_list.append(pixel) 53 | self.pixel_pool.remove(pixel) 54 | if len(pixel_list) >= cnt_needed: 55 | return pixel_list 56 | return pixel_list 57 | 58 | async def update_canvas(self): 59 | while True: 60 | try: 61 | async with aiohttp.ClientSession() as session: 62 | async with session.get('https://dev.umfc.xyz/pixel.png') as resp: 63 | im = Image.open(io.BytesIO(await resp.read())) 64 | self.current_canvas = im.load() 65 | except Exception as exc: 66 | print('EXCEPTION IN UPDATE CANVAS LOOP', exc) 67 | if len(self.pixel_pool) == 0: 68 | await self.update_pixel_pool() 69 | 70 | await sleep(CANVAS_UPDATE_TIME) 71 | 72 | async def check_pixel_painted(self, color, x, y): 73 | if self.current_canvas is None: 74 | return False 75 | 76 | r, g, b = map(int, self.current_canvas[x, y]) 77 | c = '{:02X}{:02X}{:02X}'.format(r, g, b) 78 | 79 | return color_map.index(c) == color 80 | 81 | async def set_enabled(self, data: SetEnabledTaskSchema): 82 | await self.database_tasks.update_many(filter={'name': data.name}, 83 | update={"$set": {'is_enabled': data.is_enabled}}) 84 | -------------------------------------------------------------------------------- /motherbase/app/interactors/users.py: -------------------------------------------------------------------------------- 1 | from app.schema import AddUsersSchema 2 | 3 | 4 | class UserInteractor: 5 | def __init__(self, database_users): 6 | self.database_users = database_users 7 | self.users_loaded = False 8 | 9 | async def add_users(self, data: AddUsersSchema): 10 | self.users_loaded = True 11 | await self.database_users.insert_many(list([i.dict() for i in data.users])) 12 | -------------------------------------------------------------------------------- /motherbase/app/main.py: -------------------------------------------------------------------------------- 1 | from asyncio import ensure_future 2 | from collections import namedtuple 3 | from os import environ 4 | 5 | from aiohttp import web 6 | from motor import motor_asyncio 7 | 8 | from app.router import endpoints 9 | 10 | DatabaseInjection = namedtuple('DatabaseInjection', ['users', 'tasks']) 11 | 12 | 13 | def init_database(): 14 | client = motor_asyncio.AsyncIOMotorClient(environ['DATABASE_URL']) 15 | database = client['pixel-battle-botnet'] 16 | database_injection = DatabaseInjection(database.users, database.tasks) 17 | 18 | return database_injection 19 | 20 | 21 | async def startup(database): 22 | await database.users.update_many(filter={}, update={"$set": {'client': None}}) 23 | 24 | 25 | def main(): 26 | db = init_database() 27 | add_users, create_task, clear_all_users, set_enabled_task, c_send_stats, c_get_pixels, c_get_users, c_shutdown = endpoints(db) 28 | ensure_future(startup(db)) 29 | 30 | webapp = web.Application(client_max_size=10 ** 7) 31 | webapp.add_routes([web.post('/add-users', add_users), 32 | web.post('/create-task', create_task), 33 | web.post('/clear-users', clear_all_users), 34 | web.post('/enable-task', set_enabled_task), 35 | web.post('/c/send-stats', c_send_stats), 36 | web.post('/c/get-pixels', c_get_pixels), 37 | web.post('/c/get-users', c_get_users), 38 | web.post('/c/shutdown', c_shutdown)]) 39 | web.run_app(webapp, port=1337) 40 | -------------------------------------------------------------------------------- /motherbase/app/router.py: -------------------------------------------------------------------------------- 1 | from asyncio import ensure_future 2 | 3 | from aiohttp import web 4 | 5 | from app.interactors.client import ClientInteractor 6 | from app.interactors.tasks import TaskInteractor 7 | from app.interactors.users import UserInteractor 8 | from app.schema import AddUsersSchema, CreateTaskSchema, SetEnabledTaskSchema 9 | 10 | from app.schema import ClientStatisticsSchema 11 | 12 | 13 | def endpoints(database): 14 | user_interactor = UserInteractor(database.users) 15 | task_interactor = TaskInteractor(database.tasks) 16 | client_interactor = ClientInteractor(database.users) 17 | 18 | ensure_future(task_interactor.update_canvas()) 19 | 20 | async def add_users(request): 21 | data = await request.json() 22 | schema_data = AddUsersSchema(**data) 23 | await user_interactor.add_users(schema_data) 24 | 25 | return web.json_response({'status': 'success'}) 26 | 27 | async def create_task(request): 28 | data = await request.json() 29 | schema_data = CreateTaskSchema(**data) 30 | await task_interactor.create_task(schema_data) 31 | 32 | return web.json_response({'status': 'success'}) 33 | 34 | async def clear_all_users(request): 35 | await client_interactor.clear_all_users() 36 | 37 | return web.json_response({'status': 'success'}) 38 | 39 | async def set_enabled_task(request): 40 | data = await request.json() 41 | schema_data = SetEnabledTaskSchema(**data) 42 | await task_interactor.set_enabled(schema_data) 43 | 44 | async def c_send_stats(request): 45 | data = await request.json() 46 | 47 | client_interactor.print_stat(data['id'], ClientStatisticsSchema(**data['statistics'])) 48 | 49 | return web.json_response({'status': 'success'}) 50 | 51 | async def c_get_pixels(request): 52 | data = await request.json() 53 | 54 | pixels = await task_interactor.get_pixels(data['expected_count']) 55 | 56 | return web.json_response({'status': 'success', 'pixels': pixels}) 57 | 58 | async def c_get_users(request): 59 | if not user_interactor.users_loaded: 60 | return web.json_response({'status': 'failed'}) 61 | 62 | data = await request.json() 63 | 64 | users = await client_interactor.get_users_for_client(data['id']) 65 | 66 | return web.json_response({'status': 'success', 'users': users}) 67 | 68 | async def c_shutdown(request): 69 | data = await request.json() 70 | 71 | await client_interactor.take_away_all_users_from_client(data['id']) 72 | 73 | return web.json_response({'status': 'success'}) 74 | 75 | return add_users, create_task, clear_all_users, set_enabled_task, c_send_stats, c_get_pixels, c_get_users, c_shutdown 76 | -------------------------------------------------------------------------------- /motherbase/app/schema.py: -------------------------------------------------------------------------------- 1 | from random import randint 2 | from typing import List 3 | 4 | from pydantic import BaseModel, validator 5 | 6 | 7 | class User(BaseModel): 8 | vk_id: int 9 | vk_token: str 10 | vk_websocket: str 11 | client: str = None 12 | delay: int = -1 13 | 14 | @validator('delay', pre=True, always=True) 15 | def set_delay(cls, v): 16 | result = v 17 | if result == -1: 18 | result = randint(0, 100) 19 | 20 | return result 21 | 22 | 23 | class AddUsersSchema(BaseModel): 24 | users: List[User] 25 | 26 | 27 | class Pixel(BaseModel): 28 | x: int 29 | y: int 30 | color: int 31 | 32 | 33 | class CreateTaskSchema(BaseModel): 34 | name: str 35 | is_enabled: bool = True 36 | pixels: List[Pixel] 37 | 38 | 39 | class ClientStatisticsSchema(BaseModel): 40 | total: int 41 | online: int 42 | offline: int 43 | can_draw: int 44 | 45 | 46 | class ClientConnectSchema(BaseModel): 47 | token: str 48 | 49 | 50 | class SetEnabledTaskSchema(BaseModel): 51 | name: str 52 | is_enabled: bool 53 | -------------------------------------------------------------------------------- /motherbase/app/settings.py: -------------------------------------------------------------------------------- 1 | from datetime import timedelta 2 | 3 | 4 | REQUEST_STATISTICS_RATE = 5 5 | MAX_USERS_PER_CLIENT = 1450 6 | CLIENT_DISCONNECT_TIMEOUT = 1 7 | PIXELS_TIMEOUT = 10 8 | CANVAS_UPDATE_TIME = 30 9 | MAX_PIXELS_DISTRIBUTION_TIME = timedelta(seconds=10) 10 | -------------------------------------------------------------------------------- /pixel-proxy/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx 2 | 3 | COPY password /password 4 | COPY certs /certs 5 | COPY nginx.conf /etc/nginx/nginx.conf 6 | COPY fedor.conf /etc/nginx/conf.d/ 7 | #RUN ln -s /etc/nginx/sites-available/fedor.conf /etc/nginx/sites-enabled/fedor.conf 8 | 9 | RUN mkdir /var/logs 10 | -------------------------------------------------------------------------------- /pixel-proxy/fedor.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name fedor.umfc.xyz; 4 | return 301 https://$host$request_uri; 5 | } 6 | server { 7 | listen 443 ssl; 8 | 9 | auth_basic "hi"; 10 | auth_basic_user_file /password; 11 | 12 | access_log /var/log/access.log; 13 | error_log /var/log/error.log; 14 | 15 | server_name fedor.umfc.xyz; 16 | 17 | location ~ ^/api1337/(.*)$ { 18 | resolver 127.0.0.11; 19 | proxy_pass http://motherbase:1337/$1; 20 | } 21 | 22 | location ~ ^/(.*)$ { 23 | resolver 127.0.0.11; 24 | proxy_pass http://pixel-db-monitor:8081/$1; 25 | } 26 | 27 | ssl_certificate /certs/fullchain.pem; 28 | ssl_certificate_key /certs/privkey.pem; 29 | ssl_trusted_certificate /certs/chain.pem; 30 | ssl_stapling on; 31 | ssl_stapling_verify on; 32 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 33 | ssl_prefer_server_ciphers on; 34 | ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; 35 | } 36 | -------------------------------------------------------------------------------- /pixel-proxy/nginx.conf: -------------------------------------------------------------------------------- 1 | user nginx; 2 | worker_processes 1; 3 | 4 | error_log /var/log/nginx/error.log warn; 5 | pid /var/run/nginx.pid; 6 | 7 | 8 | events { 9 | worker_connections 1024; 10 | } 11 | 12 | 13 | http { 14 | include /etc/nginx/mime.types; 15 | default_type application/octet-stream; 16 | 17 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 | '$status $body_bytes_sent "$http_referer" ' 19 | '"$http_user_agent" "$http_x_forwarded_for"'; 20 | 21 | access_log /var/log/nginx/access.log main; 22 | 23 | sendfile on; 24 | #tcp_nopush on; 25 | 26 | keepalive_timeout 65; 27 | client_max_body_size 100m; 28 | 29 | #gzip on; 30 | 31 | include /etc/nginx/conf.d/*.conf; 32 | } -------------------------------------------------------------------------------- /pxb-botnet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kumfc/pixel-battle-botnet/b1ce385db6fa9552832ce85d9390c4db89f262ab/pxb-botnet.png --------------------------------------------------------------------------------