from .lists import BaseListFile, ListFileEntry, parse_listfile from dataclasses import dataclass from typing import cast, Optional from collections.abc import Sequence import requests import re FRIEND_REGEX = re.compile(r"""^ (?:(?P[a-z]+)://)? # match the URL scheme, e.x. `https://` (?P(?:[a-z0-9\-]+\.)*(?:[a-z])+) # match the actual domain (?: | # match no path (?P(?:/[^/\s#?]+)*/?) # match a path ) $""", re.X) @dataclass(frozen=True) class FriendListFileEntry(ListFileEntry): url: str domain: str scheme: str path: str def __init__(self, entry: str, comment: Optional[str]): super().__init__(entry, comment) m = FRIEND_REGEX.match(entry) if m is None: return self.__setattr__('scheme', m.group('scheme') or None) self.__setattr__('domain', m.group('domain')) self.__setattr__('path', m.group('path').removesuffix('/')) self.__setattr__('url', (self.scheme if self.scheme else 'https') + '://' + self.domain + (self.path if self.path else '/BBSS') + '/') def exists(self) -> bool: return requests.head(self.url).ok def get(self) -> requests.Response: return requests.get(self.url) class FriendListFile(BaseListFile[FriendListFileEntry]): def __init__(self, contents: str): super().__init__(contents) self._entries = parse_listfile(contents, FriendListFileEntry) __all__ = ["FriendListFileEntry", "FriendListFile"]