#!/usr/bin/env python3
# This file is placed in the Public Domain.
#
# pylint: disable=C,R,W0105,W0201,W0212,W0613,E0402,E0611
# ruff: noqa: E402


"24/7 feed fetcher"


import getpass
import os
import pwd
import sys
import time


from rssbot.default import Default
from rssbot.persist import Workdir
from rssbot.runtime import forever, init


from rssbot import modules as mods


"defines"


Cfg         = Default()
Cfg.mod     = "irc,rss"
Cfg.name    = "rssbot"
Cfg.version = "540"
Cfg.wd      = os.path.expanduser(f"~/.{Cfg.name}")
Cfg.pidfile = os.path.join(Cfg.wd, f"{Cfg.name}.pid")
Workdir.wd = Cfg.wd


dte = time.ctime(time.time()).replace("  ", " ")


"utilities"


def daemon(pidfile, verbose=False):
    pid = os.fork()
    if pid != 0:
        os._exit(0)
    os.setsid()
    pid2 = os.fork()
    if pid2 != 0:
        os._exit(0)
    if not verbose:
        with open('/dev/null', 'r', encoding="utf-8") as sis:
            os.dup2(sis.fileno(), sys.stdin.fileno())
        with open('/dev/null', 'a+', encoding="utf-8") as sos:
            os.dup2(sos.fileno(), sys.stdout.fileno())
        with open('/dev/null', 'a+', encoding="utf-8") as ses:
            os.dup2(ses.fileno(), sys.stderr.fileno())
    os.umask(0)
    os.chdir("/")
    if os.path.exists(pidfile):
        os.unlink(pidfile)
    Workdir.cdir(os.path.dirname(pidfile))
    with open(pidfile, "w", encoding="utf-8") as fds:
        fds.write(str(os.getpid()))


def privileges(username):
    pwnam = pwd.getpwnam(username)
    os.setgid(pwnam.pw_gid)
    os.setuid(pwnam.pw_uid)


"runtime"


def main():
    Workdir.skel()
    Cfg.user = getpass.getuser()
    daemon(Cfg.pidfile, True)
    privileges(Cfg.user)
    init(mods, Cfg.mod)
    forever()


if __name__ == "__main__":
    main()
