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


"Prosecutor. Court. Reconsider OTP-CR-117/19."

name = "genocide"


import os
import readline
import sys
import termios
import time
import traceback


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


from genocide.object import Config
from genocide.version import __version__


Config.name = name
Config.threaded = False
Config.version = __version__
Config.workdir = os.path.expanduser("~/.%s" % Config.name)


from genocide.irc import Config as IConfig


IConfig.realname = "Prosecutor. Court. Reconsider OTP-CR-117/19."


from genocide.object import Class, Db, Object
from genocide.object import cdir, find, fntime, format, get, items, save, spl, update
from genocide.handler import Callbacks, CLI, Commands, Console, Event, Handler, Table
from genocide.handler import boot, getname, init, starttime


import genocide.basic 
import genocide.irc
import genocide.model
import genocide.rss


Table.add(genocide.basic)
Table.add(genocide.irc)
Table.add(genocide.model)
Table.add(genocide.rss)


class CLI(CLI):

    def raw(self, txt):
        print(txt)


class Console(Console):

    def announce(self, txt):
        pass

    def raw(self, txt):
        print(txt)


def from_exception(ex, catch=None):
    result = []
    for fr in traceback.extract_tb(ex.__traceback__):
        fnc = str(fr).split()[-1][:-1]
        nme = os.sep.join(fr.filename.split(os.sep)[-2:])
        if catch and catch not in nme:
            continue
        result.append("%s %s.%s" % (nme, fnc, fr.lineno))
    return "\n%s -> %s %s" % (" -> ".join(result), getname(ex), ex)


def wait():
    while 1:
        time.sleep(1.0)
        for err in Callbacks.errors:
            print(from_exception(err, Config.name))
            Callbacks.errors.remove(err)


def wrap(func):
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        func()
    except (EOFError, KeyboardInterrupt):
        print("")
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
            

def main():
    boot(" ".join(sys.argv[1:]))
    cdir(Config.workdir)
    if len(sys.argv) > 1:
        init("basic,irc,model,rss", Config.name, "reg")
        c = CLI()
        return c.cmd(" ".join(sys.argv[1:]))
    print("%s shell started at %s" % (Config.name.upper(), time.ctime(starttime).replace("  ", " ")))
    init("basic,irc,model,rss", "genocide", "reg")
    init("irc,model,rss", "genocide")
    print(format(Config, skip="password,type"))
    c = Console()
    c.start()
    wait()


wrap(main)
