import logging import re import aiohttp from redbot.core import Config, commands from redbot.core.bot import Red log = logging.getLogger("red.fox_v3.isitdown") class IsItDown(commands.Cog): """ Cog for checking whether a website is down or not. Uses the `isitdown.site` API """ def __init__(self, bot: Red): super().__init__() self.bot = bot self.config = Config.get_conf(self, identifier=0, force_registration=True) default_guild = {"iids": []} # List of tuple pairs (channel_id, website) self.config.register_guild(**default_guild) async def red_delete_data_for_user(self, **kwargs): """Nothing to delete""" return @commands.command(alias=["iid"]) async def isitdown(self, ctx: commands.Context, url_to_check): """ Check if the provided url is down Alias: iid """ try: resp, url = await self._check_if_down(url_to_check) except AssertionError: await ctx.maybe_send_embed("Invalid URL provided. Make sure not to include `http://`") return # log.debug(resp) if resp["isitdown"]: await ctx.maybe_send_embed(f"{url} is DOWN!") else: await ctx.maybe_send_embed(f"{url} is UP!") async def _check_if_down(self, url_to_check): re_compiled = re.compile(r"https?://(www\.)?") url = re_compiled.sub("", url_to_check).strip().strip("/") url = f"https://isitdown.site/api/v3/{url}" # log.debug(url) async with aiohttp.ClientSession() as session: async with session.get(url) as response: assert response.status == 200 resp = await response.json() return resp, url