diff --git a/Pipfile b/Pipfile index 79de308..494e48a 100644 --- a/Pipfile +++ b/Pipfile @@ -10,7 +10,8 @@ yt-dlp = "*" humanize = "*" httpx = "*" ollama = "*" -nio-bot = "==1.2.0a2" +nio-bot = {git = "git+https://github.com/nexy7574/nio-bot.git"} +thefuzz = "*" [dev-packages] ruff = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 4d3fb4b..498864e 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "7b3a2386eae7c5a43a5b76a069fd79e66e3fb045207ec4623050b38923f6863c" + "sha256": "6da0a4d5a8f4ae40d08db21d7dae5b6c579fb9b750f3ad379f7f286bebd6ba99" }, "pipfile-spec": 6, "requires": { @@ -671,11 +671,11 @@ }, "idna": { "hashes": [ - "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", - "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" + "sha256:69297d5da0cc9281c77efffb4e730254dd45943f45bbfb461de5991713989b1e", + "sha256:e5c5dafde284f26e9e0f28f6ea2d6400abd5ca099864a67f576f3981c6476124" ], "markers": "python_version >= '3.6'", - "version": "==3.8" + "version": "==3.9" }, "iso8601": { "hashes": [ @@ -824,13 +824,9 @@ "version": "==1.47.0" }, "nio-bot": { - "hashes": [ - "sha256:915e6c55f9f960c927a417dd039f3cf612f97b3709a3d8e1b6008de3258584a9", - "sha256:bd5b483a62b0d1ccff64d6960f579da2c641c15c73222b4038f24573c7a092a4" - ], - "index": "pypi", - "markers": "python_version < '3.14' and python_version >= '3.9'", - "version": "==1.2.0a2" + "git": "git+https://github.com/nexy7574/nio-bot.git", + "markers": "python_version < '3.13' and python_version >= '3.9'", + "ref": "46821599e36868d97d1961aee2ea3d0108de81cf" }, "ollama": { "hashes": [ @@ -1147,6 +1143,120 @@ ], "version": "==2024.2" }, + "rapidfuzz": { + "hashes": [ + "sha256:03126f9a040ff21d2a110610bfd6b93b79377ce8b4121edcb791d61b7df6eec5", + "sha256:048d55d36c02c6685a2b2741688503c3d15149694506655b6169dcfd3b6c2585", + "sha256:057bb03f39e285047d7e9412e01ecf31bb2d42b9466a5409d715d587460dd59b", + "sha256:0b1c2d504eddf97bc0f2eba422c8915576dbf025062ceaca2d68aecd66324ad9", + "sha256:0d1415a732ee75e74a90af12020b77a0b396b36c60afae1bde3208a78cd2c9fc", + "sha256:0e9125377fa3d21a8abd4fbdbcf1c27be73e8b1850f0b61b5b711364bf3b59db", + "sha256:110b6294396bc0a447648627479c9320f095c2034c0537f687592e0f58622638", + "sha256:111a20a3c090cf244d9406e60500b6c34b2375ba3a5009e2b38fd806fe38e337", + "sha256:13d8675a1fa7e2b19650ca7ef9a6ec01391d4bb12ab9e0793e8eb024538b4a34", + "sha256:18669bb6cdf7d40738526d37e550df09ba065b5a7560f3d802287988b6cb63cf", + "sha256:19c64d8ddb2940b42a4567b23f1681af77f50a5ff6c9b8e85daba079c210716e", + "sha256:1dc516ac6d32027be2b0196bedf6d977ac26debd09ca182376322ad620460feb", + "sha256:1de91e7fd7f525e10ea79a6e62c559d1b0278ec097ad83d9da378b6fab65a265", + "sha256:1ee2086f490cb501d86b7e386c1eb4e3a0ccbb0c99067089efaa8c79012c8952", + "sha256:1ef6a1a8f0b12f8722f595f15c62950c9a02d5abc64742561299ffd49f6c6944", + "sha256:1f1a33e84056b7892c721d84475d3bde49a145126bc4c6efe0d6d0d59cb31c29", + "sha256:22589c0b8ccc6c391ce7f776c93a8c92c96ab8d34e1a19f1bd2b12a235332632", + "sha256:2379e0b2578ad3ac7004f223251550f08bca873ff76c169b09410ec562ad78d8", + "sha256:268f8e1ca50fc61c0736f3fe9d47891424adf62d96ed30196f30f4bd8216b41f", + "sha256:3171653212218a162540a3c8eb8ae7d3dcc8548540b69eaecaf3b47c14d89c90", + "sha256:32532af1d70c6ec02ea5ac7ee2766dfff7c8ae8c761abfe8da9e527314e634e8", + "sha256:3445a35c4c8d288f2b2011eb61bce1227c633ce85a3154e727170f37c0266bb2", + "sha256:3492c7a42b7fa9f0051d7fcce9893e95ed91c97c9ec7fb64346f3e070dd318ed", + "sha256:35d3044cb635ca6b1b2b7b67b3597bd19f34f1753b129eb6d2ae04cf98cd3945", + "sha256:364587827d7cbd41afa0782adc2d2d19e3f07d355b0750a02a8e33ad27a9c368", + "sha256:3665b92e788578c3bb334bd5b5fa7ee1a84bafd68be438e3110861d1578c63a0", + "sha256:36dd6e820379c37a1ffefc8a52b648758e867cd9d78ee5b5dc0c9a6a10145378", + "sha256:3ed5adb752f4308fcc8f4fb6f8eb7aa4082f9d12676fda0a74fa5564242a8107", + "sha256:47e92c155a14f44511ea8ebcc6bc1535a1fe8d0a7d67ad3cc47ba61606df7bcf", + "sha256:4ff196996240db7075f62c7bc4506f40a3c80cd4ae3ab0e79ac6892283a90859", + "sha256:521c58c72ed8a612b25cda378ff10dee17e6deb4ee99a070b723519a345527b9", + "sha256:5551d68264c1bb6943f542da83a4dc8940ede52c5847ef158698799cc28d14f5", + "sha256:578302828dd97ee2ba507d2f71d62164e28d2fc7bc73aad0d2d1d2afc021a5d5", + "sha256:579d107102c0725f7c79b4e79f16d3cf4d7c9208f29c66b064fa1fd4641d5155", + "sha256:591908240f4085e2ade5b685c6e8346e2ed44932cffeaac2fb32ddac95b55c7f", + "sha256:5a93c9e60904cb76e7aefef67afffb8b37c4894f81415ed513db090f29d01101", + "sha256:5d1eff95362f993b0276fd3839aee48625b09aac8938bb0c23b40d219cba5dc5", + "sha256:5d5262383634626eb45c536017204b8163a03bc43bda880cf1bdd7885db9a163", + "sha256:5f8bf3f0d02935751d8660abda6044821a861f6229f7d359f98bcdcc7e66c39b", + "sha256:603f48f621272a448ff58bb556feb4371252a02156593303391f5c3281dfaeac", + "sha256:675b75412a943bb83f1f53e2e54fd18c80ef15ed642dc6eb0382d1949419d904", + "sha256:68bd888eafd07b09585dcc8bc2716c5ecdb7eed62827470664d25588982b2873", + "sha256:696a79018ef989bf1c9abd9005841cee18005ccad4748bad8a4c274c47b6241a", + "sha256:6c5b32875646cb7f60c193ade99b2e4b124f19583492115293cd00f6fb198b17", + "sha256:6f83221db5755b8f34222e40607d87f1176a8d5d4dbda4a55a0f0b67d588a69c", + "sha256:6fb76e5a21034f0307c51c5a2fc08856f698c53a4c593b17d291f7d6e9d09ca3", + "sha256:7abe2dbae81120a64bb4f8d3fcafe9122f328c9f86d7f327f174187a5af4ed86", + "sha256:7b702de95666a1f7d5c6b47eacadfe2d2794af3742d63d2134767d13e5d1c713", + "sha256:7c20c1474b068c4bd45bf2fd0ad548df284f74e9a14a68b06746c56e3aa8eb70", + "sha256:836f4d88b8bd0fff2ebe815dcaab8aa6c8d07d1d566a7e21dd137cf6fe11ed5b", + "sha256:8501000a5eb8037c4b56857724797fe5a8b01853c363de91c8d0d0ad56bef319", + "sha256:8772b745668260c5c4d069c678bbaa68812e6c69830f3771eaad521af7bc17f8", + "sha256:8b01153c7466d0bad48fba77a303d5a768e66f24b763853469f47220b3de4661", + "sha256:8d92c552c6b7577402afdd547dcf5d31ea6c8ae31ad03f78226e055cfa37f3c6", + "sha256:9030e7238c0df51aed5c9c5ed8eee2bdd47a2ae788e562c1454af2851c3d1906", + "sha256:90db86fa196eecf96cb6db09f1083912ea945c50c57188039392d810d0b784e1", + "sha256:948dcee7aaa1cd14358b2a7ef08bf0be42bf89049c3a906669874a715fc2c937", + "sha256:94baaeea0b4f8632a6da69348b1e741043eba18d4e3088d674d3f76586b6223d", + "sha256:953b3780765c8846866faf891ee4290f6a41a6dacf4fbcd3926f78c9de412ca6", + "sha256:95b8292383e717e10455f2c917df45032b611141e43d1adf70f71b1566136b11", + "sha256:965693c2e9efd425b0f059f5be50ef830129f82892fa1858e220e424d9d0160f", + "sha256:97f2ce529d2a70a60c290f6ab269a2bbf1d3b47b9724dccc84339b85f7afb044", + "sha256:9b6a5de507b9be6de688dae40143b656f7a93b10995fb8bd90deb555e7875c60", + "sha256:9dba13d86806fcf3fe9c9919f58575e0090eadfb89c058bde02bcc7ab24e4548", + "sha256:9dc86aa6b29d174713c5f4caac35ffb7f232e3e649113e8d13812b35ab078228", + "sha256:9dcd14cf4876f04b488f6e54a7abd3e9b31db5f5a6aba0ce90659917aaa8c088", + "sha256:a3b36e1c61b796ae1777f3e9e11fd39898b09d351c9384baf6e3b7e6191d8ced", + "sha256:a3c0783910911f4f24655826d007c9f4360f08107410952c01ee3df98c713eb2", + "sha256:a40184c67db8252593ec518e17fb8a6e86d7259dc9f2d6c0bf4ff4db8cf1ad4b", + "sha256:a4da514d13f4433e16960a17f05b67e0af30ac771719c9a9fb877e5004f74477", + "sha256:a8feac9006d5c9758438906f093befffc4290de75663dbb2098461df7c7d28dd", + "sha256:a93cd834b3c315ab437f0565ee3a2f42dd33768dc885ccbabf9710b131cf70d2", + "sha256:ae1a38bade755aa9dd95a81cda949e1bf9cd92b79341ccc5e2189c9e7bdfc5ec", + "sha256:b23806fbdd6b510ba9ac93bb72d503066263b0fba44b71b835be9f063a84025f", + "sha256:b4f86e09d3064dca0b014cd48688964036a904a2d28048f00c8f4640796d06a8", + "sha256:b997ff3b39d4cee9fb025d6c46b0a24bd67595ce5a5b652a97fb3a9d60beb651", + "sha256:be3a1fc3e2ab3bdf93dc0c83c00acca8afd2a80602297d96cf4a0ba028333cdf", + "sha256:c12d180b17a22d107c8747de9c68d0b9c1d15dcda5445ff9bf9f4ccfb67c3e16", + "sha256:c1318d42610c26dcd68bd3279a1bf9e3605377260867c9a8ed22eafc1bd93a7c", + "sha256:c33211cfff9aec425bb1bfedaf94afcf337063aa273754f22779d6dadebef4c2", + "sha256:c4eebf6c93af0ae866c22b403a84747580bb5c10f0d7b51c82a87f25405d4dcb", + "sha256:c4f28f1930b09a2c300357d8465b388cecb7e8b2f454a5d5425561710b7fd07f", + "sha256:ca66676c8ef6557f9b81c5b2b519097817a7c776a6599b8d6fcc3e16edd216fe", + "sha256:ccf68e30b80e903f2309f90a438dbd640dd98e878eeb5ad361a288051ee5b75c", + "sha256:cd9360e30041690912525a210e48a897b49b230768cc8af1c702e5395690464f", + "sha256:cfa74aac64c85898b93d9c80bb935a96bf64985e28d4ee0f1a3d1f3bf11a5106", + "sha256:d098ce6162eb5e48fceb0745455bc950af059df6113eec83e916c129fca11408", + "sha256:d1230e0f9026851a6a432beaa0ce575dda7b39fe689b576f99a0704fbb81fc9c", + "sha256:d4ba2318ef670ce505f42881a5d2af70f948124646947341a3c6ccb33cd70369", + "sha256:d4e049d5ad61448c9a020d1061eba20944c4887d720c4069724beb6ea1692507", + "sha256:d73ee2df41224c87336448d279b5b6a3a75f36e41dd3dcf538c0c9cce36360d8", + "sha256:d7df9c2194c7ec930b33c991c55dbd0c10951bd25800c0b7a7b571994ebbced5", + "sha256:d95751f505a301af1aaf086c19f34536056d6c8efa91b2240de532a3db57b543", + "sha256:dd5fa6e3c6e0333051c1f3a49f0807b3366f4131c8d6ac8c3e05fd0d0ce3755c", + "sha256:df596ddd3db38aa513d4c0995611267b3946e7cbe5a8761b50e9306dfec720ee", + "sha256:e2957fdad10bb83b1982b02deb3604a3f6911a5e545f518b59c741086f92d152", + "sha256:e3dcfbe7266e74a707173a12a7b355a531f2dcfbdb32f09468e664330da14874", + "sha256:e6d9db2fa4e9be171e9bb31cf2d2575574774966b43f5b951062bb2e67885852", + "sha256:e9012d86c6397edbc9da4ac0132de7f8ee9d6ce857f4194d5684c4ddbcdd1c5c", + "sha256:e9fbf659537d246086d0297628b3795dc3e4a384101ecc01e5791c827b8d7345", + "sha256:ecc24af7f905f3d6efb371a01680116ffea8d64e266618fb9ad1602a9b4f7934", + "sha256:ece45eb2af8b00f90d10f7419322e8804bd42fb1129026f9bfe712c37508b514", + "sha256:f1c7296534c1afb6f495aa95871f14ccdc197c6db42965854e483100df313030", + "sha256:f847fb0fbfb72482b1c05c59cbb275c58a55b73708a7f77a83f8035ee3c86497", + "sha256:fbda3dd68d8b28ccb20ffb6f756fefd9b5ba570a772bedd7643ed441f5793308", + "sha256:fc3e6081069eea61593f1d6839029da53d00c8c9b205c5534853eaa3f031085c", + "sha256:fcf79b686962d7bec458a0babc904cb4fa319808805e036b9d5a531ee6b9b835", + "sha256:fde81b1da9a947f931711febe2e2bee694e891f6d3e6aa6bc02c1884702aea19" + ], + "markers": "python_version >= '3.8'", + "version": "==3.9.7" + }, "referencing": { "hashes": [ "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c", @@ -1296,6 +1406,15 @@ "markers": "python_version >= '3.8'", "version": "==2.6" }, + "thefuzz": { + "hashes": [ + "sha256:59729b33556850b90e1093c4cf9e618af6f2e4c985df193fdf3c5b5cf02ca481", + "sha256:7138039a7ecf540da323792d8592ef9902b1d79eb78c147d4f20664de79f3680" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.22.1" + }, "tortoise-orm": { "extras": [ "asyncpg" @@ -1534,28 +1653,28 @@ "develop": { "ruff": { "hashes": [ - "sha256:0308610470fcc82969082fc83c76c0d362f562e2f0cdab0586516f03a4e06ec6", - "sha256:0b52387d3289ccd227b62102c24714ed75fbba0b16ecc69a923a37e3b5e0aaaa", - "sha256:0ea086601b22dc5e7693a78f3fcfc460cceabfdf3bdc36dc898792aba48fbad6", - "sha256:34d5efad480193c046c86608dbba2bccdc1c5fd11950fb271f8086e0c763a5d1", - "sha256:50e30b437cebef547bd5c3edf9ce81343e5dd7c737cb36ccb4fe83573f3d392e", - "sha256:549daccee5227282289390b0222d0fbee0275d1db6d514550d65420053021a58", - "sha256:66dbfea86b663baab8fcae56c59f190caba9398df1488164e2df53e216248baa", - "sha256:7862f42fc1a4aca1ea3ffe8a11f67819d183a5693b228f0bb3a531f5e40336fc", - "sha256:803b96dea21795a6c9d5bfa9e96127cc9c31a1987802ca68f35e5c95aed3fc0d", - "sha256:932063a03bac394866683e15710c25b8690ccdca1cf192b9a98260332ca93408", - "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212", - "sha256:ac4b75e898ed189b3708c9ab3fc70b79a433219e1e87193b4f2b77251d058d14", - "sha256:bedff9e4f004dad5f7f76a9d39c4ca98af526c9b1695068198b3bda8c085ef60", - "sha256:c44536df7b93a587de690e124b89bd47306fddd59398a0fb12afd6133c7b3818", - "sha256:c4b153fc152af51855458e79e835fb6b933032921756cec9af7d0ba2aa01a258", - "sha256:d02a4127a86de23002e694d7ff19f905c51e338c72d8e09b56bfb60e1681724f", - "sha256:eebe4ff1967c838a1a9618a5a59a3b0a00406f8d7eefee97c70411fefc353617", - "sha256:f0f8968feea5ce3777c0d8365653d5e91c40c31a81d95824ba61d871a11b8523" + "sha256:005256d977021790cc52aa23d78f06bb5090dc0bfbd42de46d49c201533982ae", + "sha256:09c72a833fd3551135ceddcba5ebdb68ff89225d30758027280968c9acdc7810", + "sha256:381413ec47f71ce1d1c614f7779d88886f406f1fd53d289c77e4e533dc6ea200", + "sha256:3a8d42d11fff8d3143ff4da41742a98f8f233bf8890e9fe23077826818f8d680", + "sha256:3e42a57b58e3612051a636bc1ac4e6b838679530235520e8f095f7c44f706ff9", + "sha256:482c1e6bfeb615eafc5899127b805d28e387bd87db38b2c0c41d271f5e58d8cc", + "sha256:4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb", + "sha256:51935067740773afdf97493ba9b8231279e9beef0f2a8079188c4776c25688e0", + "sha256:52e75a82bbc9b42e63c08d22ad0ac525117e72aee9729a069d7c4f235fc4d276", + "sha256:7291e64d7129f24d1b0c947ec3ec4c0076e958d1475c61202497c6aced35dd19", + "sha256:794ada3400a0d0b89e3015f1a7e01f4c97320ac665b7bc3ade24b50b54cb2972", + "sha256:7e4e308f16e07c95fc7753fc1aaac690a323b2bb9f4ec5e844a97bb7fbebd748", + "sha256:800c50371bdcb99b3c1551d5691e14d16d6f07063a518770254227f7f6e8c178", + "sha256:8e25ddd9cd63ba1f3bd51c1f09903904a6adf8429df34f17d728a8fa11174253", + "sha256:932cd69eefe4daf8c7d92bd6689f7e8182571cb934ea720af218929da7bd7d69", + "sha256:9ad7dfbd138d09d9a7e6931e6a7e797651ce29becd688be8a0d4d5f8177b4b0c", + "sha256:a50af6e828ee692fb10ff2dfe53f05caecf077f4210fae9677e06a808275754f", + "sha256:cf4d3fa53644137f6a4a27a2b397381d16454a1566ae5335855c187fbf67e4f5" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.6.4" + "version": "==0.6.5" } } } diff --git a/app/main.py b/app/main.py index ef55f94..3e37dc8 100644 --- a/app/main.py +++ b/app/main.py @@ -57,6 +57,7 @@ bot = TortoiseIntegratedBot( store_path=str(store.resolve()), command_prefix=config["bot"].get("prefix", "h!"), owner_id=config["bot"].get("owner_id") or "@nex:nexy7574.co.uk", + auto_read_messages=False ) bot.cfg = config diff --git a/app/modules/evaluation.py b/app/modules/evaluation.py index a4c5dc5..bf13b08 100644 --- a/app/modules/evaluation.py +++ b/app/modules/evaluation.py @@ -219,3 +219,22 @@ class EvalModule(niobot.Module): await ctx.respond(f"Result of runas: `{result!r}`") except Exception as e: await ctx.respond(f"Error in runas process: `{e!r}`") + + @niobot.command() + @niobot.is_owner() + async def rooms(self, ctx: niobot.Context, operation: str, room: str = None): + """room management""" + match operation.casefold(): + case "join": + result = await self.bot.join(room) + return await ctx.respond(repr(result)) + case "leave": + if room.startswith("#"): + resolved = await self.bot.room_resolve_alias(room) + if not isinstance(resolved, niobot.RoomResolveAliasResponse): + return await ctx.respond("Failed to resolve room ID for: %r", room) + room = resolved.room_id + response = await self.bot.room_leave(room) + return await ctx.respond(repr(response)) + case _: + return await ctx.respond("Unknown operation.") diff --git a/app/modules/info.py b/app/modules/info.py new file mode 100644 index 0000000..ce09f65 --- /dev/null +++ b/app/modules/info.py @@ -0,0 +1,80 @@ +import logging +import niobot +from thefuzz import fuzz + + +class InfoModule(niobot.Module): + log = logging.getLogger(__name__) + + @niobot.command(name="room-info", aliases=["ri"]) + async def room_info(self, ctx: niobot.Context, room: str = None): + """ + Dumps information about a room in a human readable format + + can be a room ID or alias. + """ + room = room or ctx.room.room_id + if room.startswith("#"): + x = await ctx.respond("Resolving room...") + resolved = await ctx.bot.room_resolve_alias(room) + if not isinstance(resolved, niobot.RoomResolveAliasResponse): + resolved: niobot.RoomResolveAliasError + return await x.edit( + "Sorry, I was unable to resolve that room alias.\n\n{!r}".format( + str(resolved).replace( + self.bot.access_token, + "[REDACTED]" + ) + ) + ) + room = resolved.room_id + await x.delete("Room resolved to " + room) + elif room.startswith("!"): + pass + else: + # Search for the room + matches: list[tuple[niobot.MatrixRoom, float]] = [] + for room_id, room_obj in ctx.bot.rooms.items(): + if ctx.event.sender not in room_obj.users: + self.log.debug("%r is not in %r", ctx.event.sender, room_id) + continue + ratio = fuzz.ratio(room, room_obj.display_name) + self.log.debug("Ratio for %r: %r", room_obj.display_name, ratio) + if ratio > 1: + matches.append((room_obj, ratio)) + matches.sort( + key=lambda v: v[1], + reverse=True + ) + if not matches: + return await ctx.respond( + "[room] was not a room ID or alias, and I do not know of any mutual rooms that have" + " a similar name." + ) + room = matches[0][0].room_id + + if room not in ctx.bot.rooms: + return await ctx.respond( + "Unknown room %r. Am I in it?" % room + ) + + room_obj: niobot.MatrixRoom = ctx.bot.rooms[room] + lines = [ + "* Name: {obj.display_name!r} (is explicitly named: {obj.is_named!s})", + "* ID: `{obj.room_id}`", + "* Version: {obj.room_version!s}", + "* Federated? {obj.federate!s}", + "* Encrypted? {obj.encrypted!s}", + "* Guest access: {obj.guest_access!r}", + "* Join rule: {obj.join_rule!r}", + "* History visibility: {obj.history_visibility!r}", + "* User count: {user_count:,} ({invited_count:,} invited)", + "* Avatar URL: `{obj.room_avatar_url!s}`", + "* Canonical alias: {obj.canonical_alias}" + ] + body = "\n".join(lines).format( + obj=room_obj, + user_count=room_obj.member_count, + invited_count=room_obj.invited_count + ) + return await ctx.respond(body) diff --git a/app/modules/latency.py b/app/modules/latency.py index b957189..a1ace6f 100644 --- a/app/modules/latency.py +++ b/app/modules/latency.py @@ -16,14 +16,24 @@ class LatencyModule(niobot.Module): async def latency(self, ctx: niobot.Context, homeserver: str = None): """ See the bot's latency. - + If you supply a homeserver, it will also show the federation latency to that homeserver. """ latency = ctx.latency - homeserver = homeserver or ctx.message.sender.split(":")[1] - if not homeserver.startswith("http"): - homeserver = f"https://{homeserver}" + response = await ctx.respond( + "Latency: {:,.2f}ms{}".format( + latency, + " (pinging homeserver...)" + if homeserver + else '' + ) + ) + if homeserver: + if not homeserver.startswith("http"): + homeserver = f"https://{homeserver}" + else: + return parsed = urllib.parse.urlparse(homeserver) loc = "https://" + parsed.netloc @@ -49,6 +59,12 @@ class LatencyModule(niobot.Module): else: end = time.perf_counter() timings.append(end - start) + if sum(timings) == -5: + return await response.edit( + "Latency: {:,.2f}ms (failed to connect to homeserver)".format( + latency + ) + ) fed_latency = sum(timings) / len(timings) * 1000 hs_target = homeserver[8:]