mirror of
https://github.com/LC044/WeChatMsg
synced 2025-04-08 05:28:03 +08:00
255 lines
8.1 KiB
Python
255 lines
8.1 KiB
Python
#!/usr/bin/env python
|
||
# -*- coding: utf-8 -*-
|
||
|
||
"""
|
||
@Time : 2024/12/11 1:22
|
||
@Author : SiYuan
|
||
@Email : 863909694@qq.com
|
||
@File : MemoTrace-db_main.py
|
||
@Description :
|
||
"""
|
||
|
||
from abc import ABC, abstractmethod
|
||
|
||
import os
|
||
from datetime import date
|
||
from typing import List, Any, Tuple
|
||
|
||
from wxManager import MessageType
|
||
from wxManager.model.contact import Contact
|
||
|
||
|
||
class DataBaseInterface(ABC):
|
||
def __init__(self):
|
||
self.chatroom_members_map = {}
|
||
self.contacts_map = {}
|
||
|
||
def init_database(self, db_dir=''):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def close(self):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_session(self):
|
||
"""
|
||
获取聊天会话窗口,在聊天界面显示
|
||
@return:
|
||
"""
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages(
|
||
self,
|
||
username_: str,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_by_num(self, username, start_sort_seq, msg_num=20):
|
||
"""
|
||
获取小于start_sort_seq的msg_num个消息
|
||
@param username:
|
||
@param start_sort_seq:
|
||
@param msg_num:
|
||
@return: messages, 最后一条消息的start_sort_seq
|
||
"""
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_message_by_server_id(self, username, server_id):
|
||
"""
|
||
获取小于start_sort_seq的msg_num个消息
|
||
@param username:
|
||
@param server_id:
|
||
@return: messages, 最后一条消息的start_sort_seq
|
||
"""
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_group_by_day(
|
||
self,
|
||
username_: str,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
|
||
) -> dict:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_all(self, time_range=None):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_message_by_num(self, username_, local_id):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_by_type(
|
||
self,
|
||
username_,
|
||
type_: MessageType,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_by_keyword(self, username_, keyword, num=5, max_len=10, time_range=None, year_='all'):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_calendar(self, username_):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_by_days(
|
||
self,
|
||
username_,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_by_month(
|
||
self,
|
||
username_,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_by_hour(self, username_, time_range=None, year_='all'):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_first_time_of_message(self, username_=''):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_latest_time_of_message(self, username_='', time_range=None, year_='all'):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_messages_number(
|
||
self,
|
||
username_,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
) -> int:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_chatted_top_contacts(
|
||
self,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
contain_chatroom=False,
|
||
top_n=10
|
||
) -> list:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_send_messages_number_sum(
|
||
self,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
) -> int:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_send_messages_number_by_hour(
|
||
self,
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
) -> list:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_message_length(
|
||
self,
|
||
username_='',
|
||
time_range: Tuple[int | float | str | date, int | float | str | date] = None,
|
||
) -> int:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_emoji_url(self, md5: str, thumb: bool) -> str | bytes:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_emoji_URL(self, md5: str, thumb: bool):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_emoji_path(self, md5: str, output_path, thumb: bool = False, ) -> str:
|
||
"""
|
||
|
||
@param md5:
|
||
@param output_path:
|
||
@param thumb:
|
||
@return:
|
||
"""
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
# 图片、视频、文件
|
||
def get_file(self, md5: bytes | str) -> str:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_image(self, content, bytesExtra, up_dir="", md5=None, thumb=False, talker_username='') -> str:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_video(self, content, bytesExtra, md5=None, thumb=False):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
# 图片、视频、文件结束
|
||
|
||
# 语音
|
||
def get_audio(self, reserved0, output_path, open_im=False, filename=''):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_media_buffer(self, server_id, is_open_im=False) -> bytes:
|
||
pass
|
||
|
||
def get_audio_path(self, reserved0, output_path, filename=''):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_audio_text(self, msgSvrId):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def add_audio_txt(self, msgSvrId, text):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def update_audio_to_text(self):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
# 语音结束
|
||
|
||
def get_avatar_buffer(self, username) -> bytes:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_contacts(self) -> List[Contact]:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def set_remark(self, username: str, remark) -> bool:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def set_avatar_buffer(self, username, avatar_path):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_contact_by_username(self, wxid: str) -> Contact:
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_chatroom_members(self, chatroom_name) -> dict[Any, Contact] | Any:
|
||
"""
|
||
获取群成员(不包括企业微信联系人)
|
||
@param chatroom_name:
|
||
@return:
|
||
"""
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
# 联系人结束
|
||
def merge(self, db_paths):
|
||
"""
|
||
增量将db_path中的数据合入到数据库中,若存在冲突则以db_path中的数据为准
|
||
@param db_paths:
|
||
@return:
|
||
"""
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
def get_favorite_items(self, time_range):
|
||
raise ValueError("子类必须实现该方法")
|
||
|
||
|
||
class Context:
|
||
def __init__(self, interface_impl):
|
||
"""
|
||
初始化上下文,动态加载接口实现中的所有方法和属性。
|
||
:param interface_impl: 实现接口的具体实例
|
||
"""
|
||
if not isinstance(interface_impl, DataBaseInterface):
|
||
raise TypeError("interface_impl 必须是 DataBaseInterface 的子类实例")
|
||
|
||
# 动态绑定实现类的方法和属性
|
||
for name in dir(interface_impl):
|
||
# 仅绑定非私有且非特殊方法
|
||
if not name.startswith("_"):
|
||
attr = getattr(interface_impl, name)
|
||
setattr(self, name, attr)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
pass
|