diff --git a/Pipfile b/Pipfile index 0778da1..8644cfc 100644 --- a/Pipfile +++ b/Pipfile @@ -8,8 +8,12 @@ hikari = {extras = ["speedups"]} hikari-crescent = "*" python-dotenv = "*" uvloop = "*" +black = "*" +beautifulsoup4 = "*" +guesslang = {ref = "d3b55c255d1886bce96610c04cb9241afca6f9d4", git = "https://github.com/SimeonAleksov/guesslang.git"} [dev-packages] +types-beautifulsoup4 = "*" black = "*" flake8 = "*" isort = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 98a9ce8..5479851 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f6b1a0acf2bb03c026e800a1068cf7cf6bc1373c1887be9efa9adffbf009159d" + "sha256": "d00a4b1e44ff35f1e7c5122ba24d6204123bbdb80bfc0e08d35de69e55f17eb1" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,14 @@ ] }, "default": { + "absl-py": { + "hashes": [ + "sha256:34995df9bd7a09b3b8749e230408f5a2a2dd7a68a0d33c12a3d0cb15a041a507", + "sha256:463c38a08d2e4cef6c498b76ba5bd4858e4c6ef51da1a5a1f27139a022e20248" + ], + "markers": "python_version >= '3.6'", + "version": "==1.3.0" + }, "aiodns": { "hashes": [ "sha256:2b19bc5f97e5c936638d28e665923c093d8af2bf3aa88d35c43417fa25d136a2", @@ -124,6 +132,13 @@ "markers": "python_version >= '3.7'", "version": "==1.3.1" }, + "astunparse": { + "hashes": [ + "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", + "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" + ], + "version": "==1.6.3" + }, "async-timeout": { "hashes": [ "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15", @@ -134,11 +149,46 @@ }, "attrs": { "hashes": [ - "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4", - "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd" + "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6", + "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==21.4.0" + "markers": "python_version >= '3.5'", + "version": "==22.1.0" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30", + "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" + ], + "index": "pypi", + "version": "==4.11.1" + }, + "black": { + "hashes": [ + "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7", + "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6", + "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650", + "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb", + "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d", + "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d", + "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de", + "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395", + "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae", + "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa", + "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef", + "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383", + "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66", + "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87", + "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d", + "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0", + "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b", + "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458", + "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4", + "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1", + "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff" + ], + "index": "pypi", + "version": "==22.10.0" }, "brotli": { "hashes": [ @@ -227,39 +277,21 @@ ], "version": "==1.0.9" }, - "cchardet": { - "hashes": [ - "sha256:0b859069bbb9d27c78a2c9eb997e6f4b738db2d7039a03f8792b4058d61d1109", - "sha256:228d2533987c450f39acf7548f474dd6814c446e9d6bd228e8f1d9a2d210f10b", - "sha256:2309ff8fc652b0fc3c0cff5dbb172530c7abb92fe9ba2417c9c0bcf688463c1c", - "sha256:24974b3e40fee9e7557bb352be625c39ec6f50bc2053f44a3d1191db70b51675", - "sha256:273699c4e5cd75377776501b72a7b291a988c6eec259c29505094553ee505597", - "sha256:27a9ba87c9f99e0618e1d3081189b1217a7d110e5c5597b0b7b7c3fedd1c340a", - "sha256:302aa443ae2526755d412c9631136bdcd1374acd08e34f527447f06f3c2ddb98", - "sha256:45456c59ec349b29628a3c6bfb86d818ec3a6fbb7eb72de4ff3bd4713681c0e3", - "sha256:48ba829badef61441e08805cfa474ccd2774be2ff44b34898f5854168c596d4d", - "sha256:50ad671e8d6c886496db62c3bd68b8d55060688c655873aa4ce25ca6105409a1", - "sha256:54341e7e1ba9dc0add4c9d23b48d3a94e2733065c13920e85895f944596f6150", - "sha256:54d0b26fd0cd4099f08fb9c167600f3e83619abefeaa68ad823cc8ac1f7bcc0c", - "sha256:5a25f9577e9bebe1a085eec2d6fdd72b7a9dd680811bba652ea6090fb2ff472f", - "sha256:6b6397d8a32b976a333bdae060febd39ad5479817fabf489e5596a588ad05133", - "sha256:70eeae8aaf61192e9b247cf28969faef00578becd2602526ecd8ae7600d25e0e", - "sha256:80e6faae75ecb9be04a7b258dc4750d459529debb6b8dee024745b7b5a949a34", - "sha256:90086e5645f8a1801350f4cc6cb5d5bf12d3fa943811bb08667744ec1ecc9ccd", - "sha256:a39526c1c526843965cec589a6f6b7c2ab07e3e56dc09a7f77a2be6a6afa4636", - "sha256:b154effa12886e9c18555dfc41a110f601f08d69a71809c8d908be4b1ab7314f", - "sha256:b59ddc615883835e03c26f81d5fc3671fab2d32035c87f50862de0da7d7db535", - "sha256:bd7f262f41fd9caf5a5f09207a55861a67af6ad5c66612043ed0f81c58cdf376", - "sha256:c428b6336545053c2589f6caf24ea32276c6664cb86db817e03a94c60afa0eaf", - "sha256:c6f70139aaf47ffb94d89db603af849b82efdf756f187cdd3e566e30976c519f", - "sha256:c96aee9ebd1147400e608a3eff97c44f49811f8904e5a43069d55603ac4d8c97", - "sha256:ec3eb5a9c475208cf52423524dcaf713c394393e18902e861f983c38eeb77f18", - "sha256:eee4f5403dc3a37a1ca9ab87db32b48dc7e190ef84601068f45397144427cc5e", - "sha256:f16517f3697569822c6d09671217fdeab61dfebc7acb5068634d6b0728b86c0b", - "sha256:f86e0566cb61dc4397297696a4a1b30f6391b50bc52b4f073507a48466b6255a", - "sha256:fdac1e4366d0579fff056d1280b8dc6348be964fda8ebb627c0269e097ab37fa" - ], - "version": "==2.1.7" + "cachetools": { + "hashes": [ + "sha256:6a94c6402995a99c3970cc7e4884bb60b4a8639938157eeed436098bf9831757", + "sha256:f9f17d2aec496a9aa6b76f53e3b614c965223c061982d434d160f930c698a9db" + ], + "markers": "python_version ~= '3.7'", + "version": "==5.2.0" + }, + "certifi": { + "hashes": [ + "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", + "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" + ], + "markers": "python_version >= '3.6'", + "version": "==2022.9.24" }, "cffi": { "hashes": [ @@ -344,6 +376,14 @@ ], "version": "==2.2.0" }, + "click": { + "hashes": [ + "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e", + "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.3" + }, "colorlog": { "hashes": [ "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662", @@ -352,13 +392,12 @@ "markers": "python_version >= '3.6'", "version": "==6.7.0" }, - "croniter": { + "flatbuffers": { "hashes": [ - "sha256:32a5ec04e97ec0837bcdf013767abd2e71cceeefd3c2e14c804098ce51ad6cd9", - "sha256:d6ed8386d5f4bbb29419dc1b65c4909c04a2322bd15ec0dc5b2877bfa1b75c7a" + "sha256:13043a5deba77e55b73064750195d2c5b494754d52b7d4ad01bc52cad5c3c9f2", + "sha256:2a82b85eea7f6712ab41077086dae1a89382862fe64414c8ebdf976123d1a095" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.3.8" + "version": "==22.11.23" }, "frozenlist": { "hashes": [ @@ -440,24 +479,137 @@ "markers": "python_version >= '3.7'", "version": "==1.3.3" }, + "gast": { + "hashes": [ + "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1", + "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.4.0" + }, + "google-auth": { + "hashes": [ + "sha256:6897b93556d8d807ad70701bb89f000183aea366ca7ed94680828b37437a4994", + "sha256:72f12a6cfc968d754d7bdab369c5c5c16032106e52d32c6dfd8484e4c01a6d1f" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==2.15.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73", + "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a" + ], + "markers": "python_version >= '3.6'", + "version": "==0.4.6" + }, + "google-pasta": { + "hashes": [ + "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954", + "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e" + ], + "version": "==0.2.0" + }, + "grpcio": { + "hashes": [ + "sha256:094e64236253590d9d4075665c77b329d707b6fca864dd62b144255e199b4f87", + "sha256:0dc5354e38e5adf2498312f7241b14c7ce3484eefa0082db4297189dcbe272e6", + "sha256:0e1a9e1b4a23808f1132aa35f968cd8e659f60af3ffd6fb00bcf9a65e7db279f", + "sha256:0fb93051331acbb75b49a2a0fd9239c6ba9528f6bdc1dd400ad1cb66cf864292", + "sha256:16c71740640ba3a882f50b01bf58154681d44b51f09a5728180a8fdc66c67bd5", + "sha256:172405ca6bdfedd6054c74c62085946e45ad4d9cec9f3c42b4c9a02546c4c7e9", + "sha256:17ec9b13cec4a286b9e606b48191e560ca2f3bbdf3986f91e480a95d1582e1a7", + "sha256:22b011674090594f1f3245960ced7386f6af35485a38901f8afee8ad01541dbd", + "sha256:24ac1154c4b2ab4a0c5326a76161547e70664cd2c39ba75f00fc8a2170964ea2", + "sha256:257478300735ce3c98d65a930bbda3db172bd4e00968ba743e6a1154ea6edf10", + "sha256:29cb97d41a4ead83b7bcad23bdb25bdd170b1e2cba16db6d3acbb090bc2de43c", + "sha256:2b170eaf51518275c9b6b22ccb59450537c5a8555326fd96ff7391b5dd75303c", + "sha256:31bb6bc7ff145e2771c9baf612f4b9ebbc9605ccdc5f3ff3d5553de7fc0e0d79", + "sha256:3c2b3842dcf870912da31a503454a33a697392f60c5e2697c91d133130c2c85d", + "sha256:3f9b0023c2c92bebd1be72cdfca23004ea748be1813a66d684d49d67d836adde", + "sha256:471d39d3370ca923a316d49c8aac66356cea708a11e647e3bdc3d0b5de4f0a40", + "sha256:49d680356a975d9c66a678eb2dde192d5dc427a7994fb977363634e781614f7c", + "sha256:4c4423ea38a7825b8fed8934d6d9aeebdf646c97e3c608c3b0bcf23616f33877", + "sha256:506b9b7a4cede87d7219bfb31014d7b471cfc77157da9e820a737ec1ea4b0663", + "sha256:538d981818e49b6ed1e9c8d5e5adf29f71c4e334e7d459bf47e9b7abb3c30e09", + "sha256:59dffade859f157bcc55243714d57b286da6ae16469bf1ac0614d281b5f49b67", + "sha256:5a6ebcdef0ef12005d56d38be30f5156d1cb3373b52e96f147f4a24b0ddb3a9d", + "sha256:5dca372268c6ab6372d37d6b9f9343e7e5b4bc09779f819f9470cd88b2ece3c3", + "sha256:6df3b63538c362312bc5fa95fb965069c65c3ea91d7ce78ad9c47cab57226f54", + "sha256:6f0b89967ee11f2b654c23b27086d88ad7bf08c0b3c2a280362f28c3698b2896", + "sha256:75e29a90dc319f0ad4d87ba6d20083615a00d8276b51512e04ad7452b5c23b04", + "sha256:7942b32a291421460d6a07883033e392167d30724aa84987e6956cd15f1a21b9", + "sha256:9235dcd5144a83f9ca6f431bd0eccc46b90e2c22fe27b7f7d77cabb2fb515595", + "sha256:97d67983189e2e45550eac194d6234fc38b8c3b5396c153821f2d906ed46e0ce", + "sha256:9ff42c5620b4e4530609e11afefa4a62ca91fa0abb045a8957e509ef84e54d30", + "sha256:a8a0b77e992c64880e6efbe0086fe54dfc0bbd56f72a92d9e48264dcd2a3db98", + "sha256:aacb54f7789ede5cbf1d007637f792d3e87f1c9841f57dd51abf89337d1b8472", + "sha256:bc59f7ba87972ab236f8669d8ca7400f02a0eadf273ca00e02af64d588046f02", + "sha256:cc2bece1737b44d878cc1510ea04469a8073dbbcdd762175168937ae4742dfb3", + "sha256:cd3baccea2bc5c38aeb14e5b00167bd4e2373a373a5e4d8d850bd193edad150c", + "sha256:dad6533411d033b77f5369eafe87af8583178efd4039c41d7515d3336c53b4f1", + "sha256:e223a9793522680beae44671b9ed8f6d25bbe5ddf8887e66aebad5e0686049ef", + "sha256:e473525c28251558337b5c1ad3fa969511e42304524a4e404065e165b084c9e4", + "sha256:e4ef09f8997c4be5f3504cefa6b5c6cc3cf648274ce3cede84d4342a35d76db6", + "sha256:e6dfc2b6567b1c261739b43d9c59d201c1b89e017afd9e684d85aa7a186c9f7a", + "sha256:eacad297ea60c72dd280d3353d93fb1dcca952ec11de6bb3c49d12a572ba31dd", + "sha256:f1158bccbb919da42544a4d3af5d9296a3358539ffa01018307337365a9a0c64", + "sha256:f1fec3abaf274cdb85bf3878167cfde5ad4a4d97c68421afda95174de85ba813", + "sha256:f96ace1540223f26fbe7c4ebbf8a98e3929a6aa0290c8033d12526847b291c0f", + "sha256:fbdbe9a849854fe484c00823f45b7baab159bdd4a46075302281998cb8719df5" + ], + "markers": "python_version >= '3.7'", + "version": "==1.51.1" + }, + "guesslang": { + "git": "https://github.com/SimeonAleksov/guesslang.git", + "ref": "d3b55c255d1886bce96610c04cb9241afca6f9d4" + }, + "h5py": { + "hashes": [ + "sha256:03d64fb86bb86b978928bad923b64419a23e836499ec6363e305ad28afd9d287", + "sha256:04e2e1e2fc51b8873e972a08d2f89625ef999b1f2d276199011af57bb9fc7851", + "sha256:0798a9c0ff45f17d0192e4d7114d734cac9f8b2b2c76dd1d923c4d0923f27bb6", + "sha256:0a047fddbe6951bce40e9cde63373c838a978c5e05a011a682db9ba6334b8e85", + "sha256:0d8de8cb619fc597da7cf8cdcbf3b7ff8c5f6db836568afc7dc16d21f59b2b49", + "sha256:1fcb11a2dc8eb7ddcae08afd8fae02ba10467753a857fa07a404d700a93f3d53", + "sha256:3fcf37884383c5da64846ab510190720027dca0768def34dd8dcb659dbe5cbf3", + "sha256:43fed4d13743cf02798a9a03a360a88e589d81285e72b83f47d37bb64ed44881", + "sha256:63beb8b7b47d0896c50de6efb9a1eaa81dbe211f3767e7dd7db159cea51ba37a", + "sha256:6776d896fb90c5938de8acb925e057e2f9f28755f67ec3edcbc8344832616c38", + "sha256:9e2ad2aa000f5b1e73b5dfe22f358ca46bf1a2b6ca394d9659874d7fc251731a", + "sha256:9e7535df5ee3dc3e5d1f408fdfc0b33b46bc9b34db82743c82cd674d8239b9ad", + "sha256:a9351d729ea754db36d175098361b920573fdad334125f86ac1dd3a083355e20", + "sha256:c038399ce09a58ff8d89ec3e62f00aa7cb82d14f34e24735b920e2a811a3a426", + "sha256:d77af42cb751ad6cc44f11bae73075a07429a5cf2094dfde2b1e716e059b3911", + "sha256:e5b7820b75f9519499d76cc708e27242ccfdd9dfb511d6deb98701961d0445aa", + "sha256:ed43e2cc4f511756fd664fb45d6b66c3cbed4e3bd0f70e29c37809b2ae013c44", + "sha256:f084bbe816907dfe59006756f8f2d16d352faff2d107f4ffeb1d8de126fc5dc7", + "sha256:f514b24cacdd983e61f8d371edac8c1b780c279d0acb8485639e97339c866073", + "sha256:f73307c876af49aa869ec5df1818e9bb0bdcfcf8a5ba773cc45a4fba5a286a5c" + ], + "markers": "python_version >= '3.7'", + "version": "==3.7.0" + }, "hikari": { "extras": [ "speedups" ], "hashes": [ - "sha256:03ed0685e7fc703d742334a103e9db62b57fd011e28521ccdb17149e6e37cd90", - "sha256:8897055001605d987ea3ddba9c9ba546d34f18bcee7710073abb601e114faca4" + "sha256:cd56d2bef9422838458b4908e609842fe7c4bed3a58fe4084204836883969033", + "sha256:fe3f4f860f06ea97c73061371f104d5becb6de8d7dd4b1c1b0c76f131f8d69df" ], "index": "pypi", - "version": "==2.0.0.dev109" + "version": "==2.0.0.dev112" }, "hikari-crescent": { "hashes": [ - "sha256:4be12e50facad3f85f5d625c0d88f02484af86356569f3e09b504e37439e23bb", - "sha256:c01af801bc30e814186413d2166f3940921d553faa6344d02dd3918b98cc7be0" + "sha256:125bf8f2510241692ffe0277ddf4b2a7a9478062d6084032449dae43c1037f39", + "sha256:d69bbfbd194e5f4e07adb2b89fab9ce5ad0c86426a30bb11fad13c2763fd7e16" ], "index": "pypi", - "version": "==0.2.4" + "version": "==0.4.0" }, "idna": { "hashes": [ @@ -467,6 +619,82 @@ "markers": "python_version >= '3.5'", "version": "==3.4" }, + "keras": { + "hashes": [ + "sha256:38c6fff0ea9a8b06a2717736565c92a73c8cd9b1c239e7125ccb188b7848f65e" + ], + "markers": "python_version >= '3.7'", + "version": "==2.11.0" + }, + "libclang": { + "hashes": [ + "sha256:206d2789e4450a37d054e63b70451a6fc1873466397443fa13de2b3d4adb2796", + "sha256:2e4303e04517fcd11173cb2e51a7070eed71e16ef45d4e26a82c5e881cac3d27", + "sha256:5dd3c6fca1b007d308a4114afa8e4e9d32f32b2572520701d45fcc626ac5cd6c", + "sha256:7b06fc76bd1e67c8b04b5719bf2ac5d6a323b289b245dfa9e468561d99538188", + "sha256:8791cf3c3b087c373a6d61e9199da7a541da922c9ddcfed1122090586b996d6e", + "sha256:9052a8284d8846984f6fa826b1d7460a66d3b23a486d782633b42b6e3b418789", + "sha256:cfb0e892ebb5dff6bd498ab5778adb8581f26a00fd8347b3c76c989fe2fd04f7", + "sha256:e2add1703129b2abe066fb1890afa880870a89fd6ab4ec5d2a7a8dc8d271677e", + "sha256:e429853939423f276a25140b0b702442d7da9a09e001c05e48df888336947614", + "sha256:ea03c12675151837660cdd5dce65bd89320896ac3421efef43a36678f113ce95" + ], + "version": "==14.0.6" + }, + "markdown": { + "hashes": [ + "sha256:08fb8465cffd03d10b9dd34a5c3fea908e20391a2a90b88d66362cb05beed186", + "sha256:3b809086bb6efad416156e00a0da66fe47618a5d6918dd688f53f40c8e4cfeff" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.1" + }, + "markupsafe": { + "hashes": [ + "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", + "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88", + "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5", + "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7", + "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a", + "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603", + "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1", + "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135", + "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247", + "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6", + "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601", + "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77", + "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02", + "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e", + "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63", + "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f", + "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980", + "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b", + "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812", + "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff", + "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96", + "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1", + "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925", + "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a", + "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6", + "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e", + "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f", + "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4", + "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f", + "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3", + "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c", + "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a", + "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417", + "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a", + "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a", + "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37", + "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452", + "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933", + "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a", + "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.1" + }, "multidict": { "hashes": [ "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60", @@ -539,6 +767,147 @@ ], "version": "==0.4.3" }, + "numpy": { + "hashes": [ + "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d", + "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07", + "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df", + "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9", + "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d", + "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", + "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719", + "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2", + "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280", + "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa", + "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387", + "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", + "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", + "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f", + "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398", + "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", + "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de", + "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8", + "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481", + "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0", + "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d", + "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e", + "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96", + "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb", + "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6", + "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", + "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a", + "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135" + ], + "markers": "python_version >= '3.8'", + "version": "==1.23.5" + }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" + }, + "opt-einsum": { + "hashes": [ + "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147", + "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549" + ], + "markers": "python_version >= '3.5'", + "version": "==3.3.0" + }, + "packaging": { + "hashes": [ + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" + ], + "markers": "python_version >= '3.6'", + "version": "==21.3" + }, + "pathspec": { + "hashes": [ + "sha256:88c2606f2c1e818b978540f73ecc908e13999c6c3a383daf3705652ae79807a5", + "sha256:8f6bf73e5758fd365ef5d58ce09ac7c27d2833a8d7da51712eac6e27e35141b0" + ], + "markers": "python_version >= '3.7'", + "version": "==0.10.2" + }, + "platformdirs": { + "hashes": [ + "sha256:1006647646d80f16130f052404c6b901e80ee4ed6bef6792e1f238a8969106f7", + "sha256:af0276409f9a02373d540bf8480021a048711d572745aef4b7842dad245eba10" + ], + "markers": "python_version >= '3.7'", + "version": "==2.5.4" + }, + "protobuf": { + "hashes": [ + "sha256:010be24d5a44be7b0613750ab40bc8b8cedc796db468eae6c779b395f50d1fa1", + "sha256:0469bc66160180165e4e29de7f445e57a34ab68f49357392c5b2f54c656ab25e", + "sha256:0c0714b025ec057b5a7600cb66ce7c693815f897cfda6d6efb58201c472e3437", + "sha256:11478547958c2dfea921920617eb457bc26867b0d1aa065ab05f35080c5d9eb6", + "sha256:14082457dc02be946f60b15aad35e9f5c69e738f80ebbc0900a19bc83734a5a4", + "sha256:2b2d2913bcda0e0ec9a784d194bc490f5dc3d9d71d322d070b11a0ade32ff6ba", + "sha256:30a15015d86b9c3b8d6bf78d5b8c7749f2512c29f168ca259c9d7727604d0e39", + "sha256:30f5370d50295b246eaa0296533403961f7e64b03ea12265d6dfce3a391d8992", + "sha256:347b393d4dd06fb93a77620781e11c058b3b0a5289262f094379ada2920a3730", + "sha256:4bc98de3cdccfb5cd769620d5785b92c662b6bfad03a202b83799b6ed3fa1fa7", + "sha256:5057c64052a1f1dd7d4450e9aac25af6bf36cfbfb3a1cd89d16393a036c49157", + "sha256:559670e006e3173308c9254d63facb2c03865818f22204037ab76f7a0ff70b5f", + "sha256:5a0d7539a1b1fb7e76bf5faa0b44b30f812758e989e59c40f77a7dab320e79b9", + "sha256:5f5540d57a43042389e87661c6eaa50f47c19c6176e8cf1c4f287aeefeccb5c4", + "sha256:7a552af4dc34793803f4e735aabe97ffc45962dfd3a237bdde242bff5a3de684", + "sha256:84a04134866861b11556a82dd91ea6daf1f4925746b992f277b84013a7cc1229", + "sha256:878b4cd080a21ddda6ac6d1e163403ec6eea2e206cf225982ae04567d39be7b0", + "sha256:90b0d02163c4e67279ddb6dc25e063db0130fc299aefabb5d481053509fae5c8", + "sha256:91d5f1e139ff92c37e0ff07f391101df77e55ebb97f46bbc1535298d72019462", + "sha256:a8ce5ae0de28b51dff886fb922012dad885e66176663950cb2344c0439ecb473", + "sha256:aa3b82ca1f24ab5326dcf4ea00fcbda703e986b22f3d27541654f749564d778b", + "sha256:bb6776bd18f01ffe9920e78e03a8676530a5d6c5911934c6a1ac6eb78973ecb6", + "sha256:bbf5cea5048272e1c60d235c7bd12ce1b14b8a16e76917f371c718bd3005f045", + "sha256:c0ccd3f940fe7f3b35a261b1dd1b4fc850c8fde9f74207015431f174be5976b3", + "sha256:d0b635cefebd7a8a0f92020562dead912f81f401af7e71f16bf9506ff3bdbb38" + ], + "markers": "python_version >= '3.5'", + "version": "==3.19.6" + }, + "pyasn1": { + "hashes": [ + "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", + "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", + "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", + "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", + "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", + "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", + "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", + "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", + "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", + "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", + "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", + "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", + "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" + ], + "version": "==0.4.8" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", + "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", + "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", + "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", + "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", + "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", + "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", + "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", + "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", + "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", + "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", + "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", + "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" + ], + "version": "==0.2.8" + }, "pycares": { "hashes": [ "sha256:02fdf5ce48b21da6eafc5cb4508d344a0d48ac1a31e8df178f7c2fb548fcbc14", @@ -593,49 +962,6 @@ ], "version": "==4.2.2" }, - "pycooldown": { - "hashes": [ - "sha256:060202831b923e6d6ebd6f55dc86b427553a54f61580aa0c03ad9920f83cc28e", - "sha256:0c02c7174438258be46a2dfc87916694a09fefd090ab790fcb530246c839138e", - "sha256:1040ba25cce5fc39b453aa8d02fbf3a19901a915e621d0c81d084c683c293998", - "sha256:14c4cfeefad0bb13e8ae2cb8c3e4fe3d22faa0ac2e37b38951e15e14244039dd", - "sha256:1a37c07d6cdc506bb11a9da01616839ebf67a13cb076741452a1ecd361918723", - "sha256:1a82e6ddeffe61a16538cbf44b6335d94b48a7c5cbbc5037171c6b10cf353c8a", - "sha256:1d01e0596a72f6bc1dee5df4e0e3ffed6907f1d7e6c9c41fd5075a63f4a093ec", - "sha256:2226f6a81d6681225a37474fd0d81191d96ed39cd9056bcb147b132b9e092564", - "sha256:297d4302b71b41ef33fef74245eba9bf620245db742bd70d44e06ff0c65704b4", - "sha256:352f7ddb0fb2d1870874d5ba12c59e65ae78b929a924f18fd101c085325ae8ab", - "sha256:3b40caee97bd1ae68bbc0f6d27301d83de85f5f64c63d2fb0c5af6d40a8e34d0", - "sha256:42dad7f07b3dcef6c28eb91bd1e187fe1bd496668a5dc61a46c90cea84a4ff12", - "sha256:43fab547364eed459e1739ef3e0bb12587e4752c0bd8d5a5a5517ca72048b9b8", - "sha256:44add316bb0ee0703af401bf9d84bdf614944c619f5229eac8c2cab22cd62ab8", - "sha256:531377476033d49cadbe2e636717b47f1dee6d64e89a39cb61490a60cc2d6e58", - "sha256:5455b01bf40dc58b4e44b0887def783e89054be4d8facd07006bb8ea9fe1fba8", - "sha256:594e0ebf7eb3a6ccbf3473921337591fd5bb9acf664bcd182f16839ea36c07f5", - "sha256:5e258278b91fe045a56097bed19f66e5ba853f33e06d73b110c3bb49882dc370", - "sha256:6cd487d8ccb3966dece28380609024ea9fcebeb8422b47caaa80259d184fe3c9", - "sha256:7a1a64f5a1ef062e90c198a2a51c0b2d85a43cf872f65ccf1e56fb1288001036", - "sha256:80f795787f342f005dfcd51b2bcb3677b99d63f346b63f0f05744ed5d9c47945", - "sha256:8422a857b26d5cf46eb68e3d736bb62188c1e4be11256b1f57e5b810acf38b89", - "sha256:885ecb86fd2731aa2fffb27bbf60867d9dbf7d0ea13d0eaf6dc49f3a25681b3a", - "sha256:8a8b6f7b5f3e7fe5ddc72dc26a4da961eb1987db0945ef7927e03919a2c2e185", - "sha256:91e85c701266d191e6a1345461477dfee356644873ab5e713ec4b2ec1dd33400", - "sha256:95b1fd01fb26562c710bd7f62a45b4ab13b2b4c420c147513644d36ebedbf8aa", - "sha256:9fe1374ae56dc3760c948da22efdbf6bbae65ac44cd98fc719ec1d7e083ca26f", - "sha256:ab105b8a757a6b3bd498c39e9324f106e151a4a8c730c011ad9b6d02973c8820", - "sha256:b627976582cecc052397e28a9723a2e6fca213122483bbb7a49b821fda4ab4bd", - "sha256:b71bfe3e9b28fa8869c16358c5a27586dc1f3249d5054eb3aab3d4ecfc470242", - "sha256:b7c51af84d67debd5d677fb3939877de5a169e7025984b9988a056eab4151b60", - "sha256:dc10165e450fb3a4f57a0950596178a621aa4b659beaf8d2175d2f772236cdbf", - "sha256:dee42aac8a301e76dc01361403ba8aef801d897a99e26c7d26f22c83617883aa", - "sha256:e1e99833ec3853926563d6bbe45a173273918c3359ec4e8deac2d5f87e65d84a", - "sha256:e38bbda99cf3d1d459481a8709ac10387cd1fc942907bb644a932f116afd649e", - "sha256:e3a4b5d95d656a86e300f5c98af8d77db50fe8a73e80d76268a36156c53796c6", - "sha256:ec1bb31f7d1c8e4f2043e6a76ea8721aa18ec1da966ae29f69ed7278cb12449d" - ], - "index": "pypi", - "version": "==0.1.0b11" - }, "pycparser": { "hashes": [ "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", @@ -643,13 +969,13 @@ ], "version": "==2.21" }, - "python-dateutil": { + "pyparsing": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb", + "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "markers": "python_full_version >= '3.6.8'", + "version": "==3.0.9" }, "python-dotenv": { "hashes": [ @@ -659,6 +985,46 @@ "index": "pypi", "version": "==0.21.0" }, + "requests": { + "hashes": [ + "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", + "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" + ], + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==2.28.1" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5", + "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.3.1" + }, + "rsa": { + "hashes": [ + "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" + ], + "markers": "python_version >= '3.6'", + "version": "==4.9" + }, + "setuptools": { + "hashes": [ + "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", + "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75" + ], + "markers": "python_version >= '3.7'", + "version": "==65.6.3" + }, + "sigparse": { + "hashes": [ + "sha256:45106a72e29642c6d78085245bf89918dc5531967581b9d1c106474b93326bf5", + "sha256:b24fefb65c17511f2c50516522d88191994d2868d4c93fa0df677b361fe1206f" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.1" + }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", @@ -667,12 +1033,117 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, - "types-croniter": { + "soupsieve": { + "hashes": [ + "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759", + "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d" + ], + "markers": "python_version >= '3.6'", + "version": "==2.3.2.post1" + }, + "tensorboard": { + "hashes": [ + "sha256:a0e592ee87962e17af3f0dce7faae3fbbd239030159e9e625cce810b7e35c53d" + ], + "markers": "python_version >= '3.7'", + "version": "==2.11.0" + }, + "tensorboard-data-server": { + "hashes": [ + "sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7", + "sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a", + "sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee" + ], + "markers": "python_version >= '3.6'", + "version": "==0.6.1" + }, + "tensorboard-plugin-wit": { "hashes": [ - "sha256:e96e9c855247f294fb88cc1363a5eb93fd1df5943fe85dda29179285e00deabc", - "sha256:f529295f94aff6da82222739bbcdeed7fe98de9fe38597f04071d2a1b980ee06" + "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe" ], - "version": "==1.3.2" + "version": "==1.8.1" + }, + "tensorflow": { + "hashes": [ + "sha256:056d29f2212342536ce3856aa47910a2515eb97ec0a6cc29ed47fc4be1369ec8", + "sha256:0d28f9691ebc48c0075e271023b3f147ae2bc29a3d3a7f42d45019c6b4a700d2", + "sha256:17b29d6d360fad545ab1127db52592efd3f19ac55c1a45e5014da328ae867ab4", + "sha256:276a44210d956701899dc78ad0aa116a0071f22fb0bcc1ea6bb59f7646b08d11", + "sha256:2cdba2fce00d6c924470d4fb65d5e95a4b6571a863860608c0c13f0393f4ca0d", + "sha256:335ab5cccd7a1c46e3d89d9d46913f0715e8032df8d7438f9743b3fb97b39f69", + "sha256:445510f092f7827e1f60f59b8bfb58e664aaf05d07daaa21c5735a7f76ca2b25", + "sha256:4f2ab20f93d2b52a44b414ec6dcf82aa12110e90e0920039a27108de28ae2728", + "sha256:6c049fec6c2040685d6f43a63e17ccc5d6b0abc16b70cc6f5e7d691262b5d2d0", + "sha256:bcc8380820cea8f68f6c90b8aee5432e8537e5bb9ec79ac61a98e6a9a02c7d40", + "sha256:cc3444fe1d58c65a195a69656bf56015bf19dc2916da607d784b0a1e215ec008", + "sha256:d29c1179149fa469ad68234c52c83081d037ead243f90e826074e2563a0f938a", + "sha256:d470b772ee3c291a8c7be2331e7c379e0c338223c0bf532f5906d4556f17580d", + "sha256:d48da37c8ae711eb38047a56a052ca8bb4ee018a91a479e42b7a8d117628c32e", + "sha256:d973458241c8771bf95d4ba68ad5d67b094f72dd181c2d562ffab538c1b0dad7", + "sha256:d9cf25bca641f2e5c77caa3bfd8dd6b892a7aec0695c54d2a7c9f52a54a8d487" + ], + "markers": "python_version >= '3.7'", + "version": "==2.11.0" + }, + "tensorflow-estimator": { + "hashes": [ + "sha256:ea3b64acfff3d9a244f06178c9bdedcbdd3f125b67d0888dba8229498d06468b" + ], + "markers": "python_version >= '3.7'", + "version": "==2.11.0" + }, + "tensorflow-io-gcs-filesystem": { + "hashes": [ + "sha256:00cf6a92f1f9f90b2ba2d728870bcd2a70b116316d0817ab0b91dd390c25b3fd", + "sha256:22753dc28c949bfaf29b573ee376370762c88d80330fe95cfb291261eb5e927a", + "sha256:366e1eff8dbd6b64333d7061e2a8efd081ae4742614f717ced08d8cc9379eb50", + "sha256:52988659f405166df79905e9859bc84ae2a71e3ff61522ba32a95e4dce8e66d2", + "sha256:5fbef5836e70026245d8d9e692c44dae2c6dbc208c743d01f5b7a2978d6b6bc6", + "sha256:698d7f89e09812b9afeb47c3860797343a22f997c64ab9dab98132c61daa8a7d", + "sha256:6d95f306ff225c5053fd06deeab3e3a2716357923cb40c44d566c11be779caa3", + "sha256:9484893779324b2d34874b0aacf3b824eb4f22d782e75df029cbccab2e607974", + "sha256:a6670e0da16c884267e896ea5c3334d6fd319bd6ff7cf917043a9f3b2babb1b3", + "sha256:b6e2d275020fb4d1a952cd3fa546483f4e46ad91d64e90d3458e5ca3d12f6477", + "sha256:bbf245883aa52ec687b66d0fcbe0f5f0a92d98c0b1c53e6a736039a3548d29a1", + "sha256:bfed720fc691d3f45802a7bed420716805aef0939c11cebf25798906201f626e", + "sha256:c5d99f56c12a349905ff684142e4d2df06ae68ecf50c4aad5449a5f81731d858", + "sha256:cc062ce13ec95fb64b1fd426818a6d2b0e5be9692bc0e43a19cce115b6da4336", + "sha256:f76cbe1a784841c223f6861e5f6c7e53aa6232cb626d57e76881a0638c365de6" + ], + "markers": "platform_machine != 'arm64' or platform_system != 'Darwin'", + "version": "==0.28.0" + }, + "termcolor": { + "hashes": [ + "sha256:67cee2009adc6449c650f6bcf3bdeed00c8ba53a8cda5362733c53e0a39fb70b", + "sha256:fa852e957f97252205e105dd55bbc23b419a70fec0085708fc0515e399f304fd" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.1" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_full_version < '3.11.0a7'", + "version": "==2.0.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", + "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e" + ], + "markers": "python_version >= '3.7'", + "version": "==4.4.0" + }, + "urllib3": { + "hashes": [ + "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc", + "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.13" }, "uvloop": { "hashes": [ @@ -710,6 +1181,92 @@ "index": "pypi", "version": "==0.17.0" }, + "werkzeug": { + "hashes": [ + "sha256:7ea2d48322cc7c0f8b3a215ed73eabd7b5d75d0b50e31ab006286ccff9e00b8f", + "sha256:f979ab81f58d7318e064e99c4506445d60135ac5cd2e177a2de0089bfd4c9bd5" + ], + "markers": "python_version >= '3.7'", + "version": "==2.2.2" + }, + "wheel": { + "hashes": [ + "sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac", + "sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8" + ], + "markers": "python_version >= '3.7'", + "version": "==0.38.4" + }, + "wrapt": { + "hashes": [ + "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3", + "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b", + "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4", + "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2", + "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656", + "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3", + "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff", + "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310", + "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a", + "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57", + "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069", + "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", + "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe", + "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87", + "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", + "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b", + "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907", + "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f", + "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0", + "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28", + "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1", + "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853", + "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc", + "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3", + "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3", + "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164", + "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1", + "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c", + "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1", + "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7", + "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1", + "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320", + "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed", + "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1", + "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248", + "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c", + "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456", + "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77", + "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef", + "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1", + "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7", + "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", + "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4", + "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d", + "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d", + "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8", + "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5", + "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471", + "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00", + "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68", + "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3", + "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d", + "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735", + "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d", + "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569", + "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7", + "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59", + "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5", + "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", + "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b", + "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f", + "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462", + "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015", + "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.14.1" + }, "yarl": { "hashes": [ "sha256:076eede537ab978b605f41db79a56cad2e7efeea2aa6e0fa8f05a26c24a034fb", @@ -1028,6 +1585,14 @@ "markers": "python_full_version < '3.11.0a7'", "version": "==2.0.1" }, + "types-beautifulsoup4": { + "hashes": [ + "sha256:c1f803367a2b07ad4fdac40ddbea557010dc4ddd1ee92d801f317eb02e2e3c72", + "sha256:d46be8f409ddccb6daaa9d118484185e70bcf552085c39c6d05b157cd1462e04" + ], + "index": "pypi", + "version": "==4.11.6.1" + }, "typing-extensions": { "hashes": [ "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa", diff --git a/bot/__main__.py b/bot/__main__.py index 4bf2ebf..1619300 100644 --- a/bot/__main__.py +++ b/bot/__main__.py @@ -4,10 +4,13 @@ import commands import crescent +import events from dotenv import load_dotenv +_LOG_PREFIX = "[BOT]" load_dotenv() logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) if os.name != "nt": @@ -20,5 +23,10 @@ for module in inspect.getmembers(commands, predicate=inspect.ismodule): bot.plugins.load(f"commands.{module[0]}") + logger.info(f"{_LOG_PREFIX} Loading module commands.{module[0]}.") + +for module in inspect.getmembers(events, predicate=inspect.ismodule): + bot.plugins.load(f"events.{module[0]}") + logger.info(f"{_LOG_PREFIX} Loading module events.{module[0]}.") bot.run() diff --git a/bot/codeblocks/__init__.py b/bot/codeblocks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bot/codeblocks/constants.py b/bot/codeblocks/constants.py new file mode 100644 index 0000000..28ce6d7 --- /dev/null +++ b/bot/codeblocks/constants.py @@ -0,0 +1,33 @@ +import enum + +from codeblocks.utils import black_string + + +class Language(enum.Enum): + PYTHON = "Python" + HTML = "HTML" + JAVASCRIPT = "JavaScript" + NONE = "" + + @classmethod + def choices(cls): + return [lang.value for lang in cls if lang.value] + + def get_markdown_name(self): + _mapping = {"Python": "py", "HTML": "html", "JavaScript": "js"} + return _mapping.get(self.value) + + +_EXAMPLE_CODE = black_string("def add_one(foo: int) -> int: return foo + 1") +_ESCAPED_CODEBLOCK = f"\`\`\`python\n{_EXAMPLE_CODE}\n\`\`\`" # noqa: W605 + + +def get_escaped_codeblock(): + return _ESCAPED_CODEBLOCK + + +def get_example_code(): + return _EXAMPLE_CODE + + +LANGUAGE_GUESS_TRESHOLD = 0.5 diff --git a/bot/codeblocks/parsers.py b/bot/codeblocks/parsers.py new file mode 100644 index 0000000..f48be34 --- /dev/null +++ b/bot/codeblocks/parsers.py @@ -0,0 +1,116 @@ +import abc +import ast +import logging +from typing import Optional, Union + +import bs4 +import guesslang +import hikari +from codeblocks.constants import LANGUAGE_GUESS_TRESHOLD, Language +from codeblocks.types import Codeblock, MarkdownCodeblock +from codeblocks.utils import black_string + +logger = logging.getLogger(__name__) +_LOG_PREFIX = "[CODEBLOCK-PARSER]" + + +class CodeblockParser(abc.ABC): + def __init__(self, message: hikari.Message) -> None: + self.codeblock = Codeblock.from_message(message=message) + + def validate_and_format(self): + return MarkdownCodeblock.set_content( + content=self.format_code(self.codeblock.content), + language=self.validate_and_get_language(), + ) + + @abc.abstractmethod + def validate_and_get_language(self): + pass + + @abc.abstractmethod + def format_code(self, content: str) -> str: + pass + + +class PythonParser(CodeblockParser): + def validate_and_get_language(self): + if self.is_valid_python(self.codeblock.content): + return Language.PYTHON + + def format_code(self, content: str) -> str: + return black_string(content) + + @classmethod + def is_valid_python(cls, content: str) -> bool: + logger.info(f"{_LOG_PREFIX} Checking if message is valid python code.") + try: + content = content.replace("\x00", "") + tree = ast.parse(content) + except SyntaxError: + return False + return not all(isinstance(node, ast.Expr) for node in tree.body) + + +class HTMLParser(CodeblockParser): + def validate_and_get_language(self): + logger.info(f"{_LOG_PREFIX} Checking if message is valid html code.") + if self.is_valid_html(content=self.codeblock.content): + return Language.HTML + + @classmethod + def is_valid_html(cls, content: str) -> bool: + logger.info(f"{_LOG_PREFIX} Checking if message is valid html code.") + return bool(bs4.BeautifulSoup(content, "html.parser").find()) + + def format_code(self, content: str) -> str: + return content + + +class JavascriptParser(CodeblockParser): + def validate_and_get_language(self): + if self.is_javascript_code(content=self.codeblock.content): + return Language.JAVASCRIPT + + def format_code(self, content: str) -> str: + return content + + @classmethod + def is_javascript_code(cls, content: str) -> Optional[bool]: + logger.info(f"{_LOG_PREFIX} Checking if message is valid javascript code.") + guess = guesslang.Guess() + if ( + dict(guess.probabilities(content))[Language.JAVASCRIPT.value] + > LANGUAGE_GUESS_TRESHOLD + ): + return guess.language_name(content) in Language.choices() + return None + + +def get_parser( + message: hikari.Message, +) -> Optional[Union[HTMLParser, PythonParser, JavascriptParser]]: + if message.content is not None: + if PythonParser.is_valid_python(content=message.content): + logger.info(f"{_LOG_PREFIX} Message is unformatted python code.") + return PythonParser(message=message) + elif HTMLParser.is_valid_html(content=message.content): + logger.info(f"{_LOG_PREFIX} Message is unformatted html code.") + return HTMLParser(message=message) + elif JavascriptParser.is_javascript_code(content=message.content): + logger.info(f"{_LOG_PREFIX} Message is unformatted javascript code.") + return JavascriptParser(message=message) + logger.info(f"{_LOG_PREFIX} Message is not valid code, no action necessary.") + return None + + +def should_parse_message(content: str) -> bool: + return not (_is_codeblock(content=content) or _is_inline_block(content=content)) + + +def _is_codeblock(content: str): + return content.startswith("```") and content.endswith("```") + + +def _is_inline_block(content: str): + return content.startswith("`") and content.endswith("`") diff --git a/bot/codeblocks/types.py b/bot/codeblocks/types.py new file mode 100644 index 0000000..6e91594 --- /dev/null +++ b/bot/codeblocks/types.py @@ -0,0 +1,41 @@ +from __future__ import annotations + +from typing import NamedTuple, Optional + +import hikari +from codeblocks.constants import Language +from markup import services as markdown_services + + +class Codeblock( + NamedTuple( + "Codeblock", + [ + ("content", Optional[str]), + ("length", int), + ], + ) +): + @classmethod + def from_message(cls, message: hikari.Message) -> Codeblock: + return cls( + content=message.content, + length=len(message.content.split("\n")) + if message.content is not None + else 0, + ) + + +class MarkdownCodeblock( + NamedTuple( + "MarkdownCodeblock", + [ + ("content", Optional[str]), + ], + ) +): + @classmethod + def set_content(cls, content: str, language: Language) -> MarkdownCodeblock: + return cls( + content=markdown_services.codeblock(text=content, language=language), + ) diff --git a/bot/codeblocks/utils.py b/bot/codeblocks/utils.py new file mode 100644 index 0000000..e4723ed --- /dev/null +++ b/bot/codeblocks/utils.py @@ -0,0 +1,13 @@ +import black + + +def black_string(content): + return black.format_str( + src_contents=content, + mode=black.Mode( + target_versions={black.TargetVersion.PY36}, + line_length=80, + string_normalization=False, + is_pyi=False, + ), + ) diff --git a/bot/commands/nags.py b/bot/commands/nags.py index 73d6256..dccd118 100644 --- a/bot/commands/nags.py +++ b/bot/commands/nags.py @@ -1,5 +1,7 @@ import crescent import hikari +from codeblocks import constants as codeblocks_constants +from markup import services as markup_services plugin = crescent.Plugin("nags") @@ -34,3 +36,26 @@ async def callback(self, ctx: crescent.Context) -> None: await ctx.respond( "Don't ask to ask, just ask: See https://dontasktoask.com/" ) + + +@plugin.include +@crescent.command( + name="markdown", description="How to properly format and markdown a codeblock." +) +class MarkdownCode: + user = crescent.option(hikari.User, "The user to mention", default=None) + + async def callback(self, ctx: crescent.Context) -> None: + message = ( + "When asking for help, you should properly markdown your code, for instance: \n\n" + f"{codeblocks_constants.get_escaped_codeblock()}\n\n" + f"This becomes: " + f"{markup_services.codeblock(codeblocks_constants.get_example_code(), codeblocks_constants.Language.PYTHON)}" + ) + if self.user: + await ctx.respond( + (message), + user_mentions=[self.user], + ) + else: + await ctx.respond(message) diff --git a/bot/events/__init__.py b/bot/events/__init__.py new file mode 100644 index 0000000..5ac8a4e --- /dev/null +++ b/bot/events/__init__.py @@ -0,0 +1,3 @@ +__all__ = ["codeblock"] + +from . import codeblock diff --git a/bot/events/codeblock.py b/bot/events/codeblock.py new file mode 100644 index 0000000..a416cfd --- /dev/null +++ b/bot/events/codeblock.py @@ -0,0 +1,27 @@ +import crescent +import hikari +from codeblocks.parsers import get_parser, should_parse_message + +plugin = crescent.Plugin("codeblocks") + + +@plugin.include +@crescent.event +async def on_message_format(event: hikari.MessageCreateEvent): + if event.message.author.is_bot or event.message.content is None: + return + if not should_parse_message(event.message.content): + return + + codeblock = get_parser(message=event.message) + if codeblock is not None: + await event.message.respond( + "Please use the slash command `/markdown` for more information on how to properly format your code.", + reply=True, + mentions_reply=True, + ) + await event.message.respond( + codeblock.validate_and_format().content, + reply=True, + mentions_reply=True, + ) diff --git a/bot/markup/__init__.py b/bot/markup/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/bot/markup/services.py b/bot/markup/services.py new file mode 100644 index 0000000..2a1c80b --- /dev/null +++ b/bot/markup/services.py @@ -0,0 +1,23 @@ +from typing import Optional + +from codeblocks.constants import Language + + +def bold(text: str) -> str: + return f"**{text}**" + + +def italics(text: str) -> str: + return f"*{text}*" + + +def inline_code(text: str) -> str: + return f"`{text}`" + + +def codeblock(text: str, language: Language) -> Optional[str]: + try: + return f"```{language.get_markdown_name()}\n{text}\n```" + except AttributeError: + pass + return None