From d19d65f75e053c68ca88fb4e3591d1f8aedf1037 Mon Sep 17 00:00:00 2001 From: XuChenXu <91937041+ChenXu233@users.noreply.github.com> Date: Sun, 20 Apr 2025 11:03:58 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nonebot_plugin_dialectlist/__init__.py | 537 +++++++++--------- .../506cbd6bf1ec_init_dialectlist.py | 78 --- .../migrations/873ad3421460_.py | 61 -- .../fb88e4d27eb8_update_dialectlist.py | 47 ++ nonebot_plugin_dialectlist/utils.py | 393 ++++++------- pdm.lock | 438 +------------- 6 files changed, 521 insertions(+), 1033 deletions(-) delete mode 100644 nonebot_plugin_dialectlist/migrations/506cbd6bf1ec_init_dialectlist.py delete mode 100644 nonebot_plugin_dialectlist/migrations/873ad3421460_.py create mode 100644 nonebot_plugin_dialectlist/migrations/fb88e4d27eb8_update_dialectlist.py diff --git a/nonebot_plugin_dialectlist/__init__.py b/nonebot_plugin_dialectlist/__init__.py index 3bfcfa2..245379c 100644 --- a/nonebot_plugin_dialectlist/__init__.py +++ b/nonebot_plugin_dialectlist/__init__.py @@ -1,12 +1,12 @@ from nonebot import require -require("nonebot_plugin_chatrecorder") -require("nonebot_plugin_apscheduler") -require("nonebot_plugin_htmlrender") -require("nonebot_plugin_userinfo") -require("nonebot_plugin_alconna") -require("nonebot_plugin_uninfo") -require("nonebot_plugin_cesaa") +require('nonebot_plugin_chatrecorder') +require('nonebot_plugin_apscheduler') +require('nonebot_plugin_htmlrender') +require('nonebot_plugin_userinfo') +require('nonebot_plugin_alconna') +require('nonebot_plugin_uninfo') +require('nonebot_plugin_cesaa') import re import time as t @@ -22,338 +22,351 @@ from nonebot.log import logger from nonebot.params import Arg, Depends from nonebot.plugin import PluginMetadata, inherit_supported_adapters from nonebot.typing import T_State -from nonebot_plugin_alconna import Alconna, Args, At, Field, Match, Option, on_alconna +from nonebot_plugin_alconna import ( + Alconna, + Args, + At, + Field, + Match, + Option, + on_alconna, +) from nonebot_plugin_chatrecorder import get_message_records -from nonebot_plugin_session import SessionIdType, extract_session from nonebot_plugin_uninfo import Session, Uninfo, get_session from .config import Config, plugin_config from .storage import build_cache, get_cache from .time import ( - get_datetime_fromisoformat_with_timezone, - get_datetime_now_with_timezone, - parse_datetime, + get_datetime_fromisoformat_with_timezone, + get_datetime_now_with_timezone, + parse_datetime, ) from .usage import __usage__ from .utils import ( - get_rank_image, - get_user_infos, - got_rank, - msg_counter, - persist_id2user_id, + get_rank_image, + get_user_infos, + got_rank, + msg_counter, + persist_id2user_id, ) __plugin_meta__ = PluginMetadata( - name="B话排行榜", - description="调查群U的B话数量,以一定的顺序排序后排序出来。", - usage=__usage__, - homepage="https://github.com/ChenXu233/nonebot_plugin_dialectlist", - type="application", - supported_adapters=inherit_supported_adapters( - "nonebot_plugin_chatrecorder", - "nonebot_plugin_saa", - "nonebot_plugin_alconna", - ), - config=Config, + name='B话排行榜', + description='调查群U的B话数量,以一定的顺序排序后排序出来。', + usage=__usage__, + homepage='https://github.com/ChenXu233/nonebot_plugin_dialectlist', + type='application', + supported_adapters=inherit_supported_adapters( + 'nonebot_plugin_chatrecorder', + 'nonebot_plugin_saa', + 'nonebot_plugin_alconna', + ), + config=Config, ) # 抄的词云,不过真的很适合B话榜。 class SameTime(ArparmaBehavior): - def operate(self, interface: Arparma): - type = interface.query("type") - time = interface.query("time") - if type is None and time: - interface.behave_fail() + def operate(self, interface: Arparma): + type = interface.query('type') + time = interface.query('time') + if type is None and time: + interface.behave_fail() def wrapper(slot: Union[int, str], content: Optional[str], context) -> str: - if slot == "type" and content: - return content - return "" # pragma: no cover + if slot == 'type' and content: + return content + return '' # pragma: no cover -build_cache_cmd = on_command("build_cache", aliases={"重建缓存"}, block=True) +build_cache_cmd = on_command('build_cache', aliases={'重建缓存'}, block=True) @build_cache_cmd.handle() async def _build_cache(bot: Bot, event: Event): - await saa.Text("正在重建缓存,请稍等。").send(reply=True) - await build_cache() - await saa.Text("重建缓存完成。").send(reply=True) + await saa.Text('正在重建缓存,请稍等。').send(reply=True) + await build_cache() + await saa.Text('重建缓存完成。').send(reply=True) b_cmd = on_alconna( - Alconna( - "看看B话", - Args["at", [str, At], Field(completion=lambda: "请想要查询的人的QQ号")], - Option("-g|--group_id", Args["group_id?", str]), - Option("-k|--keyword", Args["keyword?", str]), - ), - aliases={"kkb"}, - use_cmd_start=True, + Alconna( + '看看B话', + Args['at', [str, At], Field(completion=lambda: '请想要查询的人的QQ号')], + Option('-g|--group_id', Args['group_id?', str]), + Option('-k|--keyword', Args['keyword?', str]), + ), + aliases={'kkb'}, + use_cmd_start=True, ) @b_cmd.handle() async def handle_b_cmd( - at: Match[str | At], - group_id: Match[str], - keyword: Match[str], - uninfo: Uninfo, - session: Session = Depends(get_session), + at: Match[str | At], + group_id: Match[str], + keyword: Match[str], + uninfo: Uninfo, + session: Session = Depends(get_session), ): - id = at.result - if isinstance(id, At): - id = id.target - if group_id.available: - gid = group_id.result - else: - gid = session.scene.id + id = at.result + if isinstance(id, At): + id = id.target + if group_id.available: + gid = group_id.result + else: + gid = session.scene.id - if not gid: - await b_cmd.finish("请指定群号。") + if not gid: + await b_cmd.finish('请指定群号。') - if keyword.available: - keywords = keyword.result - else: - keywords = None + if keyword.available: + keywords = keyword.result + else: + keywords = None - messages = await get_message_records(scene_ids=[gid], user_ids=[id]) + messages = await get_message_records( + scene_ids=[gid], + user_ids=[id], + types=['message'], # 排除机器人自己发的消息 + exclude_user_ids=plugin_config.excluded_people, + ) + d = msg_counter(messages, keywords) + rank = got_rank(d) + if not rank: + await b_cmd.finish( + f'该用户在群“{uninfo.scene.name}”关于“{keyword}”的B话数量为0。' + ) - messages = await get_message_records( - scene_ids=[gid], - user_ids=[id], - types=["message"], # 排除机器人自己发的消息 - exclude_user_ids=plugin_config.excluded_people, - ) - d = msg_counter(messages, keywords) - rank = got_rank(d) - if not rank: - await b_cmd.finish( - f"该用户在群“{uninfo.scene.name}”关于“{keyword}”的B话数量为0。" - ) - - await saa.Text( - f"该用户在群“{uninfo.scene.name}”关于“{keyword}”的B话数量为{rank[0][1]}。" - ).send(reply=True) + await saa.Text( + f'该用户在群“{uninfo.scene.name}”关于“{keyword}”的B话数量为{rank[0][1]}。' + ).send(reply=True) rank_cmd = on_alconna( - Alconna( - "B话榜", - Args[ - "type?", - ["今日", "昨日", "本周", "上周", "本月", "上月", "年度", "历史"], - ][ - "time?", - str, - ], - Option("-g|--group_id", Args["group_id?", str]), - Option("-k|--keyword", Args["keyword?", str]), - behaviors=[SameTime()], - ), - aliases={"废话榜"}, - use_cmd_start=True, - block=True, + Alconna( + 'B话榜', + Args[ + 'type?', + ['今日', '昨日', '本周', '上周', '本月', '上月', '年度', '历史'], + ][ + 'time?', + str, + ], + Option('-g|--group_id', Args['group_id?', str]), + Option('-k|--keyword', Args['keyword?', str]), + behaviors=[SameTime()], + ), + aliases={'废话榜'}, + use_cmd_start=True, + block=True, ) rank_cmd.shortcut( - r"(?P今日|昨日|本周|上周|本月|上月|年度|历史)B话榜", - { - "prefix": True, - "command": "B话榜", - "wrapper": wrapper, - "args": ["{type}"], - }, + r'(?P今日|昨日|本周|上周|本月|上月|年度|历史)B话榜', + { + 'prefix': True, + 'command': 'B话榜', + 'wrapper': wrapper, + 'args': ['{type}'], + }, ) rank_cmd.shortcut( - r"(?P今日|昨日|本周|上周|本月|上月|年度|历史)废话榜", - { - "prefix": True, - "command": "废话榜", - "wrapper": wrapper, - "args": ["{type}"], - }, + r'(?P今日|昨日|本周|上周|本月|上月|年度|历史)废话榜', + { + 'prefix': True, + 'command': '废话榜', + 'wrapper': wrapper, + 'args': ['{type}'], + }, ) # 这段函数完全抄的词云 @rank_cmd.handle() async def _group_message( - state: T_State, - session: Session = Depends(extract_session), - type: Optional[str] = None, - time: Optional[str] = None, - group_id: Optional[str] = None, - keyword: Optional[str] = None, + state: T_State, + session: Session = Depends(get_session), + type: Optional[str] = None, + time: Optional[str] = None, + group_id: Optional[str] = None, + keyword: Optional[str] = None, ): - t1 = t.time() - state["t1"] = t1 - dt = get_datetime_now_with_timezone() + t1 = t.time() + state['t1'] = t1 + dt = get_datetime_now_with_timezone() - if not group_id: - group_id = session.scene.id - logger.debug(f"session id2: {group_id}") - if group_id: - state["group_id"] = group_id + if not group_id: + group_id = session.scene.id + logger.debug(f'session id2: {group_id}') + if group_id: + state['group_id'] = group_id - state["keyword"] = keyword + state['keyword'] = keyword - if not type: - await rank_cmd.finish(__plugin_meta__.usage) + if not type: + await rank_cmd.finish(__plugin_meta__.usage) - dt = get_datetime_now_with_timezone() + dt = get_datetime_now_with_timezone() - if type == "今日": - state["start"] = dt.replace(hour=0, minute=0, second=0, microsecond=0) - state["stop"] = dt - elif type == "昨日": - state["stop"] = dt.replace(hour=0, minute=0, second=0, microsecond=0) - state["start"] = state["stop"] - timedelta(days=1) - elif type == "本周": - state["start"] = dt.replace( - hour=0, minute=0, second=0, microsecond=0 - ) - timedelta(days=dt.weekday()) - state["stop"] = dt - elif type == "上周": - state["stop"] = dt.replace( - hour=0, minute=0, second=0, microsecond=0 - ) - timedelta(days=dt.weekday()) - state["start"] = state["stop"] - timedelta(days=7) - elif type == "本月": - state["start"] = dt.replace(day=1, hour=0, minute=0, second=0, microsecond=0) - state["stop"] = dt - elif type == "上月": - state["stop"] = dt.replace( - day=1, hour=0, minute=0, second=0, microsecond=0 - ) - timedelta(microseconds=1) - state["start"] = state["stop"].replace( - day=1, hour=0, minute=0, second=0, microsecond=0 - ) - elif type == "年度": - state["start"] = dt.replace( - month=1, day=1, hour=0, minute=0, second=0, microsecond=0 - ) - state["stop"] = dt - elif type == "历史": - if time: - plaintext = time - if match := re.match(r"^(.+?)(?:~(.+))?$", plaintext): - start = match[1] - stop = match[2] - try: - state["start"] = get_datetime_fromisoformat_with_timezone(start) - if stop: - state["stop"] = get_datetime_fromisoformat_with_timezone(stop) - else: - # 如果没有指定结束日期,则认为是所给日期的当天的词云 - state["start"] = state["start"].replace( - hour=0, minute=0, second=0, microsecond=0 - ) - state["stop"] = state["start"] + timedelta(days=1) - except ValueError: - await rank_cmd.finish("请输入正确的日期,不然我没法理解呢!") + if type == '今日': + state['start'] = dt.replace(hour=0, minute=0, second=0, microsecond=0) + state['stop'] = dt + elif type == '昨日': + state['stop'] = dt.replace(hour=0, minute=0, second=0, microsecond=0) + state['start'] = state['stop'] - timedelta(days=1) + elif type == '本周': + state['start'] = dt.replace( + hour=0, minute=0, second=0, microsecond=0 + ) - timedelta(days=dt.weekday()) + state['stop'] = dt + elif type == '上周': + state['stop'] = dt.replace( + hour=0, minute=0, second=0, microsecond=0 + ) - timedelta(days=dt.weekday()) + state['start'] = state['stop'] - timedelta(days=7) + elif type == '本月': + state['start'] = dt.replace( + day=1, hour=0, minute=0, second=0, microsecond=0 + ) + state['stop'] = dt + elif type == '上月': + state['stop'] = dt.replace( + day=1, hour=0, minute=0, second=0, microsecond=0 + ) - timedelta(microseconds=1) + state['start'] = state['stop'].replace( + day=1, hour=0, minute=0, second=0, microsecond=0 + ) + elif type == '年度': + state['start'] = dt.replace( + month=1, day=1, hour=0, minute=0, second=0, microsecond=0 + ) + state['stop'] = dt + elif type == '历史': + if time: + plaintext = time + if match := re.match(r'^(.+?)(?:~(.+))?$', plaintext): + start = match[1] + stop = match[2] + try: + state['start'] = get_datetime_fromisoformat_with_timezone( + start + ) + if stop: + state['stop'] = ( + get_datetime_fromisoformat_with_timezone(stop) + ) + else: + # 如果没有指定结束日期,则认为是所给日期的当天的词云 + state['start'] = state['start'].replace( + hour=0, minute=0, second=0, microsecond=0 + ) + state['stop'] = state['start'] + timedelta(days=1) + except ValueError: + await rank_cmd.finish( + '请输入正确的日期,不然我没法理解呢!' + ) @rank_cmd.got( - "start", - prompt="请输入你要查询的起始日期(如 2022-01-01)", - parameterless=[Depends(parse_datetime("start"))], + 'start', + prompt='请输入你要查询的起始日期(如 2022-01-01)', + parameterless=[Depends(parse_datetime('start'))], ) @rank_cmd.got( - "stop", - prompt="请输入你要查询的结束日期(如 2022-02-22)", - parameterless=[Depends(parse_datetime("stop"))], + 'stop', + prompt='请输入你要查询的结束日期(如 2022-02-22)', + parameterless=[Depends(parse_datetime('stop'))], ) -@rank_cmd.got("group_id", prompt="请输入你要查询的群号。") +@rank_cmd.got('group_id', prompt='请输入你要查询的群号。') async def handle_rank( - state: T_State, - bot: Bot, - event: Event, - session: Session = Depends(extract_session), - start: datetime = Arg(), - stop: datetime = Arg(), + state: T_State, + bot: Bot, + event: Event, + session: Session = Depends(get_session), + start: datetime = Arg(), + stop: datetime = Arg(), ): - if id := state["group_id"]: - id = str(id) - logger.debug(f"group_id: {id}") - else: - id = session.scene.id - logger.debug(f"group_id: {id}") + if id := state['group_id']: + id = str(id) + logger.debug(f'group_id: {id}') + else: + id = session.scene.id + logger.debug(f'group_id: {id}') - if not id: - await saa.Text("没有指定群哦").finish() + if not id: + await saa.Text('没有指定群哦').finish() - keyword = state["keyword"] + keyword = state['keyword'] - if plugin_config.counting_cache: - if keyword: - await saa.Text("已开启缓存~缓存不支持关键词查询哦").finish() - t1 = t.time() - raw_rank = await get_cache(start, stop, id) - logger.debug(f"获取计数消息花费时间:{t.time() - t1}") - else: - t1 = t.time() - messages = await get_message_records( - scene_ids=[id], - types=["message"], # 排除机器人自己发的消息 - time_start=start, - time_stop=stop, - exclude_user_ids=plugin_config.excluded_people, - ) - raw_rank = msg_counter(messages, keyword) - logger.debug(f"获取计数消息花费时间:{t.time() - t1}") + if plugin_config.counting_cache: + if keyword: + await saa.Text('已开启缓存~缓存不支持关键词查询哦').finish() + t1 = t.time() + raw_rank = await get_cache(start, stop, id) + logger.debug(f'获取计数消息花费时间:{t.time() - t1}') + else: + t1 = t.time() + messages = await get_message_records( + scene_ids=[id], + types=['message'], # 排除机器人自己发的消息 + time_start=start, + time_stop=stop, + exclude_user_ids=plugin_config.excluded_people, + ) + raw_rank = msg_counter(messages, keyword) + logger.debug(f'获取计数消息花费时间:{t.time() - t1}') - if not raw_rank: - await saa.Text( - "没有获取到排行榜数据哦,请确认时间范围和群号是否正确或者关键词是否存在~" - ).finish() + if not raw_rank: + await saa.Text( + '没有获取到排行榜数据哦,请确认时间范围和群号是否正确或者关键词是否存在~' + ).finish() - rank = got_rank(raw_rank) - ids = await persist_id2user_id([int(i[0]) for i in rank]) - for i in range(len(rank)): - rank[i][0] = str(ids[i]) - logger.debug(rank[i]) + rank = got_rank(raw_rank) + ids = await persist_id2user_id([int(i[0]) for i in rank]) + for i in range(len(rank)): + rank[i][0] = str(ids[i]) + logger.debug(rank[i]) - t1 = t.time() - rank2 = await get_user_infos(bot, event, rank) - logger.debug(f"获取用户信息花费时间:{t.time() - t1}") + t1 = t.time() + rank2 = await get_user_infos(bot, event, rank) + logger.debug(f'获取用户信息花费时间:{t.time() - t1}') - string: str = "" - if plugin_config.show_text_rank: - if keyword: - string += f"关于{keyword}的话痨榜结果:\n" - else: - string += "话痨榜:\n" + string: str = '' + if plugin_config.show_text_rank: + if keyword: + string += f'关于{keyword}的话痨榜结果:\n' + else: + string += '话痨榜:\n' - for i in rank2: - logger.debug(i.user_name) - for i in range(len(rank2)): - str_example = plugin_config.string_format.format( - index=rank2[i].user_index, - nickname=rank2[i].user_nickname, - chatdatanum=rank2[i].user_bnum, - ) - string += str_example + for i in rank2: + logger.debug(i.user_name) + for i in range(len(rank2)): + str_example = plugin_config.string_format.format( + index=rank2[i].user_index, + nickname=rank2[i].user_nickname, + chatdatanum=rank2[i].user_bnum, + ) + string += str_example - msg = saa.Text(string) + msg = saa.Text(string) - if plugin_config.visualization: - t1 = t.time() - image = await get_rank_image(rank2) - msg += saa.Image(image) - logger.debug(f"群聊消息渲染图片花费时间:{t.time() - t1}") + if plugin_config.visualization: + t1 = t.time() + image = await get_rank_image(rank2) + msg += saa.Image(image) + logger.debug(f'群聊消息渲染图片花费时间:{t.time() - t1}') - if plugin_config.suffix: - timecost = t.time() - state["t1"] - suffix = saa.Text(plugin_config.string_suffix.format(timecost=timecost)) - msg += suffix - if not msg: - await saa.Text("你把可视化都关了哪来的排行榜?").finish() + if plugin_config.suffix: + timecost = t.time() - state['t1'] + suffix = saa.Text(plugin_config.string_suffix.format(timecost=timecost)) + msg += suffix + if not msg: + await saa.Text('你把可视化都关了哪来的排行榜?').finish() - if plugin_config.aggregate_transmission: - await saa.AggregatedMessageFactory([msg]).finish() - else: - await msg.finish(reply=True) + if plugin_config.aggregate_transmission: + await saa.AggregatedMessageFactory([msg]).finish() + else: + await msg.finish(reply=True) diff --git a/nonebot_plugin_dialectlist/migrations/506cbd6bf1ec_init_dialectlist.py b/nonebot_plugin_dialectlist/migrations/506cbd6bf1ec_init_dialectlist.py deleted file mode 100644 index 2744c4c..0000000 --- a/nonebot_plugin_dialectlist/migrations/506cbd6bf1ec_init_dialectlist.py +++ /dev/null @@ -1,78 +0,0 @@ -"""init dialectlist - -迁移 ID: 506cbd6bf1ec -父迁移: f7a853b48636 -创建时间: 2025-04-20 08:35:53.637761 - -""" - -from __future__ import annotations - -from collections.abc import Sequence - -import sqlalchemy as sa -from alembic import op - -revision: str = "506cbd6bf1ec" -down_revision: str | Sequence[str] | None = "f7a853b48636" -branch_labels: str | Sequence[str] | None = None -depends_on: str | Sequence[str] | None = None - - -def upgrade(name: str = "") -> None: - if name: - return - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "nonebot_plugin_dialectlist_messagecountcache", - sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), - sa.Column("time", sa.DateTime(), nullable=False), - sa.Column("session_id", sa.Integer(), nullable=False), - sa.Column("session_bnum", sa.Integer(), nullable=False), - sa.PrimaryKeyConstraint( - "id", name=op.f("pk_nonebot_plugin_dialectlist_messagecountcache") - ), - info={"bind_key": "nonebot_plugin_dialectlist"}, - ) - with op.batch_alter_table( - "nonebot_plugin_dialectlist_messagecountcache", schema=None - ) as batch_op: - batch_op.create_index( - batch_op.f("ix_nonebot_plugin_dialectlist_messagecountcache_session_id"), - ["session_id"], - unique=False, - ) - - with op.batch_alter_table("model_messagecountcache", schema=None) as batch_op: - batch_op.drop_index("ix_model_messagecountcache_session_id") - - op.drop_table("model_messagecountcache") - # ### end Alembic commands ### - - -def downgrade(name: str = "") -> None: - if name: - return - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "model_messagecountcache", - sa.Column("id", sa.INTEGER(), nullable=False), - sa.Column("time", sa.DATETIME(), nullable=False), - sa.Column("session_id", sa.INTEGER(), nullable=False), - sa.Column("session_bnum", sa.INTEGER(), nullable=False), - sa.PrimaryKeyConstraint("id", name="pk_model_messagecountcache"), - ) - with op.batch_alter_table("model_messagecountcache", schema=None) as batch_op: - batch_op.create_index( - "ix_model_messagecountcache_session_id", ["session_id"], unique=False - ) - - with op.batch_alter_table( - "nonebot_plugin_dialectlist_messagecountcache", schema=None - ) as batch_op: - batch_op.drop_index( - batch_op.f("ix_nonebot_plugin_dialectlist_messagecountcache_session_id") - ) - - op.drop_table("nonebot_plugin_dialectlist_messagecountcache") - # ### end Alembic commands ### diff --git a/nonebot_plugin_dialectlist/migrations/873ad3421460_.py b/nonebot_plugin_dialectlist/migrations/873ad3421460_.py deleted file mode 100644 index f10d8c9..0000000 --- a/nonebot_plugin_dialectlist/migrations/873ad3421460_.py +++ /dev/null @@ -1,61 +0,0 @@ -"""empty message - -迁移 ID: 873ad3421460 -父迁移: -创建时间: 2025-03-29 14:30:11.910461 - -""" - -from __future__ import annotations - -from collections.abc import Sequence - -import sqlalchemy as sa -from alembic import op - -revision: str = "873ad3421460" -down_revision: str | Sequence[str] | None = None -branch_labels: str | Sequence[str] | None = ("nonebot_plugin_dialectlist",) -depends_on: str | Sequence[str] | None = None - - -def upgrade(name: str = "") -> None: - if name: - return - # ### commands auto generated by Alembic - please adjust! ### - op.create_table( - "nonebot_plugin_dialectlist_messagecountcache", - sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), - sa.Column("time", sa.DateTime(), nullable=False), - sa.Column("session_id", sa.Integer(), nullable=False), - sa.Column("session_bnum", sa.Integer(), nullable=False), - sa.PrimaryKeyConstraint( - "id", name=op.f("pk_nonebot_plugin_dialectlist_messagecountcache") - ), - info={"bind_key": "nonebot_plugin_dialectlist"}, - ) - with op.batch_alter_table( - "nonebot_plugin_dialectlist_messagecountcache", schema=None - ) as batch_op: - batch_op.create_index( - batch_op.f("ix_nonebot_plugin_dialectlist_messagecountcache_session_id"), - ["session_id"], - unique=False, - ) - - # ### end Alembic commands ### - - -def downgrade(name: str = "") -> None: - if name: - return - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table( - "nonebot_plugin_dialectlist_messagecountcache", schema=None - ) as batch_op: - batch_op.drop_index( - batch_op.f("ix_nonebot_plugin_dialectlist_messagecountcache_session_id") - ) - - op.drop_table("nonebot_plugin_dialectlist_messagecountcache") - # ### end Alembic commands ### diff --git a/nonebot_plugin_dialectlist/migrations/fb88e4d27eb8_update_dialectlist.py b/nonebot_plugin_dialectlist/migrations/fb88e4d27eb8_update_dialectlist.py new file mode 100644 index 0000000..b192cf0 --- /dev/null +++ b/nonebot_plugin_dialectlist/migrations/fb88e4d27eb8_update_dialectlist.py @@ -0,0 +1,47 @@ +"""update dialectlist + +迁移 ID: fb88e4d27eb8 +父迁移: 60daff81fcdc +创建时间: 2025-04-20 11:00:50.931679 + +""" +from __future__ import annotations + +from collections.abc import Sequence + +from alembic import op +import sqlalchemy as sa + + +revision: str = 'fb88e4d27eb8' +down_revision: str | Sequence[str] | None = '60daff81fcdc' +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +def upgrade(name: str = "") -> None: + if name: + return + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('sessionmodel', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('bot_id', sa.String(length=64), nullable=False), + sa.Column('bot_type', sa.String(length=32), nullable=False), + sa.Column('platform', sa.String(length=32), nullable=False), + sa.Column('level', sa.Integer(), nullable=False), + sa.Column('id1', sa.String(length=64), nullable=False), + sa.Column('id2', sa.String(length=64), nullable=False), + sa.Column('id3', sa.String(length=64), nullable=False), + sa.PrimaryKeyConstraint('id', name=op.f('pk_sessionmodel')), + sa.UniqueConstraint('bot_id', 'bot_type', 'platform', 'level', 'id1', 'id2', 'id3', name='unique_session'), + info={'bind_key': ''} + ) + # ### end Alembic commands ### + + +def downgrade(name: str = "") -> None: + if name: + return + # ### commands auto generated by Alembic - please adjust! ### + op.drop_table('sessionmodel') + # ### end Alembic commands ### diff --git a/nonebot_plugin_dialectlist/utils.py b/nonebot_plugin_dialectlist/utils.py index acf34c2..f59185b 100644 --- a/nonebot_plugin_dialectlist/utils.py +++ b/nonebot_plugin_dialectlist/utils.py @@ -14,269 +14,250 @@ from nonebot_plugin_chatrecorder import MessageRecord from nonebot_plugin_htmlrender import template_to_pic from nonebot_plugin_localstore import get_cache_dir from nonebot_plugin_orm import get_session -from nonebot_plugin_session import Session, SessionLevel, extract_session -from nonebot_plugin_session_orm import SessionModel from nonebot_plugin_userinfo import UserInfo, get_user_info +from nonebot_plugin_uninfo import Session +from nonebot_plugin_uninfo.model import SceneType +from nonebot_plugin_uninfo.orm import SessionModel, UserModel +from nonebot_plugin_uninfo import get_session as extract_session from nonebot_plugin_userinfo.exception import NetworkError from sqlalchemy import or_, select -from sqlalchemy.sql import ColumnElement from .config import plugin_config from .model import UserRankInfo -cache_path = get_cache_dir("nonebot_plugin_dialectlist") +cache_path = get_cache_dir('nonebot_plugin_dialectlist') -async def ensure_group(matcher: Matcher, session: Session = Depends(extract_session)): - """确保在群组中使用""" - if session.level not in [SessionLevel.LEVEL2, SessionLevel.LEVEL3]: - await matcher.finish("请在群组中使用!") +async def ensure_group( + matcher: Matcher, session: Session = Depends(extract_session) +): + """确保在群组中使用""" + if session.scene.type not in [SceneType.GROUP, SceneType.GUILD]: + await matcher.finish('请在群组中使用!') async def persist_id2user_id(ids: List) -> List[str]: - user_ids = [] - async with get_session() as db_session: - for i in ids: - user_id = ( - await db_session.scalar( - select(SessionModel).where(or_(*[SessionModel.id == i])) - ) - ).id1 # type: ignore - user_ids.append(user_id) - return user_ids + user_ids = [] + user_persist_ids = [] + async with get_session() as db_session: + for i in ids: + session = await db_session.scalar( + select(SessionModel).where(or_(*[SessionModel.id == i])) + ) + if session is not None: + user_persist_id = session.user_persist_id + user_persist_ids.append(user_persist_id) + for i in user_persist_ids: + user = await db_session.scalar( + select(UserModel).where(UserModel.id == i) + ) + if user is not None: + user_ids.append(user.user_id) - -async def user_id2persist_id(ids: List[str]) -> List[int]: - whereclause: List[ColumnElement[bool]] = [] - whereclause.append(or_(*[SessionModel.id1 == id for id in ids])) - 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 [i.id for i in records] - - -async def group_id2persist_id(ids: List[str]) -> List[int]: - persist_ids = [] - async with get_session() as db_session: - for i in ids: - persist_id = ( - await db_session.scalar( - select(SessionModel).where(or_(*[SessionModel.id2 == i])) - ) - ).id # type: ignore - persist_ids.append(persist_id) - return persist_ids - - -async def persist_id2group_id(ids: List[str]) -> List[str]: - whereclause: List[ColumnElement[bool]] = [] - whereclause.append(or_(*[SessionModel.id == id for id in ids])) - 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 [i.id2 for i in records] + return user_ids def msg_counter( - msg_list: List[MessageRecord], keyword: Optional[str] + msg_list: List[MessageRecord], keyword: Optional[str] ) -> Dict[str, int]: - """### 计算每个人的消息量 + """### 计算每个人的消息量 - Args: - msg_list (list[MessageRecord]): 需要处理的消息列表 + Args: + msg_list (list[MessageRecord]): 需要处理的消息列表 - Returns: - (dict[str,int]): 处理后的消息数量字典,键为用户,值为消息数量 - """ + Returns: + (dict[str,int]): 处理后的消息数量字典,键为用户,值为消息数量 + """ - lst: Dict[str, int] = {} - msg_len = len(msg_list) - logger.info("wow , there are {} msgs to count !!!".format(msg_len)) + lst: Dict[str, int] = {} + msg_len = len(msg_list) + logger.info('wow , there are {} msgs to count !!!'.format(msg_len)) - for i in msg_list: - # logger.debug(f"processing msg {i.plain_text}") - if keyword: - match = re.search(keyword, i.plain_text) - if not match: - continue - try: - lst[str(i.session_persist_id)] += 1 - except KeyError: - lst[str(i.session_persist_id)] = 1 + for i in msg_list: + # logger.debug(f"processing msg {i.plain_text}") + if keyword: + match = re.search(keyword, i.plain_text) + if not match: + continue + try: + lst[str(i.session_persist_id)] += 1 + except KeyError: + lst[str(i.session_persist_id)] = 1 - logger.debug(f"finish counting, result is {lst}") + logger.debug(f'finish counting, result is {lst}') - return lst + return lst def got_rank(msg_dict: Dict[str, int]) -> List: - """### 获得排行榜 + """### 获得排行榜 - Args: - msg_dict (Dict[str,int]): 要处理的字典 + Args: + msg_dict (Dict[str,int]): 要处理的字典 - Returns: - List[Tuple[str,int]]: 排行榜列表(已排序) - """ - rank = [] - while len(rank) < plugin_config.get_num: - try: - max_key = max(msg_dict.items(), key=lambda x: x[1]) - rank.append(list(max_key)) - msg_dict.pop(max_key[0]) - except ValueError: - logger.error( - "群内拥有聊天记录的人数不足,无法获取到长度为{}的排行榜,已将长度变化为:{}".format( - plugin_config.get_num, len(rank) - ) - ) - break + Returns: + List[Tuple[str,int]]: 排行榜列表(已排序) + """ + rank = [] + while len(rank) < plugin_config.get_num: + try: + max_key = max(msg_dict.items(), key=lambda x: x[1]) + rank.append(list(max_key)) + msg_dict.pop(max_key[0]) + except ValueError: + logger.error( + '群内拥有聊天记录的人数不足,无法获取到长度为{}的排行榜,已将长度变化为:{}'.format( + plugin_config.get_num, len(rank) + ) + ) + break - return rank + return rank def remove_control_characters(string: str) -> str: - """### 将字符串中的控制符去除 + """### 将字符串中的控制符去除 - Args: - string (str): 需要去除的字符串 + Args: + string (str): 需要去除的字符串 - Returns: - (str): 经过处理的字符串 - """ - return "".join(ch for ch in string if unicodedata.category(ch)[0] != "C") + Returns: + (str): 经过处理的字符串 + """ + return ''.join(ch for ch in string if unicodedata.category(ch)[0] != 'C') async def get_rank_image(rank: List[UserRankInfo]) -> bytes: - for i in rank: - if i.user_avatar: - try: - user_avatar = i.user_avatar_bytes - except NotImplementedError: - user_avatar = open( - os.path.dirname(os.path.abspath(__file__)) - + "/template/avatar/default.jpg", - "rb", - ).read() - # if not os.path.exists(cache_path / str(i.user_id)): - with open(cache_path / (str(i.user_id) + ".jpg"), "wb") as f: - f.write(user_avatar) + for i in rank: + if i.user_avatar: + try: + user_avatar = i.user_avatar_bytes + except NotImplementedError: + user_avatar = open( + os.path.dirname(os.path.abspath(__file__)) + + '/template/avatar/default.jpg', + 'rb', + ).read() + # if not os.path.exists(cache_path / str(i.user_id)): + with open(cache_path / (str(i.user_id) + '.jpg'), 'wb') as f: + f.write(user_avatar) - if plugin_config.template_path[:2] == "./": - path = ( - os.path.dirname(os.path.abspath(__file__)) + plugin_config.template_path[1:] - ) - else: - path = plugin_config.template_path + if plugin_config.template_path[:2] == './': + path = ( + os.path.dirname(os.path.abspath(__file__)) + + plugin_config.template_path[1:] + ) + else: + path = plugin_config.template_path - path_dir, filename = os.path.split(path) - logger.debug( - os.path.dirname(os.path.abspath(__file__)) + plugin_config.template_path[1:] - ) - return await template_to_pic( - path_dir, - filename, - { - "users": rank, - "cache_path": cache_path, - "file_path": os.path.dirname(os.path.abspath(__file__)), - }, - pages={"viewport": {"width": 1000, "height": 10}}, - ) + path_dir, filename = os.path.split(path) + logger.debug( + os.path.dirname(os.path.abspath(__file__)) + + plugin_config.template_path[1:] + ) + return await template_to_pic( + path_dir, + filename, + { + 'users': rank, + 'cache_path': cache_path, + 'file_path': os.path.dirname(os.path.abspath(__file__)), + }, + pages={'viewport': {'width': 1000, 'height': 10}}, + ) def _get_user_nickname(user_info: UserInfo) -> str: - user_nickname = ( - user_info.user_displayname - if user_info.user_displayname - else user_info.user_name if user_info.user_name else user_info.user_id - ) - return user_nickname + user_nickname = ( + user_info.user_displayname + if user_info.user_displayname + else user_info.user_name + if user_info.user_name + else user_info.user_id + ) + return user_nickname async def _get_user_default_avatar() -> bytes: - img = open( - os.path.dirname(os.path.abspath(__file__)) + "/template/avatar/default.jpg", - "rb", - ).read() - return img + img = open( + os.path.dirname(os.path.abspath(__file__)) + + '/template/avatar/default.jpg', + 'rb', + ).read() + return img async def _get_user_avatar(user: UserInfo, client: httpx.AsyncClient) -> bytes: - if not user.user_avatar: - return await _get_user_default_avatar() - url = user.user_avatar.get_url() - for i in range(3): - try: - resp = await client.get(url, timeout=10) - resp.raise_for_status() - return resp.content - except Exception as e: - logger.warning(f"Error downloading {url}, retry {i}/3: {e}") - await asyncio.sleep(3) - raise NetworkError(f"{url} 下载失败!") + if not user.user_avatar: + return await _get_user_default_avatar() + url = user.user_avatar.get_url() + for i in range(3): + try: + resp = await client.get(url, timeout=10) + resp.raise_for_status() + return resp.content + except Exception as e: + logger.warning(f'Error downloading {url}, retry {i}/3: {e}') + await asyncio.sleep(3) + raise NetworkError(f'{url} 下载失败!') def get_default_user_info() -> UserInfo: - user_info = UserInfo( - user_id="114514", - user_name="鬼知道这谁,bot获取不了", - ) - return user_info + user_info = UserInfo( + user_id='114514', + user_name='鬼知道这谁,bot获取不了', + ) + return user_info async def get_user_infos( - bot: Bot, - event: Event, - rank: List, - use_cache: bool = plugin_config.use_user_info_cache, + bot: Bot, + event: Event, + rank: List, + use_cache: bool = plugin_config.use_user_info_cache, ) -> List[UserRankInfo]: - user_ids = [i[0] for i in rank] - pool = [get_user_info(bot, event, id, use_cache) for id in user_ids] - user_infos = await asyncio.gather(*pool) + user_ids = [i[0] for i in rank] + pool = [get_user_info(bot, event, id, use_cache) for id in user_ids] + user_infos = await asyncio.gather(*pool) - async with httpx.AsyncClient() as client: - pool = [] - for i in user_infos: - if not i: - pool.append(_get_user_default_avatar()) - continue - if i.user_avatar: - pool.append(_get_user_avatar(i, client)) - user_avatars = await asyncio.gather(*pool) + async with httpx.AsyncClient() as client: + pool = [] + for i in user_infos: + if not i: + pool.append(_get_user_default_avatar()) + continue + if i.user_avatar: + pool.append(_get_user_avatar(i, client)) + user_avatars = await asyncio.gather(*pool) - for i in user_avatars: - if not i: - user_avatars[user_avatars.index(i)] = await _get_user_default_avatar() + for i in user_avatars: + if not i: + user_avatars[ + user_avatars.index(i) + ] = await _get_user_default_avatar() - total = sum([i[1] for i in rank]) - rank2 = [] - for i in range(len(rank)): - user_info = user_infos[i] - if not user_info: - user_info = get_default_user_info() + total = sum([i[1] for i in rank]) + rank2 = [] + for i in range(len(rank)): + user_info = user_infos[i] + if not user_info: + user_info = get_default_user_info() - user = UserRankInfo( - **model_dump(user_info), - user_bnum=rank[i][1], - user_proportion=round(rank[i][1] / total * 100, 2), - user_index=i + 1, - user_nickname=_get_user_nickname(user_info), - user_avatar_bytes=user_avatars[i], - ) - print(user.user_gender) - if user.user_gender == "male": - user.user_gender = "♂" - elif user.user_gender == "female": - user.user_gender = "♀" - else: - user.user_gender = "🤔" - rank2.append(user) + user = UserRankInfo( + **model_dump(user_info), + user_bnum=rank[i][1], + user_proportion=round(rank[i][1] / total * 100, 2), + user_index=i + 1, + user_nickname=_get_user_nickname(user_info), + user_avatar_bytes=user_avatars[i], + ) + print(user.user_gender) + if user.user_gender == 'male': + user.user_gender = '♂' + elif user.user_gender == 'female': + user.user_gender = '♀' + else: + user.user_gender = '🤔' + rank2.append(user) - return rank2 + return rank2 diff --git a/pdm.lock b/pdm.lock index c74dcd8..f304d10 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,10 +2,10 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "Test", "dev"] +groups = ["default", "dev"] strategy = [] lock_version = "4.5.0" -content_hash = "sha256:5433e7888399800884f272535652b1d0b45f7c65b3760bc780df34d2fdfc99fc" +content_hash = "sha256:42cf686b0618c9e80b1aae28a90a3d694e17da96b6a208ff2720f11d88ef4e4f" [[metadata.targets]] requires_python = ">=3.9,<3.13" @@ -367,15 +367,6 @@ files = [ {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] -[[package]] -name = "dnspython" -version = "2.6.1" -summary = "" -files = [ - {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, - {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, -] - [[package]] name = "docutils" version = "0.21.2" @@ -385,19 +376,6 @@ files = [ {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, ] -[[package]] -name = "email-validator" -version = "2.1.1" -summary = "" -dependencies = [ - "dnspython", - "idna", -] -files = [ - {file = "email_validator-2.1.1-py3-none-any.whl", hash = "sha256:97d882d174e2a65732fb43bfce81a3a834cbc1bde8bf419e30ef5ea976370a05"}, - {file = "email_validator-2.1.1.tar.gz", hash = "sha256:200a70680ba08904be6d1eef729205cc0d687634399a5924d842533efb824b84"}, -] - [[package]] name = "emoji" version = "2.12.1" @@ -419,40 +397,6 @@ files = [ {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] -[[package]] -name = "fastapi" -version = "0.111.0" -summary = "" -dependencies = [ - "email-validator", - "fastapi-cli", - "httpx", - "jinja2", - "orjson", - "pydantic", - "python-multipart", - "starlette", - "typing-extensions", - "ujson", - "uvicorn", -] -files = [ - {file = "fastapi-0.111.0-py3-none-any.whl", hash = "sha256:97ecbf994be0bcbdadedf88c3150252bed7b2087075ac99735403b1b76cc8fc0"}, - {file = "fastapi-0.111.0.tar.gz", hash = "sha256:b9db9dd147c91cb8b769f7183535773d8741dd46f9dc6676cd82eab510228cd7"}, -] - -[[package]] -name = "fastapi-cli" -version = "0.0.4" -summary = "" -dependencies = [ - "typer", -] -files = [ - {file = "fastapi_cli-0.0.4-py3-none-any.whl", hash = "sha256:a2552f3a7ae64058cdbb530be6fa6dbfc975dc165e4fa66d224c3d396e25e809"}, - {file = "fastapi_cli-0.0.4.tar.gz", hash = "sha256:e2e9ffaffc1f7767f488d6da34b6f5a377751c996f397902eb6abb99a67bde32"}, -] - [[package]] name = "filelock" version = "3.15.4" @@ -538,42 +482,6 @@ files = [ {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] -[[package]] -name = "httptools" -version = "0.6.1" -summary = "" -files = [ - {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d2f6c3c4cb1948d912538217838f6e9960bc4a521d7f9b323b3da579cd14532f"}, - {file = "httptools-0.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:00d5d4b68a717765b1fabfd9ca755bd12bf44105eeb806c03d1962acd9b8e563"}, - {file = "httptools-0.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:639dc4f381a870c9ec860ce5c45921db50205a37cc3334e756269736ff0aac58"}, - {file = "httptools-0.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185"}, - {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0ac5a0ae3d9f4fe004318d64b8a854edd85ab76cffbf7ef5e32920faef62f142"}, - {file = "httptools-0.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3f30d3ce413088a98b9db71c60a6ada2001a08945cb42dd65a9a9fe228627658"}, - {file = "httptools-0.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:1ed99a373e327f0107cb513b61820102ee4f3675656a37a50083eda05dc9541b"}, - {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7a7ea483c1a4485c71cb5f38be9db078f8b0e8b4c4dc0210f531cdd2ddac1ef1"}, - {file = "httptools-0.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85ed077c995e942b6f1b07583e4eb0a8d324d418954fc6af913d36db7c05a5a0"}, - {file = "httptools-0.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b0bb634338334385351a1600a73e558ce619af390c2b38386206ac6a27fecfc"}, - {file = "httptools-0.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d9ceb2c957320def533671fc9c715a80c47025139c8d1f3797477decbc6edd2"}, - {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4f0f8271c0a4db459f9dc807acd0eadd4839934a4b9b892f6f160e94da309837"}, - {file = "httptools-0.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6a4f5ccead6d18ec072ac0b84420e95d27c1cdf5c9f1bc8fbd8daf86bd94f43d"}, - {file = "httptools-0.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:5cceac09f164bcba55c0500a18fe3c47df29b62353198e4f37bbcc5d591172c3"}, - {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:75c8022dca7935cba14741a42744eee13ba05db00b27a4b940f0d646bd4d56d0"}, - {file = "httptools-0.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:48ed8129cd9a0d62cf4d1575fcf90fb37e3ff7d5654d3a5814eb3d55f36478c2"}, - {file = "httptools-0.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f58e335a1402fb5a650e271e8c2d03cfa7cea46ae124649346d17bd30d59c90"}, - {file = "httptools-0.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ad80d7176aa5788902f207a4e79885f0576134695dfb0fefc15b7a4648d503"}, - {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9bb68d3a085c2174c2477eb3ffe84ae9fb4fde8792edb7bcd09a1d8467e30a84"}, - {file = "httptools-0.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b512aa728bc02354e5ac086ce76c3ce635b62f5fbc32ab7082b5e582d27867bb"}, - {file = "httptools-0.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:97662ce7fb196c785344d00d638fc9ad69e18ee4bfb4000b35a52efe5adcc949"}, - {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:95fb92dd3649f9cb139e9c56604cc2d7c7bf0fc2e7c8d7fbd58f96e35eddd2a3"}, - {file = "httptools-0.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dcbab042cc3ef272adc11220517278519adf8f53fd3056d0e68f0a6f891ba94e"}, - {file = "httptools-0.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cf2372e98406efb42e93bfe10f2948e467edfd792b015f1b4ecd897903d3e8d"}, - {file = "httptools-0.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678fcbae74477a17d103b7cae78b74800d795d702083867ce160fc202104d0da"}, - {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e0b281cf5a125c35f7f6722b65d8542d2e57331be573e9e88bc8b0115c4a7a81"}, - {file = "httptools-0.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:95658c342529bba4e1d3d2b1a874db16c7cca435e8827422154c9da76ac4e13a"}, - {file = "httptools-0.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ebaec1bf683e4bf5e9fbb49b8cc36da482033596a415b3e4ebab5a4c0d7ec5e"}, - {file = "httptools-0.6.1.tar.gz", hash = "sha256:c6e26c30455600b95d94b1b836085138e82f177351454ee841c148f93a9bad5a"}, -] - [[package]] name = "httpx" version = "0.27.0" @@ -990,7 +898,7 @@ files = [ [[package]] name = "nonebot-plugin-cesaa" -version = "0.4.2" +version = "0.5.0" summary = "" dependencies = [ "nonebot-plugin-chatrecorder", @@ -998,24 +906,23 @@ dependencies = [ "nonebot2", ] files = [ - {file = "nonebot_plugin_cesaa-0.4.2-py3-none-any.whl", hash = "sha256:9f36b0617b7c46eddd315bc853948ba931fcc78af97cbe56867d513e416f24a6"}, - {file = "nonebot_plugin_cesaa-0.4.2.tar.gz", hash = "sha256:719460b40c9d9d0ad67630a186e924ef9d6c58fdc4449844162d724b9e3fe808"}, + {file = "nonebot_plugin_cesaa-0.5.0-py3-none-any.whl", hash = "sha256:3b012631fc3779acfc75297f5ec8b3dca613a777fd47ced202d7d11e9e728a17"}, + {file = "nonebot_plugin_cesaa-0.5.0.tar.gz", hash = "sha256:f9489fdc26b32c48abba754e401f759a1b633aeeee8bcaaced28bc260d770019"}, ] [[package]] name = "nonebot-plugin-chatrecorder" -version = "0.6.2" +version = "0.7.0" summary = "" dependencies = [ "nonebot-plugin-localstore", "nonebot-plugin-orm", - "nonebot-plugin-session", - "nonebot-plugin-session-orm", + "nonebot-plugin-uninfo", "nonebot2", ] files = [ - {file = "nonebot_plugin_chatrecorder-0.6.2-py3-none-any.whl", hash = "sha256:70df4bc7bf1a8d9a5e84f6bf8d0c473095a581150e118fb29c340a1abf5e39f3"}, - {file = "nonebot_plugin_chatrecorder-0.6.2.tar.gz", hash = "sha256:4bdd892eb00e16f3d75e7edfc85b6bfd7e0fd17be82de164bd9b275cc1ea6974"}, + {file = "nonebot_plugin_chatrecorder-0.7.0-py3-none-any.whl", hash = "sha256:56cfb306cc85c602c8c97e7f1a63328d075ac8fd2349ddefcb501600f416d544"}, + {file = "nonebot_plugin_chatrecorder-0.7.0.tar.gz", hash = "sha256:5b63a92733307c4cd739bb1bb6d2af949811ff6882ce49e73d42735cfd6e820d"}, ] [[package]] @@ -1086,7 +993,7 @@ files = [ [[package]] name = "nonebot-plugin-send-anything-anywhere" -version = "0.6.1" +version = "0.7.1" summary = "" dependencies = [ "anyio", @@ -1096,35 +1003,8 @@ dependencies = [ "strenum", ] files = [ - {file = "nonebot_plugin_send_anything_anywhere-0.6.1-py3-none-any.whl", hash = "sha256:d1ac0df520f950b61ff27d3abda39c4bb2023797f3b7df2a23517ad53f3a7f29"}, - {file = "nonebot_plugin_send_anything_anywhere-0.6.1.tar.gz", hash = "sha256:89a695c5e356a423b8641f79082353b50ee431585988de2c2ae77f8ea00ac3e9"}, -] - -[[package]] -name = "nonebot-plugin-session" -version = "0.3.1" -summary = "" -dependencies = [ - "nonebot2", - "strenum", -] -files = [ - {file = "nonebot_plugin_session-0.3.1-py3-none-any.whl", hash = "sha256:7d21ed11a7d2a3bc9466be11f9653270ff0951585bd8e6fdd8034274e883ffb0"}, - {file = "nonebot_plugin_session-0.3.1.tar.gz", hash = "sha256:ba93b4b8e86394aa06ae099cd17c191e131f0d123a97e0c040578c08614fe306"}, -] - -[[package]] -name = "nonebot-plugin-session-orm" -version = "0.2.0" -summary = "" -dependencies = [ - "nonebot-plugin-orm", - "nonebot-plugin-session", - "nonebot2", -] -files = [ - {file = "nonebot_plugin_session_orm-0.2.0-py3-none-any.whl", hash = "sha256:e0a6009803feccf4e98db483e1f9072122ddbca40df0b2d1b45741c8e5332acb"}, - {file = "nonebot_plugin_session_orm-0.2.0.tar.gz", hash = "sha256:420e210898a3f348cebbb4ea0816bab66f3299c7b0c01e929a01967d60cc438c"}, + {file = "nonebot_plugin_send_anything_anywhere-0.7.1-py3-none-any.whl", hash = "sha256:b52044272be9a7bc77bd7a53ef700481c071fd4e889ae21a0411d0df22d13c16"}, + {file = "nonebot_plugin_send_anything_anywhere-0.7.1.tar.gz", hash = "sha256:ec9c7ba59c824238b812950146a894acc88ca8da98f500de15217feebcd5e868"}, ] [[package]] @@ -1188,21 +1068,6 @@ files = [ {file = "nonebot2-2.4.2.tar.gz", hash = "sha256:cf72d5920503ff373ba1d7963f3ddf573db913eb504e3b68ee347efb937db27d"}, ] -[[package]] -name = "nonebot2" -version = "2.4.2" -extras = ["fastapi"] -summary = "" -dependencies = [ - "fastapi", - "nonebot2==2.4.2", - "uvicorn", -] -files = [ - {file = "nonebot2-2.4.2-py3-none-any.whl", hash = "sha256:ed3e970cdb6c885fb23349b65a045c08cf3ac7f43e28564ae0c72d3671ecda74"}, - {file = "nonebot2-2.4.2.tar.gz", hash = "sha256:cf72d5920503ff373ba1d7963f3ddf573db913eb504e3b68ee347efb937db27d"}, -] - [[package]] name = "noneprompt" version = "0.1.9" @@ -1215,50 +1080,6 @@ files = [ {file = "noneprompt-0.1.9.tar.gz", hash = "sha256:338b8bb89a8d22ef35f1dedb3aa7c1b228cf139973bdc43c5ffc3eef64457db9"}, ] -[[package]] -name = "orjson" -version = "3.10.5" -summary = "" -files = [ - {file = "orjson-3.10.5-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:545d493c1f560d5ccfc134803ceb8955a14c3fcb47bbb4b2fee0232646d0b932"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4324929c2dd917598212bfd554757feca3e5e0fa60da08be11b4aa8b90013c1"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c13ca5e2ddded0ce6a927ea5a9f27cae77eee4c75547b4297252cb20c4d30e6"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b6c8e30adfa52c025f042a87f450a6b9ea29649d828e0fec4858ed5e6caecf63"}, - {file = "orjson-3.10.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:338fd4f071b242f26e9ca802f443edc588fa4ab60bfa81f38beaedf42eda226c"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6970ed7a3126cfed873c5d21ece1cd5d6f83ca6c9afb71bbae21a0b034588d96"}, - {file = "orjson-3.10.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:235dadefb793ad12f7fa11e98a480db1f7c6469ff9e3da5e73c7809c700d746b"}, - {file = "orjson-3.10.5-cp310-none-win32.whl", hash = "sha256:be79e2393679eda6a590638abda16d167754393f5d0850dcbca2d0c3735cebe2"}, - {file = "orjson-3.10.5-cp310-none-win_amd64.whl", hash = "sha256:c4a65310ccb5c9910c47b078ba78e2787cb3878cdded1702ac3d0da71ddc5228"}, - {file = "orjson-3.10.5-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:cdf7365063e80899ae3a697def1277c17a7df7ccfc979990a403dfe77bb54d40"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b68742c469745d0e6ca5724506858f75e2f1e5b59a4315861f9e2b1df77775a"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d10cc1b594951522e35a3463da19e899abe6ca95f3c84c69e9e901e0bd93d38"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcbe82b35d1ac43b0d84072408330fd3295c2896973112d495e7234f7e3da2e1"}, - {file = "orjson-3.10.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c0eb7e0c75e1e486c7563fe231b40fdd658a035ae125c6ba651ca3b07936f5"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:53ed1c879b10de56f35daf06dbc4a0d9a5db98f6ee853c2dbd3ee9d13e6f302f"}, - {file = "orjson-3.10.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:099e81a5975237fda3100f918839af95f42f981447ba8f47adb7b6a3cdb078fa"}, - {file = "orjson-3.10.5-cp311-none-win32.whl", hash = "sha256:1146bf85ea37ac421594107195db8bc77104f74bc83e8ee21a2e58596bfb2f04"}, - {file = "orjson-3.10.5-cp311-none-win_amd64.whl", hash = "sha256:36a10f43c5f3a55c2f680efe07aa93ef4a342d2960dd2b1b7ea2dd764fe4a37c"}, - {file = "orjson-3.10.5-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:68f85ecae7af14a585a563ac741b0547a3f291de81cd1e20903e79f25170458f"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28afa96f496474ce60d3340fe8d9a263aa93ea01201cd2bad844c45cd21f5268"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cd684927af3e11b6e754df80b9ffafd9fb6adcaa9d3e8fdd5891be5a5cad51e"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d21b9983da032505f7050795e98b5d9eee0df903258951566ecc358f6696969"}, - {file = "orjson-3.10.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ad1de7fef79736dde8c3554e75361ec351158a906d747bd901a52a5c9c8d24b"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d97531cdfe9bdd76d492e69800afd97e5930cb0da6a825646667b2c6c6c0211"}, - {file = "orjson-3.10.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69858c32f09c3e1ce44b617b3ebba1aba030e777000ebdf72b0d8e365d0b2b3"}, - {file = "orjson-3.10.5-cp312-none-win32.whl", hash = "sha256:64c9cc089f127e5875901ac05e5c25aa13cfa5dbbbd9602bda51e5c611d6e3e2"}, - {file = "orjson-3.10.5-cp312-none-win_amd64.whl", hash = "sha256:b2efbd67feff8c1f7728937c0d7f6ca8c25ec81373dc8db4ef394c1d93d13dc5"}, - {file = "orjson-3.10.5-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:85c89131d7b3218db1b24c4abecea92fd6c7f9fab87441cfc342d3acc725d807"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb66215277a230c456f9038d5e2d84778141643207f85336ef8d2a9da26bd7ca"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:51bbcdea96cdefa4a9b4461e690c75ad4e33796530d182bdd5c38980202c134a"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbead71dbe65f959b7bd8cf91e0e11d5338033eba34c114f69078d59827ee139"}, - {file = "orjson-3.10.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df58d206e78c40da118a8c14fc189207fffdcb1f21b3b4c9c0c18e839b5a214"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c4057c3b511bb8aef605616bd3f1f002a697c7e4da6adf095ca5b84c0fd43595"}, - {file = "orjson-3.10.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b39e006b00c57125ab974362e740c14a0c6a66ff695bff44615dcf4a70ce2b86"}, - {file = "orjson-3.10.5-cp39-none-win32.whl", hash = "sha256:eded5138cc565a9d618e111c6d5c2547bbdd951114eb822f7f6309e04db0fb47"}, - {file = "orjson-3.10.5-cp39-none-win_amd64.whl", hash = "sha256:cc28e90a7cae7fcba2493953cff61da5a52950e78dc2dacfe931a317ee3d8de7"}, - {file = "orjson-3.10.5.tar.gz", hash = "sha256:7a5baef8a4284405d96c90c7c62b755e9ef1ada84c2406c24a9ebec86b89f46d"}, -] - [[package]] name = "packaging" version = "25.0" @@ -1573,15 +1394,6 @@ files = [ {file = "python_markdown_math-0.8-py3-none-any.whl", hash = "sha256:c685249d84b5b697e9114d7beb352bd8ca2e07fd268fd4057ffca888c14641e5"}, ] -[[package]] -name = "python-multipart" -version = "0.0.9" -summary = "" -files = [ - {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, - {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, -] - [[package]] name = "python-slugify" version = "8.0.4" @@ -1761,15 +1573,6 @@ files = [ {file = "setuptools-78.1.1.tar.gz", hash = "sha256:fcc17fd9cd898242f6b4adfaca46137a9edef687f43e6f78469692a5e70d851d"}, ] -[[package]] -name = "shellingham" -version = "1.5.4" -summary = "" -files = [ - {file = "shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686"}, - {file = "shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de"}, -] - [[package]] name = "six" version = "1.16.0" @@ -1881,19 +1684,6 @@ files = [ {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, ] -[[package]] -name = "starlette" -version = "0.37.2" -summary = "" -dependencies = [ - "anyio", - "typing-extensions; python_full_version < \"3.10\"", -] -files = [ - {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, - {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, -] - [[package]] name = "strenum" version = "0.4.15" @@ -2023,21 +1813,6 @@ files = [ {file = "twine-6.1.0.tar.gz", hash = "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd"}, ] -[[package]] -name = "typer" -version = "0.12.3" -summary = "" -dependencies = [ - "click", - "rich", - "shellingham", - "typing-extensions", -] -files = [ - {file = "typer-0.12.3-py3-none-any.whl", hash = "sha256:070d7ca53f785acbccba8e7d28b08dcd88f79f1fbda035ade0aecec71ca5c914"}, - {file = "typer-0.12.3.tar.gz", hash = "sha256:49e73131481d804288ef62598d97a1ceef3058905aa536a1134f90891ba35482"}, -] - [[package]] name = "types-python-dateutil" version = "2.9.0.20240316" @@ -2077,66 +1852,6 @@ files = [ {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, ] -[[package]] -name = "ujson" -version = "5.10.0" -summary = "" -files = [ - {file = "ujson-5.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2601aa9ecdbee1118a1c2065323bda35e2c5a2cf0797ef4522d485f9d3ef65bd"}, - {file = "ujson-5.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:348898dd702fc1c4f1051bc3aacbf894caa0927fe2c53e68679c073375f732cf"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22cffecf73391e8abd65ef5f4e4dd523162a3399d5e84faa6aebbf9583df86d6"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26b0e2d2366543c1bb4fbd457446f00b0187a2bddf93148ac2da07a53fe51569"}, - {file = "ujson-5.10.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:caf270c6dba1be7a41125cd1e4fc7ba384bf564650beef0df2dd21a00b7f5770"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a245d59f2ffe750446292b0094244df163c3dc96b3ce152a2c837a44e7cda9d1"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94a87f6e151c5f483d7d54ceef83b45d3a9cca7a9cb453dbdbb3f5a6f64033f5"}, - {file = "ujson-5.10.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:29b443c4c0a113bcbb792c88bea67b675c7ca3ca80c3474784e08bba01c18d51"}, - {file = "ujson-5.10.0-cp310-cp310-win32.whl", hash = "sha256:c18610b9ccd2874950faf474692deee4223a994251bc0a083c114671b64e6518"}, - {file = "ujson-5.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:924f7318c31874d6bb44d9ee1900167ca32aa9b69389b98ecbde34c1698a250f"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a5b366812c90e69d0f379a53648be10a5db38f9d4ad212b60af00bd4048d0f00"}, - {file = "ujson-5.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:502bf475781e8167f0f9d0e41cd32879d120a524b22358e7f205294224c71126"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b91b5d0d9d283e085e821651184a647699430705b15bf274c7896f23fe9c9d8"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:129e39af3a6d85b9c26d5577169c21d53821d8cf68e079060602e861c6e5da1b"}, - {file = "ujson-5.10.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f77b74475c462cb8b88680471193064d3e715c7c6074b1c8c412cb526466efe9"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ec0ca8c415e81aa4123501fee7f761abf4b7f386aad348501a26940beb1860f"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ab13a2a9e0b2865a6c6db9271f4b46af1c7476bfd51af1f64585e919b7c07fd4"}, - {file = "ujson-5.10.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:57aaf98b92d72fc70886b5a0e1a1ca52c2320377360341715dd3933a18e827b1"}, - {file = "ujson-5.10.0-cp311-cp311-win32.whl", hash = "sha256:2987713a490ceb27edff77fb184ed09acdc565db700ee852823c3dc3cffe455f"}, - {file = "ujson-5.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:f00ea7e00447918ee0eff2422c4add4c5752b1b60e88fcb3c067d4a21049a720"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98ba15d8cbc481ce55695beee9f063189dce91a4b08bc1d03e7f0152cd4bbdd5"}, - {file = "ujson-5.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a9d2edbf1556e4f56e50fab7d8ff993dbad7f54bac68eacdd27a8f55f433578e"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6627029ae4f52d0e1a2451768c2c37c0c814ffc04f796eb36244cf16b8e57043"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8ccb77b3e40b151e20519c6ae6d89bfe3f4c14e8e210d910287f778368bb3d1"}, - {file = "ujson-5.10.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3caf9cd64abfeb11a3b661329085c5e167abbe15256b3b68cb5d914ba7396f3"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e32abdce572e3a8c3d02c886c704a38a1b015a1fb858004e03d20ca7cecbb21"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a65b6af4d903103ee7b6f4f5b85f1bfd0c90ba4eeac6421aae436c9988aa64a2"}, - {file = "ujson-5.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:604a046d966457b6cdcacc5aa2ec5314f0e8c42bae52842c1e6fa02ea4bda42e"}, - {file = "ujson-5.10.0-cp312-cp312-win32.whl", hash = "sha256:6dea1c8b4fc921bf78a8ff00bbd2bfe166345f5536c510671bccececb187c80e"}, - {file = "ujson-5.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:38665e7d8290188b1e0d57d584eb8110951a9591363316dd41cf8686ab1d0abc"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dfef2814c6b3291c3c5f10065f745a1307d86019dbd7ea50e83504950136ed5b"}, - {file = "ujson-5.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4734ee0745d5928d0ba3a213647f1c4a74a2a28edc6d27b2d6d5bd9fa4319e27"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47ebb01bd865fdea43da56254a3930a413f0c5590372a1241514abae8aa7c76"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dee5e97c2496874acbf1d3e37b521dd1f307349ed955e62d1d2f05382bc36dd5"}, - {file = "ujson-5.10.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7490655a2272a2d0b072ef16b0b58ee462f4973a8f6bbe64917ce5e0a256f9c0"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba17799fcddaddf5c1f75a4ba3fd6441f6a4f1e9173f8a786b42450851bd74f1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2aff2985cef314f21d0fecc56027505804bc78802c0121343874741650a4d3d1"}, - {file = "ujson-5.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ad88ac75c432674d05b61184178635d44901eb749786c8eb08c102330e6e8996"}, - {file = "ujson-5.10.0-cp39-cp39-win32.whl", hash = "sha256:2544912a71da4ff8c4f7ab5606f947d7299971bdd25a45e008e467ca638d13c9"}, - {file = "ujson-5.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:3ff201d62b1b177a46f113bb43ad300b424b7847f9c5d38b1b4ad8f75d4a282a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5b6fee72fa77dc172a28f21693f64d93166534c263adb3f96c413ccc85ef6e64"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:61d0af13a9af01d9f26d2331ce49bb5ac1fb9c814964018ac8df605b5422dcb3"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecb24f0bdd899d368b715c9e6664166cf694d1e57be73f17759573a6986dd95a"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fbd8fd427f57a03cff3ad6574b5e299131585d9727c8c366da4624a9069ed746"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:beeaf1c48e32f07d8820c705ff8e645f8afa690cca1544adba4ebfa067efdc88"}, - {file = "ujson-5.10.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:baed37ea46d756aca2955e99525cc02d9181de67f25515c468856c38d52b5f3b"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba43cc34cce49cf2d4bc76401a754a81202d8aa926d0e2b79f0ee258cb15d3a4"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ac56eb983edce27e7f51d05bc8dd820586c6e6be1c5216a6809b0c668bb312b8"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44bd4b23a0e723bf8b10628288c2c7c335161d6840013d4d5de20e48551773b"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c10f4654e5326ec14a46bcdeb2b685d4ada6911050aa8baaf3501e57024b804"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de4971a89a762398006e844ae394bd46991f7c385d7a6a3b93ba229e6dac17e"}, - {file = "ujson-5.10.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e1402f0564a97d2a52310ae10a64d25bcef94f8dd643fcf5d310219d915484f7"}, - {file = "ujson-5.10.0.tar.gz", hash = "sha256:b3cd8f3c5d8c7738257f1018880444f7b7d9b66232c64649f562d7ba86ad4bc1"}, -] - [[package]] name = "urllib3" version = "2.2.1" @@ -2146,72 +1861,6 @@ files = [ {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] -[[package]] -name = "uvicorn" -version = "0.30.1" -summary = "" -dependencies = [ - "click", - "h11", - "typing-extensions; python_full_version < \"3.11\"", -] -files = [ - {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, - {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, -] - -[[package]] -name = "uvicorn" -version = "0.30.1" -extras = ["standard"] -summary = "" -dependencies = [ - "colorama; sys_platform == \"win32\"", - "httptools", - "python-dotenv", - "pyyaml", - "uvicorn==0.30.1", - "uvloop; platform_python_implementation != \"PyPy\" and (sys_platform != \"cygwin\" and sys_platform != \"win32\")", - "watchfiles", - "websockets", -] -files = [ - {file = "uvicorn-0.30.1-py3-none-any.whl", hash = "sha256:cd17daa7f3b9d7a24de3617820e634d0933b69eed8e33a516071174427238c81"}, - {file = "uvicorn-0.30.1.tar.gz", hash = "sha256:d46cd8e0fd80240baffbcd9ec1012a712938754afcf81bce56c024c1656aece8"}, -] - -[[package]] -name = "uvloop" -version = "0.19.0" -summary = "" -files = [ - {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de4313d7f575474c8f5a12e163f6d89c0a878bc49219641d49e6f1444369a90e"}, - {file = "uvloop-0.19.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5588bd21cf1fcf06bded085f37e43ce0e00424197e7c10e77afd4bbefffef428"}, - {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b1fd71c3843327f3bbc3237bedcdb6504fd50368ab3e04d0410e52ec293f5b8"}, - {file = "uvloop-0.19.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a05128d315e2912791de6088c34136bfcdd0c7cbc1cf85fd6fd1bb321b7c849"}, - {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cd81bdc2b8219cb4b2556eea39d2e36bfa375a2dd021404f90a62e44efaaf957"}, - {file = "uvloop-0.19.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5f17766fb6da94135526273080f3455a112f82570b2ee5daa64d682387fe0dcd"}, - {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4ce6b0af8f2729a02a5d1575feacb2a94fc7b2e983868b009d51c9a9d2149bef"}, - {file = "uvloop-0.19.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:31e672bb38b45abc4f26e273be83b72a0d28d074d5b370fc4dcf4c4eb15417d2"}, - {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:570fc0ed613883d8d30ee40397b79207eedd2624891692471808a95069a007c1"}, - {file = "uvloop-0.19.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5138821e40b0c3e6c9478643b4660bd44372ae1e16a322b8fc07478f92684e24"}, - {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:91ab01c6cd00e39cde50173ba4ec68a1e578fee9279ba64f5221810a9e786533"}, - {file = "uvloop-0.19.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:47bf3e9312f63684efe283f7342afb414eea4d3011542155c7e625cd799c3b12"}, - {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:da8435a3bd498419ee8c13c34b89b5005130a476bda1d6ca8cfdde3de35cd650"}, - {file = "uvloop-0.19.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:02506dc23a5d90e04d4f65c7791e65cf44bd91b37f24cfc3ef6cf2aff05dc7ec"}, - {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2693049be9d36fef81741fddb3f441673ba12a34a704e7b4361efb75cf30befc"}, - {file = "uvloop-0.19.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7010271303961c6f0fe37731004335401eb9075a12680738731e9c92ddd96ad6"}, - {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5daa304d2161d2918fa9a17d5635099a2f78ae5b5960e742b2fcfbb7aefaa593"}, - {file = "uvloop-0.19.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7207272c9520203fea9b93843bb775d03e1cf88a80a936ce760f60bb5add92f3"}, - {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:13dfdf492af0aa0a0edf66807d2b465607d11c4fa48f4a1fd41cbea5b18e8e8b"}, - {file = "uvloop-0.19.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e3d4e85ac060e2342ff85e90d0c04157acb210b9ce508e784a944f852a40e67"}, - {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca4956c9ab567d87d59d49fa3704cf29e37109ad348f2d5223c9bf761a332e7"}, - {file = "uvloop-0.19.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f467a5fd23b4fc43ed86342641f3936a68ded707f4627622fa3f82a120e18256"}, - {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:492e2c32c2af3f971473bc22f086513cedfc66a130756145a931a90c3958cb17"}, - {file = "uvloop-0.19.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2df95fca285a9f5bfe730e51945ffe2fa71ccbfdde3b0da5772b4ee4f2e770d5"}, - {file = "uvloop-0.19.0.tar.gz", hash = "sha256:0246f4fd1bf2bf702e06b0d45ee91677ee5c31242f39aab4ea6fe0c51aedd0fd"}, -] - [[package]] name = "virtualenv" version = "20.26.3" @@ -2304,69 +1953,6 @@ files = [ {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] -[[package]] -name = "websockets" -version = "12.0" -summary = "" -files = [ - {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, - {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, - {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, - {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, - {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, - {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, - {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, - {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, - {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, - {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, - {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, - {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, - {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, - {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, - {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, - {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, - {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, - {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, - {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, - {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, - {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, - {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, - {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, - {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, - {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, - {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, - {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, - {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, - {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, - {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, - {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, - {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, - {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, -] - [[package]] name = "win32-setctime" version = "1.1.0"