Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # coding: utf-8
- # Offset collection
- # V2.0
- # By Full Metal
- # Feel free to use and redistribute
- from time import time
- from os import listdir,path
- import threading
- import bottle
- import json
- from bottle import route, run, template, static_file, redirect, request
- class DirectoryLoader:
- refresh_rate=1.0
- def __init__(self,directory,hook=None):
- self.hook=hook
- self.items,self.dir,self.update_timer=[],directory,None
- self.update()
- def __enter__(self):return self
- def update(self):
- #print("Directory loader update")
- items=[a for a in listdir(self.dir)]
- if self.hook:
- objs=[a for a in items if a not in self.items]
- if len(objs)>0:threading.Thread(target=self.hook,args=objs).start()
- self.items=items[:]
- self.update_timer=threading.Timer(self.refresh_rate,self.update)
- self.update_timer.start()
- def list(self):return self.items
- def __exit__(self, type, value, traceback):
- if self.update_timer:self.update_timer.cancel()
- class Database:
- refresh_rate=1.0 #Update loaded data twice per minute ( on request )
- def __init__(self,dir_watch):
- self.dir=dir_watch
- self.objects={}
- self.directory=DirectoryLoader(self.dir,self.add_files)
- self.update()
- def __enter__(self):return self
- def update_file(self,fn):
- obj=self.objects[fn]
- fn=path.join(self.dir,fn)
- last_modified=path.getmtime(fn)
- if obj['mod']<last_modified or obj['obj'] is None:
- print(fn)
- obj['mod']=last_modified#If it fails, then don't try it again until it updates.
- try:
- obj['obj']=json.load(open(fn))
- print(obj['obj'])
- except:pass
- def add_files(self,*files):
- for fn in files:
- self.objects[fn]={'obj':None,'mod':-1}
- self.update_file(fn)
- def update(self):
- print("DBUPDATE")
- for fn in list(self.objects.keys()):self.update_file(fn)
- self.update_timer=threading.Timer(self.refresh_rate,self.update)
- self.update_timer.start()
- def __exit__(self, type, value, traceback):
- if self.update_timer:self.update_timer.cancel()
- def parse_number(v):
- if isinstance(v,str):
- base_prefix={'0x':16,'&h':16,'&b':2,'&o':8,'&d':10}
- if v[:2] in base_prefix.keys():return int(v[2:],base_prefix[v[:2]])
- return int(v)
- else:return v
- def tag_list(t):
- if isinstance(t,str):return t.lower().split(' ')
- else: return t or []
- def Rom(name,desc,shortname,tags):
- assert isinstance(name,str), isinstance(desc,str)
- return {'name':name,'desc':desc,'short':shortname,'tags':tag_list(tags),'offsets':[]}
- def Offset(n,o,l,t,tags):
- assert isinstance(n,str), isinstance(desc,str)
- return {'name':n,'offset':parse_number(o),'size':parse_number(l),'tags':tag_list(tags),'type':t}
- if __name__=="__main__":
- with Database('data') as db:pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement