|
import datetime |
|
import inspect |
|
import re |
|
from abc import ABC, abstractmethod |
|
from pathlib import Path |
|
from time import time |
|
|
|
from omagent_core.base import BotBase |
|
from pydantic import model_validator |
|
|
|
from ..utils.error import VQLError |
|
from ..utils.logger import logging |
|
|
|
|
|
class CallbackBase(BotBase, ABC): |
|
bot_id: str |
|
start_time: str = datetime.datetime.now().strftime("%Y-%m-%d_%H:%M:%S") |
|
|
|
|
|
class Config: |
|
"""Configuration for this pydantic object.""" |
|
|
|
arbitrary_types_allowed = True |
|
extra = "allow" |
|
|
|
|
|
|
|
|
|
|
|
@abstractmethod |
|
def send_block(self, **kwargs): |
|
pass |
|
|
|
@abstractmethod |
|
def send_answer(self, **kwargs): |
|
pass |
|
|
|
@abstractmethod |
|
def info(self, **kwargs): |
|
pass |
|
|
|
@abstractmethod |
|
def error(self, **kwargs): |
|
pass |
|
|
|
@abstractmethod |
|
def finish(self, **kwargs): |
|
pass |
|
|
|
def filter_special_symbols_in_msg(self, msg): |
|
msg = re.sub(r"[-*#]", "", msg) |
|
return msg |
|
|
|
def remove_duplicates(self, sorted_list): |
|
if not sorted_list: |
|
return [] |
|
|
|
result = [sorted_list[0]] |
|
for item in sorted_list[1:]: |
|
if item != result[-1]: |
|
result.append(item) |
|
return result[::-1] |
|
|
|
def get_calling_class(self): |
|
stack = inspect.stack() |
|
|
|
calling_chain = self.remove_duplicates( |
|
[ |
|
each.frame.f_locals.get("self").__class__.__name__ |
|
for each in stack[2:] |
|
if isinstance(each.frame.f_locals.get("self"), BotBase) |
|
] |
|
) |
|
for frame_info in stack[2:]: |
|
frame = frame_info.frame |
|
|
|
self_obj = frame.f_locals.get("self") |
|
if self_obj: |
|
return self_obj, calling_chain |
|
return None, None |
|
|
|
|
|
class TestCallback(CallbackBase): |
|
bot_id: str = "" |
|
start_time: int = time() |
|
|
|
def info(self, *args, **kwargs): |
|
logging.debug("Callback message [{}] | [{}]".format(args, kwargs)) |
|
|
|
def error(self, error: VQLError): |
|
logging.error("Error message [{}]".format(error)) |
|
|