RcGcDb/src/domain_manager.py

57 lines
1.9 KiB
Python
Raw Normal View History

2021-05-30 11:23:48 +00:00
from __future__ import annotations
from typing import TYPE_CHECKING, Optional
from urllib.parse import urlparse, urlunparse
from src.config import settings
from src.domain import Domain
2021-05-30 13:31:51 +00:00
from src.irc_feed import AioIRCCat
2021-05-30 11:23:48 +00:00
if TYPE_CHECKING:
from src.wiki import Wiki
class DomainManager:
def __init__(self):
self.domains: dict[str, Domain] = {}
2021-07-09 12:55:23 +00:00
async def new_wiki(self, wiki: Wiki):
2021-05-30 11:23:48 +00:00
"""Finds a domain for the wiki and adds a wiki to the domain object.
:parameter wiki - Wiki object to be added"""
wiki_domain = self.get_domain(wiki.script_url)
try:
self.domains[wiki_domain].add_wiki(wiki)
except KeyError:
2021-07-09 12:55:23 +00:00
new_domain = await self.new_domain(wiki_domain)
new_domain.add_wiki(wiki)
def remove_wiki(self, script_url: str):
wiki_domain = self.get_domain(script_url)
try:
domain = self.domains[wiki_domain]
except KeyError:
raise NoDomain
else:
domain.remove_wiki(script_url)
2021-05-30 11:23:48 +00:00
@staticmethod
def get_domain(url: str) -> str:
"""Returns a domain for given URL (for example fandom.com, wikipedia.org)"""
parsed_url = urlparse(url)
return ".".join(urlunparse((*parsed_url[0:2], "", "", "", "")).split(".")[-2:])
2021-05-30 13:31:51 +00:00
async def new_domain(self, name: str) -> Domain:
domain_object = Domain(name)
for irc_server in settings["irc_servers"].keys():
if name in settings["irc_servers"][irc_server]["domains"]:
domain_object.set_irc(AioIRCCat(settings["irc_servers"][irc_server]["irc_channel_mapping"], domain_object))
break # Allow only one IRC for a domain
self.domains[name] = domain_object
2021-05-30 11:23:48 +00:00
return self.domains[name]
async def run_all_domains(self):
for domain in self.domains.values():
domain.run_domain()
2021-05-30 11:23:48 +00:00
domains = DomainManager()