mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0bc3b86820 | |||
|
|
57d0b15242 | ||
|
|
56fe45efcf | ||
| 13f005179f | |||
| 243a8a286d | |||
| 8b7de6745b | |||
| d0fc82d88d | |||
| bb4da8accc | |||
| 56e06a7001 | |||
|
|
7c0b3cd240 |
2
.github/workflows/Release.yml
vendored
2
.github/workflows/Release.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: astral-sh/setup-uv@v5
|
||||
- uses: astral-sh/setup-uv@v6
|
||||
name: Setup UV
|
||||
with:
|
||||
enable-cache: true
|
||||
|
||||
2
.github/workflows/Test.yml
vendored
2
.github/workflows/Test.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup uv
|
||||
uses: astral-sh/setup-uv@v5
|
||||
uses: astral-sh/setup-uv@v6
|
||||
with:
|
||||
enable-cache: true
|
||||
cache-suffix: ${{ env.PYTHON_VERSION }}_${{ env.OS }}
|
||||
|
||||
2
.github/workflows/TypeCheck.yml
vendored
2
.github/workflows/TypeCheck.yml
vendored
@@ -9,7 +9,7 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: astral-sh/setup-uv@v5
|
||||
- uses: astral-sh/setup-uv@v6
|
||||
name: Setup UV
|
||||
with:
|
||||
enable-cache: true
|
||||
|
||||
@@ -7,7 +7,7 @@ ci:
|
||||
autoupdate_commit_msg: ':arrow_up: auto update by pre-commit hooks'
|
||||
repos:
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.11.6
|
||||
rev: v0.11.8
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix, --exit-non-zero-on-fix]
|
||||
|
||||
@@ -18,6 +18,7 @@ class ScopedConfig(BaseModel):
|
||||
request_timeout: float = 30.0
|
||||
screenshot_quality: float = 2
|
||||
proxy: Proxy = Field(default_factory=Proxy)
|
||||
development: bool = False
|
||||
|
||||
|
||||
class Config(BaseModel):
|
||||
|
||||
@@ -1,25 +1,93 @@
|
||||
from typing import TypeAlias
|
||||
from datetime import datetime
|
||||
from enum import IntEnum
|
||||
from typing import Literal, TypeAlias
|
||||
|
||||
from pydantic import BaseModel
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from ..base import FailedModel, SuccessModel
|
||||
|
||||
|
||||
class RankType(IntEnum):
|
||||
PERCENTILE = 1
|
||||
ISSUE = 2
|
||||
ZENITH = 3
|
||||
PERCENTILELAX = 4
|
||||
PERCENTILEVLAX = 5
|
||||
PERCENTILEMLAX = 6
|
||||
|
||||
|
||||
class ValueType(IntEnum):
|
||||
NONE = 0
|
||||
NUMBER = 1
|
||||
TIME = 2
|
||||
TIME_INV = 3
|
||||
FLOOR = 4
|
||||
ISSUE = 5
|
||||
NUMBER_INV = 6
|
||||
|
||||
|
||||
class ArType(IntEnum):
|
||||
UNRANKED = 0
|
||||
RANKED = 1
|
||||
COMPETITIVE = 2
|
||||
|
||||
|
||||
class Rank(IntEnum):
|
||||
NONE = 0
|
||||
BRONZE = 1
|
||||
SILVER = 2
|
||||
GOLD = 3
|
||||
PLATINUM = 4
|
||||
DIAMOND = 5
|
||||
ISSUED = 100
|
||||
|
||||
|
||||
class Ally(BaseModel):
|
||||
id: str = Field(alias='_id')
|
||||
username: str
|
||||
role: Literal['anon', 'user', 'bot', 'halfmod', 'mod', 'admin', 'sysop', 'hidden', 'banned']
|
||||
country: str | None = None
|
||||
supporter: bool
|
||||
avatar_revision: int | None = None
|
||||
|
||||
|
||||
class X(BaseModel):
|
||||
ally: Ally | None = None
|
||||
|
||||
|
||||
class Achievement(BaseModel):
|
||||
# 这**都是些啥
|
||||
k: int
|
||||
o: int
|
||||
rt: int
|
||||
vt: int
|
||||
achievement_id: int = Field(alias='k')
|
||||
category: str
|
||||
primary_name: str = Field(alias='name')
|
||||
objective: str = Field(alias='object')
|
||||
flavor_text: str = Field(alias='desc')
|
||||
order: int = Field(alias='o')
|
||||
rank_type: RankType = Field(alias='rt')
|
||||
value_type: ValueType = Field(alias='vt')
|
||||
ar_type: ArType = Field(alias='art')
|
||||
min: int
|
||||
deci: int
|
||||
name: str
|
||||
object: str
|
||||
category: str
|
||||
hidden: bool
|
||||
desc: str
|
||||
nolb: bool
|
||||
event: str | None = None
|
||||
event_past: bool | None = None
|
||||
disabled: bool | None = None
|
||||
pair: bool | None = None
|
||||
achieved_score: float | None = Field(None, alias='v')
|
||||
a: float | None = None
|
||||
t: datetime | None = None
|
||||
pos: int | None = None
|
||||
total: int | None = None
|
||||
rank: Rank | None = None
|
||||
x: X | None = None
|
||||
n: str
|
||||
stub: bool
|
||||
|
||||
tiebreak: int
|
||||
notifypb: bool
|
||||
id: str | None = Field(None, alias='_id')
|
||||
progress: float | None = None
|
||||
stub: bool | None = None
|
||||
|
||||
|
||||
class AchievementsSuccessModel(SuccessModel):
|
||||
|
||||
@@ -81,7 +81,7 @@ async def _(nb_user: User, account: Player, event_session: EventSession, bot_inf
|
||||
name=bot_info.user_name,
|
||||
),
|
||||
prompt='io查我',
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -89,7 +89,7 @@ async def _(
|
||||
for i in league.data.entries
|
||||
if isinstance(i, Entry)
|
||||
],
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -93,7 +93,7 @@ async def make_query_image_v1(player: Player) -> bytes:
|
||||
sprint=sprint_value,
|
||||
blitz=blitz_value,
|
||||
),
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -11,6 +11,7 @@ from ....utils.metrics import get_metrics
|
||||
from ....utils.render import render
|
||||
from ....utils.render.schemas.base import Avatar
|
||||
from ....utils.render.schemas.v2.tetrio.user.info import (
|
||||
Achievement,
|
||||
Badge,
|
||||
Best,
|
||||
Blitz,
|
||||
@@ -33,7 +34,7 @@ from .tools import flow_to_history, handling_special_value
|
||||
async def make_query_image_v2(player: Player) -> bytes:
|
||||
(
|
||||
(user, user_info, league, sprint, blitz, zen),
|
||||
(avatar_revision, banner_revision, leagueflow, zenith, zenithex),
|
||||
(avatar_revision, banner_revision, leagueflow, zenith, zenithex, achievements),
|
||||
) = await gather(
|
||||
gather(
|
||||
player.user,
|
||||
@@ -49,6 +50,7 @@ async def make_query_image_v2(player: Player) -> bytes:
|
||||
player.get_leagueflow(),
|
||||
player.get_summaries('zenith'),
|
||||
player.get_summaries('zenithex'),
|
||||
player.get_summaries('achievements'),
|
||||
),
|
||||
)
|
||||
if sprint.data.record is not None:
|
||||
@@ -110,7 +112,20 @@ async def make_query_image_v2(player: Player) -> bytes:
|
||||
],
|
||||
xp=user_info.data.xp,
|
||||
ar=user_info.data.ar,
|
||||
achievements=user_info.data.achievements,
|
||||
achievements=[
|
||||
Achievement(
|
||||
key=i.achievement_id,
|
||||
rank_type=i.rank_type,
|
||||
ar_type=i.ar_type,
|
||||
stub=i.stub,
|
||||
rank=i.rank,
|
||||
achieved_score=i.achieved_score,
|
||||
pos=i.pos,
|
||||
progress=i.progress,
|
||||
total=i.total,
|
||||
)
|
||||
for i in achievements.data
|
||||
],
|
||||
playtime=play_time,
|
||||
join_at=user_info.data.ts,
|
||||
),
|
||||
@@ -188,7 +203,7 @@ async def make_query_image_v2(player: Player) -> bytes:
|
||||
if blitz.data.record is not None
|
||||
else None,
|
||||
zen=Zen(level=zen.data.level, score=zen.data.score),
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
),
|
||||
) as page_hash:
|
||||
|
||||
@@ -12,6 +12,7 @@ from nonebot_plugin_apscheduler import scheduler
|
||||
from nonebot_plugin_orm import get_session
|
||||
from sqlalchemy import select
|
||||
|
||||
from ....config.config import config
|
||||
from ....utils.exception import RequestError
|
||||
from ....utils.retry import retry
|
||||
from .. import alc
|
||||
@@ -136,14 +137,16 @@ async def get_tetra_league_data() -> None:
|
||||
await session.commit()
|
||||
|
||||
|
||||
@driver.on_startup
|
||||
async def _() -> None:
|
||||
async with get_session() as session:
|
||||
latest_time = await session.scalar(
|
||||
select(TETRIOLeagueStats.update_time).order_by(TETRIOLeagueStats.id.desc()).limit(1)
|
||||
)
|
||||
if latest_time is None or datetime.now(tz=UTC) - latest_time.replace(tzinfo=UTC) > timedelta(hours=6):
|
||||
await get_tetra_league_data()
|
||||
if not config.tetris.development:
|
||||
|
||||
@driver.on_startup
|
||||
async def _() -> None:
|
||||
async with get_session() as session:
|
||||
latest_time = await session.scalar(
|
||||
select(TETRIOLeagueStats.update_time).order_by(TETRIOLeagueStats.id.desc()).limit(1)
|
||||
)
|
||||
if latest_time is None or datetime.now(tz=UTC) - latest_time.replace(tzinfo=UTC) > timedelta(hours=6):
|
||||
await get_tetra_league_data()
|
||||
|
||||
|
||||
from . import all, detail # noqa: A004, E402
|
||||
|
||||
@@ -83,7 +83,7 @@ async def make_image_v1(latest_data: TETRIOLeagueStats, compare_data: TETRIOLeag
|
||||
for i in zip(latest_data.fields, compare_data.fields, strict=True)
|
||||
},
|
||||
updated_at=latest_data.update_time,
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
@@ -111,7 +111,7 @@ async def make_image_v2(latest_data: TETRIOLeagueStats, compare_data: TETRIOLeag
|
||||
for i in zip(latest_data.fields, compare_data.fields, strict=True)
|
||||
},
|
||||
updated_at=latest_data.update_time,
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -123,7 +123,7 @@ async def make_image(rank: ValidRank, latest: TETRIOLeagueStats, compare: TETRIO
|
||||
vs_holder=latest_data.high_vs.username.upper(),
|
||||
),
|
||||
updated_at=latest.update_time.replace(tzinfo=UTC).astimezone(ZoneInfo('Asia/Shanghai')),
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -146,7 +146,7 @@ async def make_blitz_image(player: Player) -> bytes:
|
||||
level=stats.level,
|
||||
),
|
||||
play_at=blitz.data.record.ts,
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -146,7 +146,7 @@ async def make_sprint_image(player: Player) -> bytes:
|
||||
),
|
||||
),
|
||||
play_at=sprint.data.record.ts,
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -69,7 +69,7 @@ async def _(nb_user: User, event_session: EventSession, bot_info: UserInfo = Bot
|
||||
name=bot_info.user_name,
|
||||
),
|
||||
prompt='io绑定{游戏ID}',
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -55,7 +55,7 @@ async def _(
|
||||
name=bot_info.user_name,
|
||||
),
|
||||
prompt='top查我',
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -96,7 +96,7 @@ async def make_query_image(profile: UserProfile) -> bytes:
|
||||
apl=history.apl,
|
||||
apm_trending=Trending.KEEP,
|
||||
),
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -57,7 +57,7 @@ async def _(
|
||||
name=bot_info.user_name,
|
||||
),
|
||||
prompt='top绑定{游戏ID}',
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -55,7 +55,7 @@ async def _(
|
||||
name=bot_info.user_remark or bot_info.user_displayname or bot_info.user_name,
|
||||
),
|
||||
prompt='茶服查我',
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -304,7 +304,7 @@ async def make_query_image(user_info: UserInfoSuccess, game_data: GameData, even
|
||||
challenge=f'{int(user_info.data.pb_challenge):,}' if user_info.data.pb_challenge != '0' else 'N/A',
|
||||
marathon=f'{int(user_info.data.pb_marathon):,}' if user_info.data.pb_marathon != '0' else 'N/A',
|
||||
),
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -60,7 +60,7 @@ async def _(
|
||||
name=bot_info.user_name,
|
||||
),
|
||||
prompt='茶服绑定{游戏ID}',
|
||||
_lang=get_lang(),
|
||||
lang=get_lang(),
|
||||
),
|
||||
)
|
||||
) as page_hash:
|
||||
|
||||
@@ -10,6 +10,8 @@ from nonebot.log import logger
|
||||
from playwright.__main__ import main
|
||||
from playwright.async_api import Browser, BrowserContext, async_playwright
|
||||
|
||||
from ..config.config import config
|
||||
|
||||
driver = get_driver()
|
||||
|
||||
global_config = driver.config
|
||||
@@ -76,6 +78,7 @@ class BrowserManager:
|
||||
"""启动浏览器实例"""
|
||||
playwright = await async_playwright().start()
|
||||
cls._browser = await playwright.firefox.launch(
|
||||
headless=not config.tetris.development,
|
||||
firefox_user_prefs={
|
||||
'network.http.max-persistent-connections-per-server': 64,
|
||||
},
|
||||
|
||||
@@ -12,7 +12,7 @@ from nonebot import get_app, get_driver
|
||||
from nonebot.log import logger
|
||||
from yarl import URL
|
||||
|
||||
from ..config.config import CACHE_PATH
|
||||
from ..config.config import CACHE_PATH, config
|
||||
from ..games.tetrio.api.cache import request
|
||||
from .image import img_to_png
|
||||
from .templates import TEMPLATES_DIR
|
||||
@@ -45,8 +45,14 @@ class HostPage:
|
||||
async def __aenter__(self) -> str:
|
||||
return self.page_hash
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb) -> None: # noqa: ANN001
|
||||
self.pages.pop(self.page_hash, None)
|
||||
if not config.tetris.development:
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb) -> None: # noqa: ANN001
|
||||
self.pages.pop(self.page_hash, None)
|
||||
else:
|
||||
|
||||
async def __aexit__(self, exc_type, exc, tb) -> None: # noqa: ANN001
|
||||
pass
|
||||
|
||||
|
||||
@driver.on_startup
|
||||
|
||||
@@ -8,7 +8,7 @@ from ...typedefs import Lang, Number
|
||||
|
||||
|
||||
class Base(BaseModel):
|
||||
_lang: Lang
|
||||
lang: Lang
|
||||
|
||||
|
||||
class Avatar(BaseModel):
|
||||
|
||||
@@ -3,6 +3,8 @@ from typing import Literal
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
from .......games.tetrio.api.schemas.summaries.achievements import ArType, RankType
|
||||
from .......games.tetrio.api.schemas.summaries.achievements import Rank as AchievementRank
|
||||
from .......games.tetrio.api.typedefs import Rank
|
||||
from ......typedefs import Number
|
||||
from ....base import Avatar, Base, HistoryData
|
||||
@@ -15,6 +17,18 @@ class Badge(BaseModel):
|
||||
receive_at: datetime | None
|
||||
|
||||
|
||||
class Achievement(BaseModel):
|
||||
key: int
|
||||
rank_type: RankType
|
||||
ar_type: ArType
|
||||
stub: bool | None
|
||||
rank: AchievementRank | None
|
||||
achieved_score: float | None
|
||||
pos: int | None
|
||||
progress: float | None
|
||||
total: int | None
|
||||
|
||||
|
||||
class User(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
@@ -37,7 +51,7 @@ class User(BaseModel):
|
||||
xp: Number
|
||||
|
||||
ar: Number
|
||||
achievements: list[int]
|
||||
achievements: list[Achievement]
|
||||
|
||||
playtime: str | None
|
||||
join_at: datetime | None
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#:schema https://json.schemastore.org/uv.json
|
||||
|
||||
[project]
|
||||
name = "nonebot-plugin-tetris-stats"
|
||||
version = "1.8.0"
|
||||
version = "1.8.3"
|
||||
description = "一款基于 NoneBot2 的用于查询 Tetris 相关游戏数据的插件"
|
||||
readme = "README.md"
|
||||
authors = [{ name = "shoucandanghehe", email = "wallfjjd@gmail.com" }]
|
||||
@@ -58,6 +60,7 @@ dev = [
|
||||
"nonebot-adapter-kaiheila>=0.3.4",
|
||||
"nonebot-adapter-onebot>=2.4.6",
|
||||
"nonebot-adapter-qq>=1.5.3",
|
||||
"nonebot-plugin-tarina-lang-turbo>=0.1.1",
|
||||
"ruff>=0.7.1",
|
||||
]
|
||||
typecheck = [
|
||||
@@ -159,7 +162,7 @@ defineConstant = { PYDANTIC_V2 = true }
|
||||
typeCheckingMode = "standard"
|
||||
|
||||
[tool.bumpversion]
|
||||
current_version = "1.8.0"
|
||||
current_version = "1.8.3"
|
||||
tag = true
|
||||
sign_tags = true
|
||||
tag_name = "{new_version}"
|
||||
@@ -176,4 +179,4 @@ asyncio_mode = "auto"
|
||||
asyncio_default_fixture_loop_scope = "session"
|
||||
|
||||
[tool.nonebot]
|
||||
plugins = ["nonebot_plugin_tetris_stats"]
|
||||
plugins = ["nonebot_plugin_tetris_stats", "nonebot_plugin_tarina_lang_turbo"]
|
||||
|
||||
23
uv.lock
generated
23
uv.lock
generated
@@ -1294,7 +1294,7 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/8c/de/8eb6fffecd9c5f129461edcdd7e1ac944f9de15783e3d89c84ed6e0374bc/lxml-5.3.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aa837e6ee9534de8d63bc4c1249e83882a7ac22bd24523f83fad68e6ffdf41ae", size = 5652903 },
|
||||
{ url = "https://files.pythonhosted.org/packages/95/79/80f4102a08495c100014593680f3f0f7bd7c1333b13520aed855fc993326/lxml-5.3.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:da4c9223319400b97a2acdfb10926b807e51b69eb7eb80aad4942c0516934858", size = 5491813 },
|
||||
{ url = "https://files.pythonhosted.org/packages/15/f5/9b1f7edf6565ee31e4300edb1bcc61eaebe50a3cff4053c0206d8dc772f2/lxml-5.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dc0e9bdb3aa4d1de703a437576007d366b54f52c9897cae1a3716bb44fc1fc85", size = 5227837 },
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/17/c31d94364c02e3492215658917f5590c00edce8074aeb06d05b7771465d9/lxml-5.3.2-cp310-cp310-win32.whl", hash = "sha256:5f94909a1022c8ea12711db7e08752ca7cf83e5b57a87b59e8a583c5f35016ad", size = 3477533 },
|
||||
{ url = "https://files.pythonhosted.org/packages/dd/53/a187c4ccfcd5fbfca01e6c96da39499d8b801ab5dcf57717db95d7a968a8/lxml-5.3.2-cp310-cp310-win32.win32.whl", hash = "sha256:dd755a0a78dd0b2c43f972e7b51a43be518ebc130c9f1a7c4480cf08b4385486", size = 3477533 },
|
||||
{ url = "https://files.pythonhosted.org/packages/f2/2c/397c5a9d76a7a0faf9e5b13143ae1a7e223e71d2197a45da71c21aacb3d4/lxml-5.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:d64ea1686474074b38da13ae218d9fde0d1dc6525266976808f41ac98d9d7980", size = 3805160 },
|
||||
{ url = "https://files.pythonhosted.org/packages/84/b8/2b727f5a90902f7cc5548349f563b60911ca05f3b92e35dfa751349f265f/lxml-5.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9d61a7d0d208ace43986a92b111e035881c4ed45b1f5b7a270070acae8b0bfb4", size = 8163457 },
|
||||
{ url = "https://files.pythonhosted.org/packages/91/84/23135b2dc72b3440d68c8f39ace2bb00fe78e3a2255f7c74f7e76f22498e/lxml-5.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856dfd7eda0b75c29ac80a31a6411ca12209183e866c33faf46e77ace3ce8a79", size = 4433445 },
|
||||
@@ -1926,9 +1926,26 @@ wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/96/2e/6f8e30055aa0c28e19df2659e325b27ea5b6c788dbc8b99591b0935cdaaa/nonebot_plugin_session_orm-0.2.2-py3-none-any.whl", hash = "sha256:ab2bbc9fbf245b3e236789aabb2bef4d501dd720d74002744091503d33548ba7", size = 7842 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nonebot-plugin-tarina-lang-turbo"
|
||||
version = "0.1.1"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "msgspec" },
|
||||
{ name = "nonebot-plugin-alconna" },
|
||||
{ name = "nonebot-plugin-localstore" },
|
||||
{ name = "nonebot-plugin-session" },
|
||||
{ name = "nonebot2" },
|
||||
{ name = "tarina" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/24/db/f91bceeff96e3e6de959bd31ed8eba1dea9f297f141879bd0a08758fcbfd/nonebot_plugin_tarina_lang_turbo-0.1.1.tar.gz", hash = "sha256:33d0854d39c8fbb07020e7d1c2036943ee90a487ba4da90e0c0c89adc172cd19", size = 124382 }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/88/54/be4dc0c899b6f154677cb502b81c3ec8ba5a37ded850f09e47916143c2d7/nonebot_plugin_tarina_lang_turbo-0.1.1-py3-none-any.whl", hash = "sha256:c231dab228e3a52993b282dbdcb5faeebd7aa4e433c9794405651334f54a96a8", size = 7988 },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nonebot-plugin-tetris-stats"
|
||||
version = "1.7.2"
|
||||
version = "1.8.1"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "aiocache" },
|
||||
@@ -1973,6 +1990,7 @@ dev = [
|
||||
{ name = "nonebot-adapter-kaiheila" },
|
||||
{ name = "nonebot-adapter-onebot" },
|
||||
{ name = "nonebot-adapter-qq" },
|
||||
{ name = "nonebot-plugin-tarina-lang-turbo" },
|
||||
{ name = "ruff" },
|
||||
]
|
||||
release = [
|
||||
@@ -2037,6 +2055,7 @@ dev = [
|
||||
{ name = "nonebot-adapter-kaiheila", specifier = ">=0.3.4" },
|
||||
{ name = "nonebot-adapter-onebot", specifier = ">=2.4.6" },
|
||||
{ name = "nonebot-adapter-qq", specifier = ">=1.5.3" },
|
||||
{ name = "nonebot-plugin-tarina-lang-turbo", specifier = ">=0.1.1" },
|
||||
{ name = "ruff", specifier = ">=0.7.1" },
|
||||
]
|
||||
release = [{ name = "bump-my-version", specifier = ">=0.28.0" }]
|
||||
|
||||
Reference in New Issue
Block a user