store timestamp and current git commit when loading a module
This commit is contained in:
parent
e65fecd1b2
commit
7a15e5b2bf
4 changed files with 35 additions and 19 deletions
|
@ -4,23 +4,11 @@ from src import IRCBot, ModuleManager, utils
|
||||||
class Module(ModuleManager.BaseModule):
|
class Module(ModuleManager.BaseModule):
|
||||||
@utils.hook("received.command.version")
|
@utils.hook("received.command.version")
|
||||||
def version(self, event):
|
def version(self, event):
|
||||||
commit_hash = None
|
commit_hash = utils.git_commit(self.bot.directory)
|
||||||
git_dir = os.path.join(self.bot.directory, ".git")
|
|
||||||
head_filepath = os.path.join(git_dir, "HEAD")
|
|
||||||
if os.path.isfile(head_filepath):
|
|
||||||
ref = None
|
|
||||||
with open(head_filepath, "r") as head_file:
|
|
||||||
ref = head_file.readline().split(" ", 1)[1].strip()
|
|
||||||
branch = ref.rsplit("/", 1)[1]
|
|
||||||
|
|
||||||
ref_filepath = os.path.join(git_dir, ref)
|
|
||||||
if os.path.isfile(ref_filepath):
|
|
||||||
with open(ref_filepath, "r") as ref_file:
|
|
||||||
commit_hash = ref_file.readline().strip()
|
|
||||||
|
|
||||||
out = "Version: BitBot %s" % IRCBot.VERSION
|
out = "Version: BitBot %s" % IRCBot.VERSION
|
||||||
if not commit_hash == None:
|
if not commit_hash == None:
|
||||||
out = "%s (%s@%s)" % (out, branch, commit_hash[:8])
|
out = "%s (%s@%s)" % (out, branch, commit_hash)
|
||||||
event["stdout"].write(out)
|
event["stdout"].write(out)
|
||||||
|
|
||||||
@utils.hook("received.command.source")
|
@utils.hook("received.command.source")
|
||||||
|
|
|
@ -37,6 +37,7 @@ class EventHook(object):
|
||||||
self.priority = priority
|
self.priority = priority
|
||||||
self.docstring = utils.parse.docstring(func.__doc__ or "")
|
self.docstring = utils.parse.docstring(func.__doc__ or "")
|
||||||
|
|
||||||
|
self.call_count = 0
|
||||||
self._kwargs: typing.Dict[str, typing.Any] = {}
|
self._kwargs: typing.Dict[str, typing.Any] = {}
|
||||||
self._multi_kwargs: typing.Dict[str, typing.List[typing.Any]] = {}
|
self._multi_kwargs: typing.Dict[str, typing.List[typing.Any]] = {}
|
||||||
for key, value in kwargs:
|
for key, value in kwargs:
|
||||||
|
@ -48,6 +49,7 @@ class EventHook(object):
|
||||||
self._kwargs[key] = value
|
self._kwargs[key] = value
|
||||||
|
|
||||||
def call(self, event: Event) -> typing.Any:
|
def call(self, event: Event) -> typing.Any:
|
||||||
|
self.call_count += 1
|
||||||
return self.function(event)
|
return self.function(event)
|
||||||
|
|
||||||
def get_kwargs(self, key: str) -> typing.List[typing.Any]:
|
def get_kwargs(self, key: str) -> typing.List[typing.Any]:
|
||||||
|
@ -122,6 +124,9 @@ class Events(object):
|
||||||
def purge_context(self, context: str):
|
def purge_context(self, context: str):
|
||||||
self._root._purge_context(context)
|
self._root._purge_context(context)
|
||||||
|
|
||||||
|
def all_hooks(self):
|
||||||
|
return self._root.all_hooks()
|
||||||
|
|
||||||
class EventRoot(object):
|
class EventRoot(object):
|
||||||
def __init__(self, log: Logging.Log):
|
def __init__(self, log: Logging.Log):
|
||||||
self.log = log
|
self.log = log
|
||||||
|
@ -232,3 +237,6 @@ class EventRoot(object):
|
||||||
if path_str in self._hooks:
|
if path_str in self._hooks:
|
||||||
return self._hooks[path_str][:]
|
return self._hooks[path_str][:]
|
||||||
return []
|
return []
|
||||||
|
|
||||||
|
def all_hooks(self):
|
||||||
|
return self._hooks.copy()
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import dataclasses, enum, gc, glob, importlib, importlib.util, io, inspect, os
|
import dataclasses, datetime, enum, gc, glob, importlib, importlib.util, io
|
||||||
import sys, typing, uuid
|
import inspect, os, sys, typing, uuid
|
||||||
from src import Config, EventManager, Exports, IRCBot, Logging, Timers, utils
|
from src import Config, EventManager, Exports, IRCBot, Logging, Timers, utils
|
||||||
|
|
||||||
class ModuleException(Exception):
|
class ModuleException(Exception):
|
||||||
|
@ -95,6 +95,10 @@ class LoadedModule(object):
|
||||||
context: str
|
context: str
|
||||||
import_name: str
|
import_name: str
|
||||||
is_core: bool
|
is_core: bool
|
||||||
|
commit: typing.Optional[str] = None
|
||||||
|
|
||||||
|
loaded_at: datetime.datetime = dataclasses.field(
|
||||||
|
default_factory=lambda: utils.datetime.utcnow())
|
||||||
|
|
||||||
class ModuleManager(object):
|
class ModuleManager(object):
|
||||||
def __init__(self,
|
def __init__(self,
|
||||||
|
@ -268,8 +272,9 @@ class ModuleManager(object):
|
||||||
for key, value in magic.get_exports():
|
for key, value in magic.get_exports():
|
||||||
context_exports.add(key, value)
|
context_exports.add(key, value)
|
||||||
|
|
||||||
|
current_commit = utils.git_commit(bot.directory)
|
||||||
return LoadedModule(definition.name, module_title, module_object,
|
return LoadedModule(definition.name, module_title, module_object,
|
||||||
context, import_name, definition.is_core)
|
context, import_name, definition.is_core, commit=current_commit)
|
||||||
|
|
||||||
def load_module(self, bot: "IRCBot.Bot", definition: ModuleDefinition
|
def load_module(self, bot: "IRCBot.Bot", definition: ModuleDefinition
|
||||||
) -> LoadedModule:
|
) -> LoadedModule:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import contextlib, enum, ipaddress, multiprocessing, queue, signal, threading
|
import contextlib, enum, ipaddress, multiprocessing, os.path, queue, signal
|
||||||
import typing
|
import threading, typing
|
||||||
from . import cli, consts, datetime, decorators, irc, http, parse, security
|
from . import cli, consts, datetime, decorators, irc, http, parse, security
|
||||||
|
|
||||||
from .decorators import export, hook, kwarg, spec
|
from .decorators import export, hook, kwarg, spec
|
||||||
|
@ -126,3 +126,18 @@ def deadline_process(func: typing.Callable[[], DeadlineProcessReturnType],
|
||||||
return out
|
return out
|
||||||
else:
|
else:
|
||||||
raise out # type: ignore
|
raise out # type: ignore
|
||||||
|
|
||||||
|
def git_commit(bot_directory: str) -> typing.Optional[str]:
|
||||||
|
git_dir = os.path.join(bot_directory, ".git")
|
||||||
|
head_filepath = os.path.join(git_dir, "HEAD")
|
||||||
|
if os.path.isfile(head_filepath):
|
||||||
|
ref = None
|
||||||
|
with open(head_filepath, "r") as head_file:
|
||||||
|
ref = head_file.readline().split(" ", 1)[1].strip()
|
||||||
|
branch = ref.rsplit("/", 1)[1]
|
||||||
|
|
||||||
|
ref_filepath = os.path.join(git_dir, ref)
|
||||||
|
if os.path.isfile(ref_filepath):
|
||||||
|
with open(ref_filepath, "r") as ref_file:
|
||||||
|
return ref_file.readline().strip()[:8]
|
||||||
|
return None
|
||||||
|
|
Loading…
Reference in a new issue