#!/usr/bin/env python3
# This file is placed in the Public Domain.
#
# pylint: disable=C,R,W0201,W0212,W0105,W0613,W0406,E0102,W0611,W0718,W0125


"runtime"


import getpass
import os
import pwd
import sys
import termios
import time


sys.path.insert(0, os.getcwd())


from obj import Default, Object
from prg import Client, Error, Event, Storage
from prg import cmnd, debug, forever, parse_command, scan, spl
from bot import modules


from prg.storage import cdir


Cfg         = Default()
Cfg.mod     = "cmd,err,irc,log,mod,mre,pwd,rss,thr"
Cfg.name    = "bot"
Cfg.version = "70"
Cfg.wd      = os.path.expanduser(f"~/.{Cfg.name}")
Cfg.pidfile = os.path.join(Cfg.wd, f"{Cfg.name}.pid")
Cfg.user    = getpass.getuser()


Storage.wd  = Cfg.wd
moddir      = os.path.join(Storage.wd, "mods")


if os.path.exists(moddir):
    sys.path.insert(0, os.path.dirname(moddir))
    import mods
else:
    mods = None


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)
    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)


def main():
    Storage.skel()
    daemon(Cfg.pidfile)
    privileges(Cfg.user)
    scan(modules, Cfg.mod, True, True)
    if mods:
        scan(mods, Cfg.mod, True, True)
    forever()


main()
