diff --git a/nonebot_plugin_dialectlist/__init__.py b/nonebot_plugin_dialectlist/__init__.py index bc60cdb..2ce7ad9 100644 --- a/nonebot_plugin_dialectlist/__init__.py +++ b/nonebot_plugin_dialectlist/__init__.py @@ -56,7 +56,7 @@ from .utils import ( got_rank, msg_counter, persist_id2user_id, - parse_datetime + parse_datetime, ) __plugin_meta__ = PluginMetadata( @@ -81,18 +81,20 @@ class SameTime(ArparmaBehavior): if type is None and time: interface.behave_fail() + def wrapper(slot: Union[int, str], content: Optional[str]) -> str: if slot == "type" and content: return content return "" # pragma: no cover + rank_cmd = on_alconna( Alconna( "B话榜", Args["type?", ["今日", "昨日", "本周", "上周", "本月", "上月", "年度", "历史"]][ - "time?", str, - "group_id?", int - ], + "time?", + str, + ]["group_id?", str], behaviors=[SameTime()], ), aliases={"废话榜"}, @@ -110,6 +112,7 @@ rank_cmd.shortcut( }, ) + # 这段函数完全抄的词云 @rank_cmd.handle() async def _group_message( @@ -117,13 +120,15 @@ async def _group_message( session: Session = Depends(extract_session), type: Optional[str] = None, time: Optional[str] = None, - group_id: Optional[int] = None, + group_id: Optional[str] = None, ): dt = get_datetime_now_with_timezone() - if not group_id: - state["group_id"] = session.id2 + if group_id is None: + group_id = session.id2 + + state["group_id"] = group_id if not type: await rank_cmd.finish(__plugin_meta__.usage) @@ -191,15 +196,25 @@ async def _group_message( prompt="请输入你要查询的结束日期(如 2022-02-22)", parameterless=[Depends(parse_datetime("stop"))], ) +@rank_cmd.got("group_id", prompt="请输入你要查询的群号。") async def handle_rank( bot: Bot, event: Event, session: Session = Depends(extract_session), start: datetime = Arg(), stop: datetime = Arg(), + group_id: str = Arg(), ): + if group_id: + id = group_id + else: + id = session.id2 + + if not id: + await saa.Text("没有指定群哦").finish() + messages = await get_message_records( - session=session, + id2s=[id], id_type=SessionIdType.GROUP, include_bot_id=False, include_bot_type=False, @@ -240,10 +255,10 @@ async def handle_rank( bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT)) bar.add_xaxis(nicknames) - bar.add_yaxis("B话数量", [i[1] for i in rank]) # type: ignore - bar.render(str(get_cache_file("nonebot_plugin_dialectlist","cache.html"))) - with open(get_cache_file("nonebot_plugin_dialectlist","cache.html")) as f: + bar.add_yaxis("B话数量", [i[1] for i in rank]) # type: ignore + bar.render(str(get_cache_file("nonebot_plugin_dialectlist", "cache.html"))) + with open(get_cache_file("nonebot_plugin_dialectlist", "cache.html")) as f: a = f.read() - image = await html_to_pic(a,device_scale_factor=3.2) + image = await html_to_pic(a, device_scale_factor=3.2) - await (saa.Text(string)+saa.Image(image)).finish(reply=True) + await (saa.Text(string) + saa.Image(image)).finish(reply=True) diff --git a/nonebot_plugin_dialectlist/render.py b/nonebot_plugin_dialectlist/render.py index 3946f32..70214e1 100644 --- a/nonebot_plugin_dialectlist/render.py +++ b/nonebot_plugin_dialectlist/render.py @@ -1 +1 @@ -# TODO 更好的图片渲染,支持自定义模板渲染。 \ No newline at end of file +# TODO 更好的图片渲染,支持自定义模板渲染。 diff --git a/nonebot_plugin_dialectlist/source/img/background.jpg b/nonebot_plugin_dialectlist/source/img/background.jpg new file mode 100644 index 0000000..c49a799 Binary files /dev/null and b/nonebot_plugin_dialectlist/source/img/background.jpg differ diff --git a/nonebot_plugin_dialectlist/source/rank.html b/nonebot_plugin_dialectlist/source/rank.html new file mode 100644 index 0000000..269a757 --- /dev/null +++ b/nonebot_plugin_dialectlist/source/rank.html @@ -0,0 +1,61 @@ + + + + + + 在 title 里夹一点私货应该不会被发现吧?——ddl 真是太厉害啦! + + + + +
+ +
+
+

+ hhhhhhh +

+
+
+

nicknames:你好

+
+ + \ No newline at end of file diff --git a/nonebot_plugin_dialectlist/storage.py b/nonebot_plugin_dialectlist/storage.py index 288968b..31da7d0 100644 --- a/nonebot_plugin_dialectlist/storage.py +++ b/nonebot_plugin_dialectlist/storage.py @@ -1 +1 @@ -# TODO 使用计数缓存进行数据库查询优化,避免一次性查询过多消息导致内存爆炸。 \ No newline at end of file +# TODO 使用计数缓存进行数据库查询优化,避免一次性查询过多消息导致内存爆炸。 diff --git a/nonebot_plugin_dialectlist/time.py b/nonebot_plugin_dialectlist/time.py index 86e4c40..148e153 100644 --- a/nonebot_plugin_dialectlist/time.py +++ b/nonebot_plugin_dialectlist/time.py @@ -1 +1 @@ -# TODO 时间处理模块,用于处理时间相关操作。 \ No newline at end of file +# TODO 时间处理模块,用于处理时间相关操作。 diff --git a/nonebot_plugin_dialectlist/utils.py b/nonebot_plugin_dialectlist/utils.py index 2907243..8827224 100644 --- a/nonebot_plugin_dialectlist/utils.py +++ b/nonebot_plugin_dialectlist/utils.py @@ -19,9 +19,9 @@ from nonebot_plugin_chatrecorder import MessageRecord from nonebot_plugin_alconna import AlconnaMatcher - from .config import plugin_config + def parse_datetime(key: str): """解析数字,并将结果存入 state 中""" @@ -117,6 +117,18 @@ async def persist_id2user_id(ids: List) -> List[str]: return [i.id1 for i in records] +async def user_id2persist_id(id: str) -> int: + whereclause: List[ColumnElement[bool]] = [] + whereclause.append(or_(*[SessionModel.id2 == id])) + statement = ( + select(SessionModel).where(*whereclause) + # .join(SessionModel, SessionModel.id == MessageRecord.session_persist_id) + ) + async with get_session() as db_session: + records = (await db_session.scalars(statement)).all() + return records[0].id + + def msg_counter(msg_list: List[MessageRecord]) -> Dict[str, int]: """### 计算每个人的消息量 @@ -132,13 +144,12 @@ def msg_counter(msg_list: List[MessageRecord]) -> Dict[str, int]: logger.info("wow , there are {} msgs to count !!!".format(msg_len)) for i in msg_list: - logger.debug(i.session_persist_id) try: lst[str(i.session_persist_id)] += 1 except KeyError: lst[str(i.session_persist_id)] = 1 - logger.debug(lst) + logger.debug(f"finish counting, result is {lst}") return lst