Advertisement
Uno-Dan

A New Hooker

Dec 1st, 2019
260
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.32 KB | None | 0 0
  1. ########################################################################################################################
  2. #    File: hooks.py
  3. #  Author: Dan Huckson, https://github.com/unodan
  4. #    Date: 2019-12-01
  5. ########################################################################################################################
  6.  
  7.  
  8. class _HookManager:
  9.     def __init__(self):
  10.         self._hooks = {}
  11.         self._events = {}
  12.  
  13.     def add_hook(self, target, hook, callback):
  14.         if target not in self._hooks:
  15.             self._hooks[target] = {}
  16.  
  17.         if hook not in self._hooks[target]:
  18.             self._hooks[target][hook] = {}
  19.  
  20.         if callback not in self._hooks[target][hook].values():
  21.             key = target + '/' + hook + '/' + str(callback).strip('>').split(' ')[-1]
  22.             self._hooks[target][hook][key] = callback
  23.             return True
  24.         return False
  25.  
  26.     def get_hook(self, target, hook):
  27.         if hook in self._hooks[target]:
  28.             return self._hooks[target][hook]
  29.         return {}
  30.  
  31.     def get_hooks(self, target=None):
  32.         if not target:
  33.             return self._hooks
  34.         elif target in self._hooks:
  35.             return self._hooks[target]
  36.         return {}
  37.  
  38.     def remove_hook(self, target, hook, callback):
  39.         key = None
  40.         for _key, _callback in self._hooks[target][hook].items():
  41.             if callback == _callback:
  42.                 key = _key
  43.                 break
  44.  
  45.         if key:
  46.             del self._hooks[target][hook][key]
  47.             if not self._hooks[target][hook]:
  48.                 del self._hooks[target][hook]
  49.             return True
  50.         return False
  51.  
  52.     def add_event(self, target, event, callback):
  53.         if target not in self._events:
  54.             self._events[target] = {}
  55.  
  56.         if event not in self._events[target]:
  57.             self._events[target][event] = {}
  58.  
  59.         if callback not in self._events[target][event].values():
  60.             key = target + '/' + event + '/' + str(callback).strip('>').split(' ')[-1]
  61.             self._events[target][event][key] = callback
  62.             return True
  63.  
  64.         return False
  65.  
  66.     def get_events(self, target=None):
  67.         if not target:
  68.             return self._events
  69.         elif target in self._events:
  70.             return self._events[target]
  71.         return {}
  72.  
  73.     def remove_event(self, target, event, callback):
  74.         key = None
  75.         for _key, _callback in self._events[target][event].items():
  76.             if callback == _callback:
  77.                 key = _key
  78.                 break
  79.  
  80.         if key:
  81.             del self._events[target][event][key]
  82.             if not self._events[target][event]:
  83.                 del self._events[target][event]
  84.             return True
  85.         return False
  86.  
  87.     def event_generate(self, target, event):
  88.         hooks = self.get_hooks(target)
  89.         events = self.get_events(target)
  90.  
  91.         if event in events and event in hooks:
  92.             for callback in hooks[event].values():
  93.                 callback(self)
  94.  
  95.  
  96. class HookManager:
  97.     instance = None
  98.  
  99.     def __new__(cls, **kwargs):
  100.         if not cls.instance:
  101.             cls.instance = super(HookManager, cls).__new__(cls)
  102.             cls.instance.hook_manager = _HookManager()
  103.  
  104.         return cls.instance.hook_manager
  105.  
  106.  
  107. hook_manager = HookManager()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement