#!/usr/bin/env python3
# This file is placed in the Public Domain.


"daemon"


import getpass
import os
import pwd
import sys
import time


from rssbot.command import add
from rssbot.default import Default
from rssbot.errors  import enable, errors
from rssbot.object  import cdir
from rssbot.runtime import init, scan
from rssbot.workdir import Workdir, skel


Cfg             = Default()
Cfg.mod         = "cmd,irc,rss"
Cfg.opts        = ""
Cfg.version     = "555"
Cfg.name        = "rssbot"
Cfg.user        = getpass.getuser()
Cfg.wdr         = os.path.expanduser(f"~/.{Cfg.name}")
Cfg.pidfile     = os.path.join(Cfg.wdr, f"{Cfg.name}.pid")


Workdir.workdir = Cfg.wdr


from rssbot import modules # pylint: disable=C0413


def daemon(ppidfile, verbose=False):
    "run in the background."
    # pylint: disable=W0212
    pid = os.fork()
    if pid != 0:
        os._exit(0)
    os.setsid()
    pid22 = os.fork()
    if pid22 != 0:
        os._exit(0)
    if not verbose:
        with open('/dev/null', 'r', encoding="utf-8") as siss:
            os.dup2(siss.fileno(), sys.stdin.fileno())
        with open('/dev/null', 'a+', encoding="utf-8") as soss:
            os.dup2(soss.fileno(), sys.stdout.fileno())
        with open('/dev/null', 'a+', encoding="utf-8") as sess:
            os.dup2(sess.fileno(), sys.stderr.fileno())
    os.umask(0)
    os.chdir("/")
    if os.path.exists(ppidfile):
        os.unlink(ppidfile)
    cdir(os.path.dirname(ppidfile))
    with open(ppidfile, "w", encoding="utf-8") as fdss:
        fdss.write(str(os.getpid()))


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


def ver(event):
    "show version."
    event.reply(f"{Cfg.name.upper()} {Cfg.version}")


def main():
    "main"
    add(ver)
    enable(print)
    skel()
    scan(modules, Cfg.mod)
    daemon(Cfg.pidfile, "-v" in sys.argv)
    privileges(Cfg.user)
    init(modules, Cfg.mod)
    while 1:
        time.sleep(1.0)


if __name__ == "__main__":
    main()
    errors()
