(in-package #:chatikbot) (defvar *hooks* (make-hash-table) "Hooks storage") (defun run-hooks (event &rest arguments) (let ((hooks (gethash event *hooks*))) (labels ((try-handle (func) (apply func arguments))) (unless (some #'try-handle hooks) (log:info "unhandled" event arguments))))) (defun add-hook (event hook &optional append) (let ((existing (gethash event *hooks*)) (func (if (functionp hook) hook (symbol-function hook)))) (unless (member func existing) (setf (gethash event *hooks*) (if append (append existing (list func)) (cons func existing)))))) (defun remove-hook (event hook) (setf (gethash event *hooks*) (remove (if (functionp hook) hook (symbol-function hook)) (gethash event *hooks*)))) (defun string-to-event (key) (intern (string-upcase (substitute #\- #\_ key)) :keyword))