SYMBOL INDEX (710 symbols across 94 files) FILE: WebUI/__init__.py class InterceptHandler (line 14) | class InterceptHandler(logging.Handler): method emit (line 15) | def emit(self, record: logging.LogRecord) -> None: function _configure_logging (line 20) | def _configure_logging(app: Flask) -> None: function _setup_instance_directories (line 32) | def _setup_instance_directories(app: Flask) -> None: function create_app (line 41) | def create_app() -> Tuple[Flask, SocketIO]: FILE: WebUI/common/bot_bridge.py function get_or_create_eventloop (line 24) | def get_or_create_eventloop(): class BotBridge (line 42) | class BotBridge(metaclass=Singleton): method __init__ (line 43) | def __init__(self): method get_message_count (line 73) | async def get_message_count(self): method increment_message_count (line 86) | async def increment_message_count(self, amount=1): method get_user_count (line 100) | async def get_user_count(self): method increment_user_count (line 113) | async def increment_user_count(self, amount=1): method get_start_time (line 127) | async def get_start_time(self): method save_log_position (line 137) | async def save_log_position(self, position): method get_log_position (line 148) | async def get_log_position(self): method save_profile (line 159) | def save_profile(self, avatar_url: str = "", nickname: str = "", wxid:... method get_profile (line 166) | def get_profile(self): method _create_task (line 183) | def _create_task(self, coro): method get_all_plugins (line 200) | def get_all_plugins(self) -> List[Dict[str, Any]]: method get_plugin_details (line 245) | def get_plugin_details(self, plugin_name: str) -> Optional[Dict[str, A... method enable_plugin (line 272) | async def enable_plugin(self, plugin_name: str) -> bool: method disable_plugin (line 282) | async def disable_plugin(self, plugin_name: str) -> bool: method reload_plugin (line 292) | async def reload_plugin(self, plugin_name: str) -> bool: FILE: WebUI/forms/auth_forms.py class LoginForm (line 6) | class LoginForm(FlaskForm): FILE: WebUI/routes/__init__.py function register_blueprints (line 1) | def register_blueprints(app): FILE: WebUI/routes/about.py function about (line 10) | def about(): FILE: WebUI/routes/auth.py function login (line 14) | def login(): function logout (line 55) | def logout(): FILE: WebUI/routes/bot.py function api_start_bot (line 11) | def api_start_bot(): function api_stop_bot (line 22) | def api_stop_bot(): function api_get_bot_status (line 33) | def api_get_bot_status(): FILE: WebUI/routes/config.py function configs_page (line 14) | def configs_page(): function get_config (line 22) | def get_config(): function get_schema (line 53) | def get_schema(): function get_schemas (line 84) | def get_schemas(): function save_config (line 98) | def save_config(): function save_specific_config (line 166) | def save_specific_config(config_name: str): FILE: WebUI/routes/explorer.py function index (line 11) | def index(): function view_file (line 22) | def view_file(file_path): FILE: WebUI/routes/file.py function normalize_path (line 13) | def normalize_path(rel_path: str) -> Path: function api_list_files (line 53) | def api_list_files(): function is_safe_path (line 118) | def is_safe_path(path: str) -> bool: function api_file_content (line 125) | def api_file_content(): function api_search_in_file (line 187) | def api_search_in_file(): function api_save_file (line 208) | def api_save_file(): function view_file (line 245) | def view_file(file_path): FILE: WebUI/routes/logs.py function index (line 11) | def index(): FILE: WebUI/routes/overview.py function index (line 15) | def index(): function api_status (line 33) | def api_status(): FILE: WebUI/routes/plugin.py function plugin_page (line 13) | def plugin_page(): function get_plugins (line 20) | def get_plugins(): function get_plugin_detail (line 46) | def get_plugin_detail(plugin_name: str): function enable_plugin (line 73) | def enable_plugin(plugin_name: str): function disable_plugin (line 110) | def disable_plugin(plugin_name: str): function reload_plugin (line 147) | def reload_plugin(plugin_name: str): function pluginl_list_files (line 184) | def pluginl_list_files(plugin_name: str): function save_plugin_config (line 199) | def save_plugin_config(plugin_name: str): FILE: WebUI/routes/tools.py function index (line 12) | def index(): function list_tools (line 22) | def list_tools(): function execute_tool_api (line 41) | def execute_tool_api(tool_id): FILE: WebUI/services/bot_service.py function get_or_create_eventloop (line 26) | def get_or_create_eventloop() -> asyncio.AbstractEventLoop: class BotService (line 44) | class BotService(metaclass=Singleton): method __init__ (line 45) | def __init__(self): method start_bot (line 55) | def start_bot(self) -> bool: method stop_bot (line 112) | def stop_bot(self) -> bool: method is_running (line 157) | def is_running(self) -> bool: method get_status (line 185) | def get_status(self) -> Dict[str, Any]: FILE: WebUI/services/config_service.py class ConfigService (line 18) | class ConfigService(metaclass=Singleton): method __init__ (line 25) | def __init__(self): method get_config (line 73) | def get_config(self) -> Dict[str, Any]: method get_toml_doc (line 92) | def get_toml_doc(self) -> Optional[Union[tomlkit.TOMLDocument, dict]]: method extract_comments (line 111) | def extract_comments(self) -> Dict[str, str]: method save_config (line 182) | def save_config(self, config: Dict[str, Any]) -> bool: method _fix_nested_config_structure (line 261) | def _fix_nested_config_structure(self, config: Dict[str, Any]) -> None: method get_form_schema (line 323) | def get_form_schema(self) -> Dict[str, Any]: method validate_config (line 457) | def validate_config(self, config: Dict[str, Any]) -> Tuple[bool, List[... method _dict_to_toml (line 489) | def _dict_to_toml(self, data: Dict[str, Any]) -> str: method _get_field_type (line 512) | def _get_field_type(self, value: Any) -> str: method get_version (line 538) | def get_version(self) -> str: FILE: WebUI/services/data_service.py class DataService (line 28) | class DataService(metaclass=Singleton): method __init__ (line 31) | def __init__(self): method _init_async (line 47) | async def _init_async(self): method get_bot_status (line 51) | def get_bot_status(self): method get_metrics (line 67) | def get_metrics(self): method _refresh_cache_data (line 80) | def _refresh_cache_data(self): method get_recent_logs (line 146) | def get_recent_logs(self, n=100): method get_new_logs (line 169) | def get_new_logs(self): method _save_log_position (line 200) | async def _save_log_position(self): method _get_message_count (line 210) | async def _get_message_count(self): method _get_user_count (line 221) | async def _get_user_count(self): method _get_start_time (line 232) | async def _get_start_time(self): method _get_uptime (line 245) | def _get_uptime(self): method _get_uptime_formatted (line 265) | def _get_uptime_formatted(self): method increment_message_count (line 296) | async def increment_message_count(self, amount=1): method increment_user_count (line 313) | async def increment_user_count(self, amount=1): FILE: WebUI/services/file_service.py class SecurityError (line 16) | class SecurityError(Exception): class PathValidationError (line 21) | class PathValidationError(Exception): class FileService (line 26) | class FileService(metaclass=Singleton): method __init__ (line 34) | def __init__(self): method _validate_path (line 42) | def _validate_path(self, rel_path: str) -> Path: method list_directory (line 84) | def list_directory(self, rel_path: str = '') -> List[Dict[str, Any]]: method get_file_content (line 141) | def get_file_content(self, rel_path: str = '', method search_in_file (line 237) | def search_in_file(self, rel_path: str = '', method save_file_content (line 290) | def save_file_content(self, rel_path: str, content: str) -> bool: FILE: WebUI/services/plugin_service.py function get_event_loop (line 17) | def get_event_loop(): class PluginService (line 37) | class PluginService(metaclass=Singleton): method __init__ (line 40) | def __init__(self): method get_all_plugins (line 45) | def get_all_plugins(self) -> List[Dict[str, Any]]: method get_plugin_details (line 49) | def get_plugin_details(self, plugin_name: str) -> Optional[Dict[str, A... method enable_plugin (line 53) | async def enable_plugin(self, plugin_name: str) -> bool: method disable_plugin (line 57) | async def disable_plugin(self, plugin_name: str) -> bool: method reload_plugin (line 61) | async def reload_plugin(self, plugin_name: str) -> bool: method run_async (line 65) | def run_async(self, coro): method save_plugin_config (line 85) | def save_plugin_config(self, plugin_name: str, config_data: Dict[str, ... FILE: WebUI/services/tool_service.py function register_tool (line 13) | def register_tool(tool_id: str, title: str, description: str, function get_tools_list (line 55) | def get_tools_list() -> List[Dict[str, Any]]: function execute_tool (line 80) | def execute_tool(tool_id: str) -> Dict[str, Any]: function load_built_in_tools (line 134) | def load_built_in_tools() -> None: function reset_account_handler (line 160) | def reset_account_handler() -> Dict[str, Any]: FILE: WebUI/services/websocket_service.py class LogWatcher (line 15) | class LogWatcher: method __init__ (line 18) | def __init__(self, socketio_instance): method _init_watcher (line 33) | def _init_watcher(self): method start (line 46) | def start(self): method stop (line 55) | def stop(self): method _should_ignore_log (line 62) | def _should_ignore_log(self, log_line): method _emit_logs (line 85) | def _emit_logs(self): method _watch_log_file (line 101) | def _watch_log_file(self): method get_historical_logs (line 151) | def get_historical_logs(self, n=100): function init_websocket (line 191) | def init_websocket(): function shutdown_websocket (line 221) | def shutdown_websocket(): FILE: WebUI/static/js/components/cards.js class StatusCard (line 1) | class StatusCard { method constructor (line 2) | constructor(element) { method update (line 9) | update(value) { method setIcon (line 15) | setIcon(iconClass) { class ControlCard (line 22) | class ControlCard { method constructor (line 23) | constructor(element, options = {}) { method init (line 33) | init() { method start (line 42) | start() { method stop (line 48) | stop() { method setStatus (line 54) | setStatus(isRunning) { class LogCard (line 67) | class LogCard { method constructor (line 68) | constructor(element, options = {}) { method init (line 78) | init() { method refresh (line 87) | refresh() { method clear (line 93) | clear() { method appendLog (line 102) | appendLog(logText, level = 'info') { method scrollToBottom (line 112) | scrollToBottom() { FILE: WebUI/static/js/components/file_browser.js function initEventListeners (line 83) | function initEventListeners() { method loadFileList (line 105) | async loadFileList(path) { function getFileListTemplate (line 131) | function getFileListTemplate(files, isRoot) { function getFileGridTemplate (line 162) | function getFileGridTemplate(files, isRoot) { method fileList (line 183) | fileList(files) { function handleBreadcrumbClick (line 199) | function handleBreadcrumbClick(e) { function toggleViewMode (line 207) | function toggleViewMode() { function updateViewToggleIcon (line 213) | function updateViewToggleIcon() { function updateBreadcrumb (line 222) | function updateBreadcrumb() { function bindFileItemEvents (line 277) | function bindFileItemEvents() { function openFileViewer (line 292) | function openFileViewer(path) { function init (line 297) | function init() { FILE: WebUI/static/js/components/file_viewer.js function init (line 107) | async function init() { function loadFileData (line 113) | async function loadFileData() { function saveFileContent (line 169) | async function saveFileContent() { function initMonacoEditor (line 204) | function initMonacoEditor(content) { function createEditor (line 224) | function createEditor(content) { function initEventListeners (line 258) | function initEventListeners() { function updateFileInfo (line 307) | function updateFileInfo(info) { FILE: WebUI/static/js/components/loading.js class LoadingSpinner (line 1) | class LoadingSpinner { method constructor (line 2) | constructor(options = {}) { method render (line 10) | render() { class ProgressBar (line 28) | class ProgressBar { method constructor (line 29) | constructor(options = {}) { method render (line 39) | render() { method update (line 56) | update(value) { class FullPageLoader (line 62) | class FullPageLoader { method constructor (line 63) | constructor(options = {}) { method show (line 71) | show() { method hide (line 89) | hide() { method setMessage (line 95) | setMessage(message) { class ContentLoader (line 106) | class ContentLoader { method constructor (line 107) | constructor(options = {}) { method render (line 114) | render() { FILE: WebUI/static/js/components/modals.js class BaseModal (line 1) | class BaseModal { method constructor (line 2) | constructor(options = {}) { method createModal (line 13) | createModal() { method getModalBody (line 40) | getModalBody() { method getModalFooter (line 44) | getModalFooter() { method show (line 48) | show() { method hide (line 55) | hide() { method dispose (line 61) | dispose() { class ConfirmModal (line 70) | class ConfirmModal extends BaseModal { method constructor (line 71) | constructor(options = {}) { method getModalBody (line 82) | getModalBody() { method getModalFooter (line 86) | getModalFooter() { method createModal (line 95) | createModal() { class FormModal (line 104) | class FormModal extends BaseModal { method constructor (line 105) | constructor(options = {}) { method getModalBody (line 114) | getModalBody() { method getModalFooter (line 122) | getModalFooter() { method createModal (line 131) | createModal() { class AjaxModal (line 145) | class AjaxModal extends BaseModal { method constructor (line 146) | constructor(options = {}) { method loadContent (line 153) | async loadContent() { method getModalBody (line 178) | getModalBody() { method show (line 189) | show() { FILE: WebUI/static/js/logs.js function loadInitialLogs (line 1) | async function loadInitialLogs(limit = 100) { function startLogUpdates (line 12) | function startLogUpdates(interval = 2000) { function displayLogs (line 27) | function displayLogs(logs) { function appendLogs (line 39) | function appendLogs(logs) { function appendLogLine (line 47) | function appendLogLine(log) { function applyLogLevelStyle (line 61) | function applyLogLevelStyle(logElement, logText) { function scrollToBottom (line 79) | function scrollToBottom() { function initRealtimeLog (line 90) | function initRealtimeLog() { function preventScrollPropagation (line 105) | function preventScrollPropagation() { FILE: WebUI/static/js/main.js function showNotification (line 50) | function showNotification(message, type = 'info') { function formatDateTime (line 116) | function formatDateTime(timestamp) { function confirmAction (line 130) | function confirmAction(message, callback) { function debounce (line 137) | function debounce(func, wait) { function throttle (line 148) | function throttle(func, wait) { FILE: WebUI/static/js/pages/about.js function checkLatestVersion (line 21) | function checkLatestVersion() { function copyToClipboard (line 52) | function copyToClipboard(text) { function showToast (line 70) | function showToast(message) { FILE: WebUI/static/js/pages/config.js function loadConfigSchemas (line 60) | async function loadConfigSchemas() { function loadConfigs (line 87) | async function loadConfigs(schemas) { function renderConfigForm (line 104) | function renderConfigForm(schemas, configs) { function renderSchemaProperties (line 149) | function renderSchemaProperties(schema, config, configName, parentPath =... function renderPropertyField (line 173) | function renderPropertyField(propName, propSchema, propValue, configName... function renderEnumField (line 226) | function renderEnumField(fieldId, fieldName, schema, value, required) { function renderPasswordField (line 238) | function renderPasswordField(fieldId, fieldName, value, required) { function renderTextareaField (line 246) | function renderTextareaField(fieldId, fieldName, value, required) { function renderTextField (line 254) | function renderTextField(fieldId, fieldName, value, required) { function renderNumberField (line 262) | function renderNumberField(fieldId, fieldName, schema, value, required) { function renderBooleanField (line 273) | function renderBooleanField(fieldId, fieldName, value) { function renderArrayField (line 284) | function renderArrayField(fieldId, schema, value, configName, propPath) { function renderArrayItem (line 319) | function renderArrayItem(fieldId, schema, value, index, configName, prop... function renderObjectField (line 358) | function renderObjectField(fieldId, schema, value, configName, propPath) { function handleAddArrayItem (line 369) | async function handleAddArrayItem(fieldId, configName, propPath) { function saveAllConfigs (line 417) | async function saveAllConfigs() { function validateForm (line 473) | function validateForm() { function collectConfigData (line 511) | function collectConfigData(configName) { function setNestedProperty (line 570) | function setNestedProperty(obj, path, value) { function saveConfig (line 595) | async function saveConfig(configName, configData) { FILE: WebUI/static/js/pages/explorer.js function updateExplorerView (line 25) | function updateExplorerView(view) { function handleFileOperation (line 41) | function handleFileOperation(operation, path) { function isImageFile (line 62) | function isImageFile(path) { function isTextFile (line 67) | function isTextFile(path) { function previewImage (line 73) | function previewImage(path) { function openFileViewer (line 82) | function openFileViewer(path) { function downloadFile (line 87) | function downloadFile(path) { function deleteFile (line 92) | function deleteFile(path) { class ImagePreviewModal (line 130) | class ImagePreviewModal extends BaseModal { method constructor (line 131) | constructor(options = {}) { method getModalBody (line 139) | getModalBody() { method getModalFooter (line 150) | getModalFooter() { FILE: WebUI/static/js/pages/overview.js function initWebSocket (line 64) | function initWebSocket() { function displayLogs (line 136) | function displayLogs(logs) { function appendLogs (line 179) | function appendLogs(logs) { function applyLogLevelStyle (line 221) | function applyLogLevelStyle(logElement, logText) { function refreshStatus (line 242) | function refreshStatus() { function updateStatusDisplay (line 267) | function updateStatusDisplay(status) { function updateMetricsDisplay (line 285) | function updateMetricsDisplay(status) { function updateControlButtons (line 307) | function updateControlButtons(status) { function handleBotStart (line 326) | function handleBotStart() { function handleBotStop (line 348) | function handleBotStop() { function handleBotRestart (line 370) | function handleBotRestart() { function refreshAllData (line 392) | function refreshAllData() { function startAutoRefresh (line 397) | function startAutoRefresh() { function stopAutoRefresh (line 403) | function stopAutoRefresh() { function showNotification (line 411) | function showNotification(message, type = 'info') { FILE: WebUI/static/js/pages/plugin.js function initializePluginManager (line 16) | function initializePluginManager() { function bindEvents (line 35) | function bindEvents() { function checkBotStatus (line 55) | function checkBotStatus() { function loadPlugins (line 63) | function loadPlugins() { function showLoadError (line 84) | function showLoadError(error) { function renderPluginList (line 97) | function renderPluginList(plugins) { function handlePluginActionClick (line 163) | function handlePluginActionClick() { function handlePluginReloadClick (line 170) | function handlePluginReloadClick() { function handleConfigButtonClick (line 176) | function handleConfigButtonClick() { function handleEnableDisableClick (line 182) | function handleEnableDisableClick() { function handleReloadClick (line 199) | function handleReloadClick() { function handleSaveConfigClick (line 205) | function handleSaveConfigClick() { function handlePluginSearch (line 217) | function handlePluginSearch() { function handlePluginAction (line 230) | function handlePluginAction(pluginId, action) { function enablePlugin (line 255) | function enablePlugin(pluginId) { function disablePlugin (line 263) | function disablePlugin(pluginId) { function reloadPlugin (line 271) | function reloadPlugin(pluginId) { function savePluginConfig (line 279) | function savePluginConfig(pluginId, config) { function showNotification (line 289) | function showNotification(message, type = 'info') { FILE: WebUI/static/js/pages/tools.js function loadTools (line 7) | function loadTools() { function renderTools (line 28) | function renderTools(tools) { function executeTool (line 79) | function executeTool(toolId) { function showExecutionDetail (line 121) | function showExecutionDetail(success, data) { function showConfirmModal (line 152) | function showConfirmModal(title, message, callback) { FILE: WebUI/utils/async_to_sync.py function async_to_sync (line 8) | def async_to_sync(func): FILE: WebUI/utils/auth_utils.py function login_required (line 8) | def login_required(view): function verify_credentials (line 33) | def verify_credentials(username, password): FILE: WebUI/utils/singleton.py class Singleton (line 1) | class Singleton(type): method __call__ (line 4) | def __call__(cls, *args, **kwargs): method reset_instance (line 10) | def reset_instance(mcs, cls): method reset_all (line 16) | def reset_all(mcs): FILE: WebUI/utils/template_filters.py function timestamp_to_datetime (line 4) | def timestamp_to_datetime(timestamp): function format_file_size (line 24) | def format_file_size(size_bytes): function register_template_filters (line 44) | def register_template_filters(app): FILE: WechatAPI/Client/__init__.py class WechatAPIClient (line 14) | class WechatAPIClient(LoginMixin, MessageMixin, FriendMixin, ChatroomMix... method send_at_message (line 19) | async def send_at_message(self, wxid: str, content: str, at: list[str]... FILE: WechatAPI/Client/base.py class Proxy (line 7) | class Proxy: class Section (line 23) | class Section: class WechatAPIClientBase (line 34) | class WechatAPIClientBase: method __init__ (line 48) | def __init__(self, ip: str, port: int): method error_handler (line 63) | def error_handler(json_resp): FILE: WechatAPI/Client/chatroom.py class ChatroomMixin (line 10) | class ChatroomMixin(WechatAPIClientBase): method add_chatroom_member (line 11) | async def add_chatroom_member(self, chatroom: str, wxid: str) -> bool: method get_chatroom_announce (line 36) | async def get_chatroom_announce(self, chatroom: str) -> dict: method get_chatroom_info (line 60) | async def get_chatroom_info(self, chatroom: str) -> dict: method get_chatroom_member_list (line 84) | async def get_chatroom_member_list(self, chatroom: str) -> list[dict]: method get_chatroom_qrcode (line 106) | async def get_chatroom_qrcode(self, chatroom: str) -> dict[str, Any]: method invite_chatroom_member (line 131) | async def invite_chatroom_member(self, wxid: Union[str, list], chatroo... FILE: WechatAPI/Client/friend.py class FriendMixin (line 10) | class FriendMixin(WechatAPIClientBase): method accept_friend (line 11) | async def accept_friend(self, scene: int, v1: str, v2: str) -> bool: method get_contact (line 48) | async def get_contact(self, wxid: Union[str, list[str]]) -> Union[dict... method get_contract_detail (line 77) | async def get_contract_detail(self, wxid: Union[str, list[str]], chatr... method get_contract_list (line 106) | async def get_contract_list(self, wx_seq: int = 0, chatroom_seq: int =... method get_nickname (line 129) | async def get_nickname(self, wxid: Union[str, list[str]]) -> Union[str... FILE: WechatAPI/Client/hongbao.py class HongBaoMixin (line 7) | class HongBaoMixin(WechatAPIClientBase): method get_hongbao_detail (line 8) | async def get_hongbao_detail(self, xml: str, encrypt_key: str, encrypt... FILE: WechatAPI/Client/login.py class LoginMixin (line 15) | class LoginMixin(WechatAPIClientBase): method is_running (line 16) | async def is_running(self) -> bool: method get_qr_code (line 29) | async def get_qr_code(self, device_name: str, device_id: str = "", pro... method check_login_uuid (line 70) | async def check_login_uuid(self, uuid: str, device_id: str = "") -> tu... method log_out (line 99) | async def log_out(self) -> bool: method awaken_login (line 124) | async def awaken_login(self, wxid: str = "") -> str: method get_cached_info (line 156) | async def get_cached_info(self, wxid: str = None) -> dict: method heartbeat (line 181) | async def heartbeat(self) -> bool: method start_auto_heartbeat (line 204) | async def start_auto_heartbeat(self) -> bool: method stop_auto_heartbeat (line 227) | async def stop_auto_heartbeat(self) -> bool: method get_auto_heartbeat_status (line 250) | async def get_auto_heartbeat_status(self) -> bool: method create_device_name (line 274) | def create_device_name() -> str: method create_device_id (line 303) | def create_device_id(s: str = "") -> str: FILE: WechatAPI/Client/message.py class MessageMixin (line 21) | class MessageMixin(WechatAPIClientBase): method __init__ (line 22) | def __init__(self, ip: str, port: int): method _process_message_queue (line 28) | async def _process_message_queue(self): method _queue_message (line 51) | async def _queue_message(self, func, *args, **kwargs): method revoke_message (line 63) | async def revoke_message(self, wxid: str, client_msg_id: int, create_t... method send_text_message (line 100) | async def send_text_message(self, wxid: str, content: str, at: Union[l... method _send_text_message (line 118) | async def _send_text_message(self, wxid: str, content: str, at: list[s... method send_image_message (line 148) | async def send_image_message(self, wxid: str, image: Union[str, bytes,... method _send_image_message (line 166) | async def _send_image_message(self, wxid: str, image: Union[str, bytes... method send_video_message (line 196) | async def send_video_message(self, wxid: str, video: Union[str, bytes,... method send_voice_message (line 265) | async def send_voice_message(self, wxid: str, voice: Union[str, bytes,... method _send_voice_message (line 285) | async def _send_voice_message(self, wxid: str, voice: Union[str, bytes... method _get_closest_frame_rate (line 341) | def _get_closest_frame_rate(frame_rate: int) -> int: method send_link_message (line 353) | async def send_link_message(self, wxid: str, url: str, title: str = ""... method _send_link_message (line 374) | async def _send_link_message(self, wxid: str, url: str, title: str = "... method send_emoji_message (line 399) | async def send_emoji_message(self, wxid: str, md5: str, total_length: ... method _send_emoji_message (line 417) | async def _send_emoji_message(self, wxid: str, md5: str, total_length:... method send_card_message (line 434) | async def send_card_message(self, wxid: str, card_wxid: str, card_nick... method _send_card_message (line 454) | async def _send_card_message(self, wxid: str, card_wxid: str, card_nic... method send_app_message (line 478) | async def send_app_message(self, wxid: str, xml: str, type: int) -> tu... method _send_app_message (line 496) | async def _send_app_message(self, wxid: str, xml: str, type: int) -> t... method send_cdn_file_msg (line 515) | async def send_cdn_file_msg(self, wxid: str, xml: str) -> tuple[str, i... method _send_cdn_file_msg (line 532) | async def _send_cdn_file_msg(self, wxid: str, xml: str) -> tuple[int, ... method send_cdn_img_msg (line 550) | async def send_cdn_img_msg(self, wxid: str, xml: str) -> tuple[str, in... method _send_cdn_img_msg (line 567) | async def _send_cdn_img_msg(self, wxid: str, xml: str) -> tuple[int, i... method send_cdn_video_msg (line 585) | async def send_cdn_video_msg(self, wxid: str, xml: str) -> tuple[str, ... method _send_cdn_video_msg (line 602) | async def _send_cdn_video_msg(self, wxid: str, xml: str) -> tuple[int,... method sync_message (line 620) | async def sync_message(self) -> dict: FILE: WechatAPI/Client/protect.py class Singleton (line 6) | class Singleton(type): method __call__ (line 16) | def __call__(cls, *args, **kwargs): class Protect (line 31) | class Protect(metaclass=Singleton): method __init__ (line 43) | def __init__(self): method check (line 65) | def check(self, second: int) -> bool: method update_login_status (line 77) | def update_login_status(self, device_id: str = ""): FILE: WechatAPI/Client/tool.py class ToolMixin (line 14) | class ToolMixin(WechatAPIClientBase): method download_image (line 15) | async def download_image(self, aeskey: str, cdnmidimgurl: str) -> str: method download_voice (line 42) | async def download_voice(self, msg_id: str, voiceurl: str, length: int... method download_attach (line 70) | async def download_attach(self, attach_id: str) -> dict: method download_video (line 96) | async def download_video(self, msg_id) -> str: method set_step (line 122) | async def set_step(self, count: int) -> bool: method set_proxy (line 151) | async def set_proxy(self, proxy: Proxy) -> bool: method check_database (line 180) | async def check_database(self) -> bool: method base64_to_file (line 196) | def base64_to_file(base64_str: str, file_name: str, file_path: str) ->... method file_to_base64 (line 227) | def file_to_base64(file_path: str) -> str: method base64_to_byte (line 240) | def base64_to_byte(base64_str: str) -> bytes: method byte_to_base64 (line 256) | def byte_to_base64(byte: bytes) -> str: method silk_byte_to_byte_wav_byte (line 268) | async def silk_byte_to_byte_wav_byte(silk_byte: bytes) -> bytes: method wav_byte_to_amr_byte (line 280) | def wav_byte_to_amr_byte(wav_byte: bytes) -> bytes: method wav_byte_to_amr_base64 (line 312) | def wav_byte_to_amr_base64(wav_byte: bytes) -> str: method wav_byte_to_silk_byte (line 324) | async def wav_byte_to_silk_byte(wav_byte: bytes) -> bytes: method wav_byte_to_silk_base64 (line 339) | async def wav_byte_to_silk_base64(wav_byte: bytes) -> str: method silk_base64_to_wav_byte (line 351) | async def silk_base64_to_wav_byte(silk_base64: str) -> bytes: FILE: WechatAPI/Client/user.py class UserMixin (line 8) | class UserMixin(WechatAPIClientBase): method get_profile (line 9) | async def get_profile(self, wxid: str = None) -> dict: method get_my_qrcode (line 38) | async def get_my_qrcode(self, style: int = 0) -> str: method is_logged_in (line 67) | async def is_logged_in(self, wxid: str = None) -> bool: FILE: WechatAPI/Server/WechatAPIServer.py class WechatAPIServer (line 9) | class WechatAPIServer: method __init__ (line 10) | def __init__(self): method start (line 18) | async def start(self, port=9000, mode="release", redis_host="127.0.0.1", method stop (line 42) | async def stop(self): method process_log (line 56) | async def process_log(self): method _read_stream (line 72) | async def _read_stream(self, stream, log_level): FILE: WechatAPI/errors.py class MarshallingError (line 1) | class MarshallingError(Exception): method __init__ (line 2) | def __init__(self, *args, **kwargs): class UnmarshallingError (line 5) | class UnmarshallingError(Exception): method __init__ (line 6) | def __init__(self, *args, **kwargs): class MMTLSError (line 9) | class MMTLSError(Exception): method __init__ (line 10) | def __init__(self, *args, **kwargs): class PacketError (line 13) | class PacketError(Exception): method __init__ (line 14) | def __init__(self, *args, **kwargs): class ParsePacketError (line 17) | class ParsePacketError(Exception): method __init__ (line 18) | def __init__(self, *args, **kwargs): class DatabaseError (line 21) | class DatabaseError(Exception): method __init__ (line 22) | def __init__(self, *args, **kwargs): class LoginError (line 25) | class LoginError(Exception): method __init__ (line 26) | def __init__(self, *args, **kwargs): class UserLoggedOut (line 29) | class UserLoggedOut(Exception): method __init__ (line 30) | def __init__(self, *args, **kwargs): class BanProtection (line 33) | class BanProtection(Exception): method __init__ (line 34) | def __init__(self, *args, **kwargs): FILE: app.py function init_system (line 36) | async def init_system(): function shutdown_system (line 53) | async def shutdown_system(): function run_async_safely (line 82) | def run_async_safely(coro): function signal_handler (line 103) | def signal_handler(signum, _): function main (line 120) | def main(): FILE: bot.py function run_bot (line 23) | async def run_bot(): function init_system (line 253) | async def init_system(): function main (line 315) | async def main(): FILE: database/XYBotDB.py class User (line 18) | class User(Base): class Chatroom (line 30) | class Chatroom(Base): class XYBotDB (line 39) | class XYBotDB(metaclass=Singleton): method __init__ (line 40) | def __init__(self): method _execute_in_queue (line 54) | def _execute_in_queue(self, method, *args, **kwargs): method add_points (line 65) | def add_points(self, wxid: str, num: int) -> bool: method _add_points (line 69) | def _add_points(self, wxid: str, num: int) -> bool: method set_points (line 93) | def set_points(self, wxid: str, num: int) -> bool: method _set_points (line 97) | def _set_points(self, wxid: str, num: int) -> bool: method get_points (line 119) | def get_points(self, wxid: str) -> int: method _get_points (line 123) | def _get_points(self, wxid: str) -> int: method get_signin_stat (line 132) | def get_signin_stat(self, wxid: str) -> datetime.datetime: method _get_signin_stat (line 136) | def _get_signin_stat(self, wxid: str) -> datetime.datetime: method set_signin_stat (line 144) | def set_signin_stat(self, wxid: str, signin_time: datetime.datetime) -... method _set_signin_stat (line 148) | def _set_signin_stat(self, wxid: str, signin_time: datetime.datetime) ... method reset_all_signin_stat (line 176) | def reset_all_signin_stat(self) -> bool: method get_leaderboard (line 190) | def get_leaderboard(self, count: int) -> list: method set_whitelist (line 199) | def set_whitelist(self, wxid: str, stat: bool) -> bool: method get_whitelist (line 218) | def get_whitelist(self, wxid: str) -> bool: method get_whitelist_list (line 227) | def get_whitelist_list(self) -> list: method safe_trade_points (line 236) | def safe_trade_points(self, trader_wxid: str, target_wxid: str, num: i... method _safe_trade_points (line 240) | def _safe_trade_points(self, trader_wxid: str, target_wxid: str, num: ... method get_user_list (line 274) | def get_user_list(self) -> list: method get_llm_thread_id (line 283) | def get_llm_thread_id(self, wxid: str, namespace: str = None) -> Union... method save_llm_thread_id (line 304) | def save_llm_thread_id(self, wxid: str, data: str, namespace: str) -> ... method delete_all_llm_thread_id (line 343) | def delete_all_llm_thread_id(self): method get_signin_streak (line 358) | def get_signin_streak(self, wxid: str) -> int: method _get_signin_streak (line 362) | def _get_signin_streak(self, wxid: str) -> int: method set_signin_streak (line 370) | def set_signin_streak(self, wxid: str, streak: int) -> bool: method _set_signin_streak (line 374) | def _set_signin_streak(self, wxid: str, streak: int) -> bool: method get_chatroom_list (line 397) | def get_chatroom_list(self) -> list: method get_chatroom_members (line 406) | def get_chatroom_members(self, chatroom_id: str) -> set: method set_chatroom_members (line 415) | def set_chatroom_members(self, chatroom_id: str, members: set) -> bool: method get_users_count (line 434) | def get_users_count(self): method __del__ (line 441) | def __del__(self): FILE: database/keyvalDB.py class KeyValue (line 17) | class KeyValue(DeclarativeBase): class KeyvalDB (line 25) | class KeyvalDB(metaclass=Singleton): method __new__ (line 28) | def __new__(cls): method initialize (line 50) | async def initialize(self): method set (line 58) | async def set( method get (line 88) | async def get(self, key: str) -> Optional[str]: method delete (line 102) | async def delete(self, key: str) -> bool: method exists (line 109) | async def exists(self, key: str) -> bool: method ttl (line 119) | async def ttl(self, key: str) -> int: method expire (line 130) | async def expire(self, key: str, ex: Union[int, timedelta]) -> bool: method keys (line 142) | async def keys(self, pattern: str = "*") -> List[str]: method _cleanup_expired (line 150) | async def _cleanup_expired(self, interval: int = 3600): method close (line 160) | async def close(self): method __aenter__ (line 182) | async def __aenter__(self): method __aexit__ (line 185) | async def __aexit__(self, exc_type, exc_val, exc_tb): FILE: database/messsagDB.py class Message (line 19) | class Message(DeclarativeBase): class MessageDB (line 32) | class MessageDB(metaclass=Singleton): method __new__ (line 35) | def __new__(cls): method initialize (line 57) | async def initialize(self): method save_message (line 63) | async def save_message(self, method get_messages (line 90) | async def get_messages(self, method close (line 122) | async def close(self): method cleanup_messages (line 144) | async def cleanup_messages(self): method __aenter__ (line 161) | async def __aenter__(self): method __aexit__ (line 166) | async def __aexit__(self, exc_type, exc_val, exc_tb): FILE: docs/WechatAPIClient/_static/doctools.js constant BLACKLISTED_KEY_CONTROL_ELEMENTS (line 6) | const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ FILE: docs/WechatAPIClient/_static/documentation_options.js constant DOCUMENTATION_OPTIONS (line 1) | const DOCUMENTATION_OPTIONS = { FILE: docs/WechatAPIClient/_static/scripts/furo.js function n (line 2) | function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={expo... function l (line 2) | function l(){const t=localStorage.getItem("theme")||"auto";var e;"light"... function a (line 2) | function a(){!function(){const t=document.getElementsByClassName("theme-... FILE: docs/WechatAPIClient/_static/searchtools.js class SearchResultKind (line 44) | class SearchResultKind { method index (line 45) | static get index() { method object (line 49) | static get object() { method text (line 53) | static get text() { method title (line 57) | static get title() { FILE: docs/WechatAPIClient/_static/sphinx_highlight.js constant SPHINX_HIGHLIGHT_ENABLED (line 4) | const SPHINX_HIGHLIGHT_ENABLED = true FILE: plugins/AdminPoint/main.py class AdminPoint (line 9) | class AdminPoint(PluginBase): method __init__ (line 14) | def __init__(self): method handle_text (line 34) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/AdminSigninReset/main.py class AdminSignInReset (line 9) | class AdminSignInReset(PluginBase): method __init__ (line 14) | def __init__(self): method handle_text (line 34) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/AdminWhitelist/main.py class AdminWhitelist (line 9) | class AdminWhitelist(PluginBase): method __init__ (line 14) | def __init__(self): method handle_text (line 34) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/BotStatus/main.py class BotStatus (line 9) | class BotStatus(PluginBase): method __init__ (line 14) | def __init__(self): method handle_text (line 32) | async def handle_text(self, bot: WechatAPIClient, message: dict): method handle_at (line 48) | async def handle_at(self, bot: WechatAPIClient, message: dict): FILE: plugins/DependencyManager/main.py class DependencyManager (line 26) | class DependencyManager(PluginBase): method __init__ (line 36) | def __init__(self): method load_config (line 59) | def load_config(self): method handle_text_message (line 106) | async def handle_text_message(self, bot: WechatAPIClient, message: dict): method _handle_install (line 280) | async def _handle_install(self, bot: WechatAPIClient, chat_id: str, pa... method _handle_github_install (line 322) | async def _handle_github_install(self, bot: WechatAPIClient, chat_id: ... method _check_git_installed (line 475) | def _check_git_installed(self): method _download_github_zip (line 489) | async def _download_github_zip(self, bot, chat_id, user_name, repo_nam... method _install_plugin_requirements (line 583) | async def _install_plugin_requirements(self, bot: WechatAPIClient, cha... method _handle_show (line 628) | async def _handle_show(self, bot: WechatAPIClient, chat_id: str, packa... method _handle_list (line 655) | async def _handle_list(self, bot: WechatAPIClient, chat_id: str): method _handle_uninstall (line 684) | async def _handle_uninstall(self, bot: WechatAPIClient, chat_id: str, ... method _send_help (line 712) | async def _send_help(self, bot: WechatAPIClient, chat_id: str): method _check_import (line 739) | async def _check_import(self, bot: WechatAPIClient, chat_id: str, pack... method on_disable (line 756) | async def on_disable(self): FILE: plugins/Dify/main.py class Dify (line 16) | class Dify(PluginBase): method __init__ (line 25) | def __init__(self): method handle_text (line 54) | async def handle_text(self, bot: WechatAPIClient, message: dict): method handle_at (line 75) | async def handle_at(self, bot: WechatAPIClient, message: dict): method handle_voice (line 89) | async def handle_voice(self, bot: WechatAPIClient, message: dict): method handle_image (line 116) | async def handle_image(self, bot: WechatAPIClient, message: dict): method handle_video (line 143) | async def handle_video(self, bot: WechatAPIClient, message: dict): method handle_file (line 170) | async def handle_file(self, bot: WechatAPIClient, message: dict): method dify (line 196) | async def dify(self, bot: WechatAPIClient, message: dict, query: str, ... method upload_file (line 268) | async def upload_file(self, user: str, file: bytes): method dify_handle_text (line 285) | async def dify_handle_text(self, bot: WechatAPIClient, message: dict, ... method download_file (line 303) | async def download_file(self, url: str) -> bytes: method dify_handle_image (line 308) | async def dify_handle_image(self, bot: WechatAPIClient, message: dict,... method dify_handle_audio (line 319) | async def dify_handle_audio(bot: WechatAPIClient, message: dict, audio... method dify_handle_error (line 324) | async def dify_handle_error(bot: WechatAPIClient, message: dict, task_... method handle_400 (line 336) | async def handle_400(bot: WechatAPIClient, message: dict, resp: aiohtt... method handle_500 (line 343) | async def handle_500(bot: WechatAPIClient, message: dict): method handle_other_status (line 348) | async def handle_other_status(bot: WechatAPIClient, message: dict, res... method hendle_exceptions (line 356) | async def hendle_exceptions(bot: WechatAPIClient, message: dict): method _check_point (line 363) | async def _check_point(self, bot: WechatAPIClient, message: dict) -> b... FILE: plugins/DouyinParser/main.py class DouyinParserError (line 16) | class DouyinParserError(Exception): class DouyinParser (line 21) | class DouyinParser(PluginBase): method __init__ (line 26) | def __init__(self): method _clean_response_data (line 48) | def _clean_response_data(self, data: Dict[str, Any]) -> Dict[str, Any]: method _clean_url (line 59) | def _clean_url(self, url: str) -> str: method _get_real_video_url (line 65) | async def _get_real_video_url(self, video_url: str) -> str: method _parse_douyin (line 128) | async def _parse_douyin(self, url: str) -> Dict[str, Any]: method _send_test_card (line 172) | async def _send_test_card(self, bot: WechatAPIClient, chat_id: str, se... method handle_douyin_links (line 220) | async def handle_douyin_links(self, bot: WechatAPIClient, message: dict): method async_init (line 303) | async def async_init(self): FILE: plugins/ExamplePlugin/main.py class ExamplePlugin (line 10) | class ExamplePlugin(PluginBase): method __init__ (line 16) | def __init__(self): method async_init (line 35) | async def async_init(self): method handle_text (line 39) | async def handle_text(self, bot: WechatAPIClient, message: dict): method handle_at (line 45) | async def handle_at(self, bot: WechatAPIClient, message: dict): method handle_voice (line 51) | async def handle_voice(self, bot: WechatAPIClient, message: dict): method handle_image (line 57) | async def handle_image(self, bot: WechatAPIClient, message: dict): method handle_video (line 63) | async def handle_video(self, bot: WechatAPIClient, message: dict): method handle_file (line 69) | async def handle_file(self, bot: WechatAPIClient, message: dict): method handle_quote (line 75) | async def handle_quote(self, bot: WechatAPIClient, message: dict): method handle_pat (line 81) | async def handle_pat(self, bot: WechatAPIClient, message: dict): method handle_emoji (line 87) | async def handle_emoji(self, bot: WechatAPIClient, message: dict): method periodic_task (line 93) | async def periodic_task(self, bot: WechatAPIClient): method daily_task (line 99) | async def daily_task(self, bot: WechatAPIClient): method new_year_task (line 105) | async def new_year_task(self, bot: WechatAPIClient): FILE: plugins/GetContact/main.py class GetContact (line 14) | class GetContact(PluginBase): method __init__ (line 19) | def __init__(self): method handle_text (line 37) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/GetWeather/main.py class GetWeather (line 11) | class GetWeather(PluginBase): method __init__ (line 19) | def __init__(self): method handle_text (line 32) | async def handle_text(self, bot: WechatAPIClient, message: dict): method compose_weather_message (line 93) | def compose_weather_message(country, adm1, adm2, now_weather_api_json,... FILE: plugins/Gomoku/main.py class Gomoku (line 14) | class Gomoku(PluginBase): method __init__ (line 19) | def __init__(self): method handle_text (line 43) | async def handle_text(self, bot: WechatAPIClient, message: dict): method create_game (line 59) | async def create_game(self, bot: WechatAPIClient, message: dict): method accept_game (line 112) | async def accept_game(self, bot: WechatAPIClient, message: dict): method play_game (line 186) | async def play_game(self, bot: WechatAPIClient, message: dict): method _generate_game_id (line 291) | def _generate_game_id(self) -> str: method _draw_board (line 299) | def _draw_board(self, game_id: str, highlight: tuple = None) -> str: method _check_winner (line 336) | def _check_winner(self, game_id: str) -> str: method _handle_invite_timeout (line 367) | async def _handle_invite_timeout(self, bot: WechatAPIClient, game_id: ... method _handle_turn_timeout (line 385) | async def _handle_turn_timeout(self, bot: WechatAPIClient, game_id: str, FILE: plugins/GoodMorning/main.py class GoodMorning (line 13) | class GoodMorning(PluginBase): method __init__ (line 21) | def __init__(self): method daily_task (line 32) | async def daily_task(self, bot: WechatAPIClient): FILE: plugins/GroupWelcome/main.py class GroupWelcome (line 12) | class GroupWelcome(PluginBase): method __init__ (line 17) | def __init__(self): method group_welcome (line 30) | async def group_welcome(self, bot: WechatAPIClient, message: dict): method _parse_member_info (line 92) | def _parse_member_info(root: ET.Element, link_name: str = "names") -> ... FILE: plugins/Leaderboard/main.py class Leaderboard (line 11) | class Leaderboard(PluginBase): method __init__ (line 16) | def __init__(self): method handle_text (line 31) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/LuckyDraw/main.py class LuckyDraw (line 12) | class LuckyDraw(PluginBase): method __init__ (line 17) | def __init__(self): method handle_text (line 44) | async def handle_text(self, bot: WechatAPIClient, message: dict): method make_message (line 129) | def make_message( FILE: plugins/ManagePlugin/main.py class ManagePlugin (line 12) | class ManagePlugin(PluginBase): method __init__ (line 17) | def __init__(self): method handle_text (line 37) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/Menu/main.py class Menu (line 8) | class Menu(PluginBase): method __init__ (line 13) | def __init__(self): method handle_text (line 33) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/Music/main.py class Music (line 10) | class Music(PluginBase): method __init__ (line 15) | def __init__(self): method handle_text (line 28) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/News/main.py class News (line 12) | class News(PluginBase): method __init__ (line 20) | def __init__(self): method handle_text (line 33) | async def handle_text(self, bot: WechatAPIClient, message: dict): method noon_news (line 72) | async def noon_news(self, bot: WechatAPIClient): method night_news (line 99) | async def night_news(self, bot: WechatAPIClient): FILE: plugins/PointTrade/main.py class PointTrade (line 10) | class PointTrade(PluginBase): method __init__ (line 15) | def __init__(self): method handle_text (line 30) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/QueryPoint/main.py class QueryPoint (line 9) | class QueryPoint(PluginBase): method __init__ (line 14) | def __init__(self): method handle_text (line 28) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/RandomMember/main.py class RandomMember (line 9) | class RandomMember(PluginBase): method __init__ (line 14) | def __init__(self): method handle_text (line 27) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/RandomPicture/main.py class RandomPicture (line 12) | class RandomPicture(PluginBase): method __init__ (line 17) | def __init__(self): method handle_text (line 29) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/RedPacket/main.py class RedPacket (line 18) | class RedPacket(PluginBase): method __init__ (line 23) | def __init__(self): method handle_text (line 42) | async def handle_text(self, bot: WechatAPIClient, message: dict): method send_red_packet (line 59) | async def send_red_packet(self, bot: WechatAPIClient, message: dict, c... method grab_red_packet (line 160) | async def grab_red_packet(self, bot: WechatAPIClient, message: dict, c... method check_expired_packets (line 198) | async def check_expired_packets(self, bot: WechatAPIClient): method _generate_captcha (line 218) | def _generate_captcha(): method _split_integer (line 226) | def _split_integer(num: int, count: int) -> list: FILE: plugins/SignIn/main.py class SignIn (line 13) | class SignIn(PluginBase): method __init__ (line 18) | def __init__(self): method _check_and_reset_count (line 45) | def _check_and_reset_count(self): method handle_text (line 52) | async def handle_text(self, bot: WechatAPIClient, message: dict): FILE: plugins/TencentLke/main.py class TencentLke (line 13) | class TencentLke(PluginBase): method __init__ (line 18) | def __init__(self): method handle_text (line 35) | async def handle_text(self, bot: WechatAPIClient, message: dict): method TencentLke (line 52) | async def TencentLke(self, bot: WechatAPIClient, message: dict, query:... FILE: plugins/UpdateQR/main.py class UpdateQR (line 12) | class UpdateQR(PluginBase): method __init__ (line 17) | def __init__(self): method on_text (line 21) | async def on_text(self, bot: WechatAPIClient, message: dict): method monday_update_qr (line 26) | async def monday_update_qr(self, bot: WechatAPIClient): method thursday_update_qr (line 30) | async def thursday_update_qr(self, bot: WechatAPIClient): method update_qr (line 34) | async def update_qr(bot: WechatAPIClient): FILE: plugins/Warthunder/main.py class Warthunder (line 21) | class Warthunder(PluginBase): method __init__ (line 30) | def __init__(self): method handle_text (line 45) | async def handle_text(self, bot: WechatAPIClient, message: dict): method generate_card (line 93) | async def generate_card(self, data: dict): method _generate_card (line 97) | def _generate_card(self, data: dict) -> bytes: method _download_avatar (line 352) | def _download_avatar(url: str) -> Image.Image: method _show_actual (line 373) | def _show_actual(pct, allvals): FILE: utils/decorators.py function schedule (line 11) | def schedule( function add_job_safe (line 42) | def add_job_safe(scheduler: AsyncIOScheduler, job_id: str, func: Callabl... function remove_job_safe (line 52) | def remove_job_safe(scheduler: AsyncIOScheduler, job_id: str): function on_text_message (line 60) | def on_text_message(priority=50): function on_image_message (line 77) | def on_image_message(priority=50): function on_voice_message (line 93) | def on_voice_message(priority=50): function on_emoji_message (line 109) | def on_emoji_message(priority=50): function on_file_message (line 125) | def on_file_message(priority=50): function on_quote_message (line 141) | def on_quote_message(priority=50): function on_video_message (line 157) | def on_video_message(priority=50): function on_pat_message (line 173) | def on_pat_message(priority=50): function on_at_message (line 189) | def on_at_message(priority=50): function on_system_message (line 205) | def on_system_message(priority=50): function on_other_message (line 221) | def on_other_message(priority=50): FILE: utils/event_manager.py class EventManager (line 5) | class EventManager: method bind_instance (line 9) | def bind_instance(cls, instance: object): method emit (line 24) | async def emit(cls, event_type: str, *args, **kwargs) -> None: method unbind_instance (line 45) | def unbind_instance(cls, instance: object): FILE: utils/plugin_base.py class PluginBase (line 8) | class PluginBase(ABC): method __init__ (line 16) | def __init__(self): method on_enable (line 20) | async def on_enable(self, bot=None): method on_disable (line 36) | async def on_disable(self): method async_init (line 45) | async def async_init(self): FILE: utils/plugin_manager.py class PluginManager (line 17) | class PluginManager(metaclass=Singleton): method __init__ (line 18) | def __init__(self): method set_bot (line 30) | def set_bot(self, bot: WechatAPIClient): method load_plugin (line 33) | async def load_plugin(self, plugin: Union[Type[PluginBase], str]) -> b... method _load_plugin_class (line 39) | async def _load_plugin_class(self, plugin_class: Type[PluginBase], method _load_plugin_name (line 89) | async def _load_plugin_name(self, plugin_name: str) -> bool: method load_plugins (line 119) | async def load_plugins(self, load_disabled: bool = True) -> Union[List... method unload_plugin (line 139) | async def unload_plugin(self, plugin_name: str) -> bool: method unload_plugins (line 163) | async def unload_plugins(self) -> tuple[List[str], List[str]]: method reload_plugin (line 174) | async def reload_plugin(self, plugin_name: str) -> bool: method reload_plugins (line 211) | async def reload_plugins(self) -> List[str]: method refresh_plugins (line 237) | async def refresh_plugins(self): method get_plugin_info (line 266) | def get_plugin_info(self, plugin_name: str = None) -> Union[dict, List... FILE: utils/singleton.py class Singleton (line 1) | class Singleton(type): method __call__ (line 4) | def __call__(cls, *args, **kwargs): method reset_instance (line 10) | def reset_instance(mcs, cls): method reset_all (line 16) | def reset_all(mcs): FILE: utils/xybot.py class XYBot (line 14) | class XYBot: method __init__ (line 15) | def __init__(self, bot_client: WechatAPIClient): method update_profile (line 35) | def update_profile(self, wxid: str, nickname: str, alias: str, phone: ... method process_message (line 42) | async def process_message(self, message: Dict[str, Any]): method process_text_message (line 98) | async def process_text_message(self, message: Dict[str, Any]): method process_image_message (line 170) | async def process_image_message(self, message: Dict[str, Any]): method process_voice_message (line 227) | async def process_voice_message(self, message: Dict[str, Any]): method process_xml_message (line 289) | async def process_xml_message(self, message: Dict[str, Any]): method process_quote_message (line 334) | async def process_quote_message(self, message: Dict[str, Any]): method process_video_message (line 440) | async def process_video_message(self, message): method process_file_message (line 482) | async def process_file_message(self, message: Dict[str, Any]): method process_system_message (line 519) | async def process_system_message(self, message: Dict[str, Any]): method process_pat_message (line 558) | async def process_pat_message(self, message: Dict[str, Any]): method ignore_check (line 597) | def ignore_check(self, FromWxid: str, SenderWxid: str):