# -*- coding: utf-8 -*-
# Simulate the kernel plugin loader: exec each plugin with a namespace of
# stubbed bot globals; catch anything that raises at load time.
import ast, glob, os, sys, re, time, json, types
import builtins

os.chdir('/home/opencode/workspace/isida-ng-v1.01')

# Common kernel/plugin globals referenced at module level; provide usable stubs.
def GT(key): return {'timeout':60,'flood':True}.get(key, None)
class _CFG:
    def __getitem__(self,k): return None
config_prefs = _CFG()
def get_config(*a): return True
def put_config(*a): return None
data_folder = 'data/%s'
tmp_folder = 'tmp/%s'
base_type = 'sqlite3'
Settings = {'jid':'bot@host/Bot','nickname':'Bot','status':'online'}
megabase, comms, plugins, gtimer, capses = [], [], [], [], {}
iq_request, pres_answer = {}, []
def pprint(*a, **k): print(*[str(x)[:60] for x in a])
def L(t,*a): return t
def send_msg(*a): return None
def get_Room(j): return 'room@conf'
def getRoom(j): 
    j=str(j)
    return ('None' if j=='None' else (j.split('/')[0] if '@' in j or '/' in j else j))
def get_level(*a): return (4,'user@host/Res')
def getResourse(j): return str(j).split('/')[-1] if '/' in str(j) else ''
def is_owner(*a): return False
def getServer(j): return 'server'
def un_unix(*a): return ''
def disp_time(*a): return ''
def reduce_spaces_all(s): return re.sub(r'\s+', ' ', str(s)).strip() if s else ''
def get_nick_by_jid_res(*a): return ''
def join(*a): return ''
def get_id(): return 'req_1'
def sender(*a): return None
def thr(*a): return None
def get_who_iq(*a): return 'w@h/R'
def send_presence_all(*a): return None
def get_xnick(*a): return ''

common = {
 'time':time,'re':re,'os':os,'sys':sys,'json':json,'hashlib':__import__('hashlib'),
 'base64':__import__('base64'),'datetime':__import__('datetime'),'random':__import__('random'),
 'xml':(__import__('xml')),'urllib':__import__('urllib'),
 'GT':GT,'config_prefs':config_prefs,'get_config':get_config,'put_config':put_config,
 'data_folder':data_folder,'tmp_folder':tmp_folder,'base_type':base_type,'Settings':Settings,
 'megabase':megabase,'comms':comms,'plugins':plugins,'gtimer':gtimer,'capses':capses,
 'iq_request':iq_request,'pres_answer':pres_answer,'pprint':pprint,'L':L,'send_msg':send_msg,
 'getRoom':getRoom,'get_level':get_level,'getResourse':getResourse,'is_owner':is_owner,
 'getServer':getServer,'un_unix':un_unix,'disp_time':disp_time,'reduce_spaces_all':reduce_spaces_all,
 'get_nick_by_jid_res':get_nick_by_jid_res,'join':join,'get_id':get_id,'sender':sender,
 'thr':thr,'get_who_iq':get_who_iq,'send_presence_all':send_presence_all,'get_xnick':get_xnick,
 'sqlite_base':os.path.abspath('sqlite3.db'),'xmpp':None,
}

# lazy xmpp
sys.path.insert(0,'./lib')
import xmpp as _x
common['xmpp'] = _x

def load(f):
    src = open(f, encoding='utf-8', errors='replace').read()
    ns = dict(common)
    ns['__name__'] = 'plugin_%s' % os.path.basename(f)[:-3]
    exec(compile(src, f, 'exec'), ns)

files = sorted(glob.glob('plugins/*.py') + glob.glob('plugins/ext/*.py'))
for f in files:
    if '.bak' in f or f.endswith('.empty.py'): continue
    try:
        load(f)
        print('LOAD OK  ', f)
    except SystemExit:
        print('LOAD EXIT ', f)
    except Exception as e:
        print('LOAD FAIL ', f, '->', type(e).__name__, str(e)[:120])