mirror of
https://github.com/A-Minos/nonebot-plugin-tetris-stats.git
synced 2026-03-05 05:36:54 +08:00
Compare commits
7 Commits
0.3.3
...
0.4.0.post
| Author | SHA1 | Date | |
|---|---|---|---|
| e5354d39c9 | |||
| 9d37d05b24 | |||
| d7b6e3cb17 | |||
|
|
32d34c93d7 | ||
| 972f7e90d2 | |||
|
|
fe412d5acd | ||
|
|
ac8d332e69 |
1
.github/dependabot.yml
vendored
1
.github/dependabot.yml
vendored
@@ -7,5 +7,6 @@ version: 2
|
|||||||
updates:
|
updates:
|
||||||
- package-ecosystem: "pip" # See documentation for possible values
|
- package-ecosystem: "pip" # See documentation for possible values
|
||||||
directory: "/" # Location of package manifests
|
directory: "/" # Location of package manifests
|
||||||
|
target-branch: "dev"
|
||||||
schedule:
|
schedule:
|
||||||
interval: "daily"
|
interval: "daily"
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
|
.idea
|
||||||
dist
|
dist
|
||||||
test*
|
test*
|
||||||
Untitled*
|
Untitled*
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from .processor import Processor
|
|||||||
|
|
||||||
IOBind = on_regex(pattern=r'^io绑定|^iobind', flags=I, permission=GROUP)
|
IOBind = on_regex(pattern=r'^io绑定|^iobind', flags=I, permission=GROUP)
|
||||||
IOStats = on_regex(pattern=r'^io查|^iostats', flags=I, permission=GROUP)
|
IOStats = on_regex(pattern=r'^io查|^iostats', flags=I, permission=GROUP)
|
||||||
|
IORank = on_regex(pattern=r'^io段位|^iorank', flags=I, permission=GROUP)
|
||||||
|
|
||||||
@IOBind.handle()
|
@IOBind.handle()
|
||||||
async def _(event: MessageEvent, matcher: Matcher):
|
async def _(event: MessageEvent, matcher: Matcher):
|
||||||
@@ -30,3 +30,11 @@ async def _(event: MessageEvent, matcher: Matcher):
|
|||||||
qq_number=event.sender.user_id
|
qq_number=event.sender.user_id
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@IORank.handle()
|
||||||
|
async def _(event: MessageEvent, matcher: Matcher):
|
||||||
|
await matcher.finish(
|
||||||
|
await Processor.handle_rank(
|
||||||
|
message=event.raw_message
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import math
|
||||||
from asyncio import gather
|
from asyncio import gather
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
@@ -6,7 +7,8 @@ from nonebot.log import logger
|
|||||||
from ...utils.database import DataBase
|
from ...utils.database import DataBase
|
||||||
from ...utils.message_analyzer import (
|
from ...utils.message_analyzer import (
|
||||||
handle_bind_message,
|
handle_bind_message,
|
||||||
handle_stats_query_message
|
handle_rank_message,
|
||||||
|
handle_stats_query_message,
|
||||||
)
|
)
|
||||||
from .request import Request
|
from .request import Request
|
||||||
|
|
||||||
@@ -43,6 +45,82 @@ class Processor:
|
|||||||
logger.error('预期外行为, 请上报GitHub')
|
logger.error('预期外行为, 请上报GitHub')
|
||||||
return '出现预期外行为,请查看后台信息'
|
return '出现预期外行为,请查看后台信息'
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def handle_rank(cls, message: str):
|
||||||
|
query_rank = await handle_rank_message(message)
|
||||||
|
rank_info = await DataBase.query_rank_info_today(rank=query_rank.lower())
|
||||||
|
|
||||||
|
if rank_info is None:
|
||||||
|
ranks_percentiles = {
|
||||||
|
'x': 1,
|
||||||
|
'u': 5,
|
||||||
|
'ss': 11,
|
||||||
|
's+': 17,
|
||||||
|
's': 23,
|
||||||
|
's-': 30,
|
||||||
|
'a+': 38,
|
||||||
|
'a': 46,
|
||||||
|
'a-': 54,
|
||||||
|
'b+': 62,
|
||||||
|
'b': 70,
|
||||||
|
'b-': 78,
|
||||||
|
'c+': 84,
|
||||||
|
'c': 90,
|
||||||
|
'c-': 95,
|
||||||
|
'd+': 97.5,
|
||||||
|
'd': 100,
|
||||||
|
}
|
||||||
|
|
||||||
|
if query_rank.lower() not in (i for i in ranks_percentiles.keys()):
|
||||||
|
return '未知段位'
|
||||||
|
|
||||||
|
result = await Request.request('https://ch.tetr.io/api/users/lists/league/all')
|
||||||
|
users: list = result[2]['data']['users']
|
||||||
|
|
||||||
|
def avg(rank_users: list, column: str, playercount: int | None = None) -> float:
|
||||||
|
return sum(i['league'][column] for i in rank_users) / (playercount or len(rank_users))
|
||||||
|
|
||||||
|
for rank, percentile in ranks_percentiles.items():
|
||||||
|
offset = math.floor((percentile / 100) * len(users)) - 1
|
||||||
|
tr = users[offset]['league']['rating']
|
||||||
|
|
||||||
|
rank_users = list(filter(lambda x: x['league']['rank'] == rank, users))
|
||||||
|
playercount = len(rank_users)
|
||||||
|
|
||||||
|
avg_apm = avg(rank_users, 'apm', playercount)
|
||||||
|
avg_pps = avg(rank_users, 'pps', playercount)
|
||||||
|
avg_vs = avg(rank_users, 'vs', playercount)
|
||||||
|
|
||||||
|
await DataBase.write_rank_info_today(
|
||||||
|
rank=rank,
|
||||||
|
trline=tr,
|
||||||
|
playercount=playercount,
|
||||||
|
avgapm=avg_apm,
|
||||||
|
avgpps=avg_pps,
|
||||||
|
avgvs=avg_vs
|
||||||
|
)
|
||||||
|
|
||||||
|
return await Processor.handle_rank(message=message)
|
||||||
|
else:
|
||||||
|
avg_apm = round(rank_info[3], 2)
|
||||||
|
avg_pps = round(rank_info[4], 2)
|
||||||
|
avg_vs = round(rank_info[5], 2)
|
||||||
|
avg_lpm = round((avg_pps * 24), 2)
|
||||||
|
avg_apl = round((avg_apm / avg_lpm), 2)
|
||||||
|
avg_adpm = round((avg_vs * 0.6), 2)
|
||||||
|
avg_adpl = round((avg_adpm / avg_lpm), 2)
|
||||||
|
|
||||||
|
message = f'{query_rank.upper()} 段, 分数线 {round(rank_info[1], 2)} TR, {rank_info[2]} 名玩家'
|
||||||
|
message += f'\n对比昨日趋势: {rank_info[0]}'
|
||||||
|
message += '\n平均数据: '
|
||||||
|
message += f"\nL'PM: {avg_lpm} ( {avg_pps} pps )"
|
||||||
|
message += f'\nAPM: {avg_apm} ( x{avg_apl} )'
|
||||||
|
message += f'\nADPM: {avg_adpm} ( x{avg_adpl} ) ( {avg_vs}vs )'
|
||||||
|
message += '\n'
|
||||||
|
message += f'\n数据更新时间: {rank_info[6]}'
|
||||||
|
|
||||||
|
return message
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def handle_query(cls, message: str, qq_number: int | None):
|
async def handle_query(cls, message: str, qq_number: int | None):
|
||||||
'''处理查询消息'''
|
'''处理查询消息'''
|
||||||
@@ -69,9 +147,9 @@ class Processor:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_user_data(
|
async def get_user_data(
|
||||||
cls,
|
cls,
|
||||||
user_name: str | None = None,
|
user_name: str | None = None,
|
||||||
user_id: str | None = None
|
user_id: str | None = None
|
||||||
) -> tuple[bool, bool, dict[str, Any]]:
|
) -> tuple[bool, bool, dict[str, Any]]:
|
||||||
'''获取用户数据'''
|
'''获取用户数据'''
|
||||||
if user_name is not None and user_id is None:
|
if user_name is not None and user_id is None:
|
||||||
@@ -84,9 +162,9 @@ class Processor:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def get_solo_data(
|
async def get_solo_data(
|
||||||
cls,
|
cls,
|
||||||
user_name: str | None = None,
|
user_name: str | None = None,
|
||||||
user_id: str | None = None
|
user_id: str | None = None
|
||||||
) -> tuple[bool, bool, dict[str, Any]]:
|
) -> tuple[bool, bool, dict[str, Any]]:
|
||||||
'''获取Solo数据'''
|
'''获取Solo数据'''
|
||||||
if user_name is not None and user_id is None:
|
if user_name is not None and user_id is None:
|
||||||
@@ -165,9 +243,9 @@ class Processor:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def generate_message(
|
async def generate_message(
|
||||||
cls,
|
cls,
|
||||||
user_name: str | None = None,
|
user_name: str | None = None,
|
||||||
user_id: str | None = None
|
user_id: str | None = None
|
||||||
) -> str:
|
) -> str:
|
||||||
'''生成消息'''
|
'''生成消息'''
|
||||||
user_data, solo_data = await gather(
|
user_data, solo_data = await gather(
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import datetime
|
||||||
import os
|
import os
|
||||||
from asyncio import gather
|
from asyncio import gather
|
||||||
from sqlite3 import Connection, connect
|
from sqlite3 import Connection, connect
|
||||||
@@ -39,10 +40,61 @@ class DataBase():
|
|||||||
cursor.execute('''CREATE TABLE IF NOT EXISTS TOPBIND
|
cursor.execute('''CREATE TABLE IF NOT EXISTS TOPBIND
|
||||||
(QQ INTEGER NOT NULL,
|
(QQ INTEGER NOT NULL,
|
||||||
USER TEXT NOT NULL)''')
|
USER TEXT NOT NULL)''')
|
||||||
|
cursor.execute('''CREATE TABLE IF NOT EXISTS IORANK
|
||||||
|
(RANK VARCHAR(2) NOT NULL,
|
||||||
|
TRENDING CHAR(1) NOT NULL,
|
||||||
|
TRLINE FLOAT NOT NULL,
|
||||||
|
PLAYERCOUNT INTEGER NOT NULL,
|
||||||
|
AVGAPM FLOAT NOT NULL,
|
||||||
|
AVGPPS FLOAT NOT NULL,
|
||||||
|
ARGVS FLOAT NOT NULL,
|
||||||
|
DATE TEXT NOT NULL)''')
|
||||||
cls._db.commit()
|
cls._db.commit()
|
||||||
logger.info('数据库初始化完成')
|
logger.info('数据库初始化完成')
|
||||||
return cls._db
|
return cls._db
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def query_rank_info_today(cls, rank: str) -> list | None:
|
||||||
|
'''查询段位信息'''
|
||||||
|
db = await cls._get_db()
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute('''SELECT TRENDING, TRLINE, PLAYERCOUNT, AVGAPM, AVGPPS, ARGVS, DATE
|
||||||
|
FROM IORANK
|
||||||
|
WHERE RANK = ? AND DATE = ?''', (rank, datetime.date.today()))
|
||||||
|
result = cursor.fetchone()
|
||||||
|
|
||||||
|
if result is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
return list(result)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
async def write_rank_info_today(cls, rank: str, trline: int, playercount: int, avgapm: float, avgpps: float, avgvs: float):
|
||||||
|
'''写入段位信息'''
|
||||||
|
|
||||||
|
db = await cls._get_db()
|
||||||
|
cursor = db.cursor()
|
||||||
|
cursor.execute('''SELECT TRLINE
|
||||||
|
FROM IORANK
|
||||||
|
WHERE RANK = ? AND DATE = ?''', (rank, datetime.date.today()))
|
||||||
|
|
||||||
|
result = cursor.fetchone()
|
||||||
|
|
||||||
|
if result is None:
|
||||||
|
trending = '?'
|
||||||
|
else:
|
||||||
|
if result[0] > trline:
|
||||||
|
trending = '↑'
|
||||||
|
else:
|
||||||
|
trending = '↓'
|
||||||
|
|
||||||
|
cursor.execute('''INSERT INTO IORANK
|
||||||
|
(RANK, TRENDING, TRLINE, PLAYERCOUNT, AVGAPM, AVGPPS, ARGVS, DATE)
|
||||||
|
VALUES (?,?,?,?,?,?,?,?)''',
|
||||||
|
(rank, trending, trline, playercount, avgapm, avgpps, avgvs, datetime.date.today()))
|
||||||
|
|
||||||
|
db.commit()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def _get_db(cls) -> Connection:
|
async def _get_db(cls) -> Connection:
|
||||||
'''获取数据库对象'''
|
'''获取数据库对象'''
|
||||||
|
|||||||
@@ -53,6 +53,19 @@ async def handle_stats_query_message(message: str, game_type: str) -> tuple[str
|
|||||||
return await check_name(message, game_type)
|
return await check_name(message, game_type)
|
||||||
|
|
||||||
|
|
||||||
|
async def handle_rank_message(message: str) -> str:
|
||||||
|
_cmd_aliases = ['io段位', 'iorank']
|
||||||
|
# 剔除命令前缀
|
||||||
|
for i in _cmd_aliases:
|
||||||
|
if match(rf'(?i){i}', message):
|
||||||
|
message = sub(rf'(?i){i}', '', message)
|
||||||
|
message = message.strip()
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
raise ValueError('预期外行为, 请上报GitHub')
|
||||||
|
return message
|
||||||
|
|
||||||
|
|
||||||
async def check_name(name: str, game_type: str) -> tuple[str | None, tuple]:
|
async def check_name(name: str, game_type: str) -> tuple[str | None, tuple]:
|
||||||
'''返回值为tuple[gameType, tuple[message, user]]'''
|
'''返回值为tuple[gameType, tuple[message, user]]'''
|
||||||
if game_type == 'IO':
|
if game_type == 'IO':
|
||||||
|
|||||||
22
poetry.lock
generated
22
poetry.lock
generated
@@ -376,25 +376,25 @@ graph = ["objgraph (>=1.7.2)"]
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fastapi"
|
name = "fastapi"
|
||||||
version = "0.88.0"
|
version = "0.92.0"
|
||||||
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "fastapi-0.88.0-py3-none-any.whl", hash = "sha256:263b718bb384422fe3d042ffc9a0c8dece5e034ab6586ff034f6b4b1667c3eee"},
|
{file = "fastapi-0.92.0-py3-none-any.whl", hash = "sha256:ae7b97c778e2f2ec3fb3cb4fb14162129411d99907fb71920f6d69a524340ebf"},
|
||||||
{file = "fastapi-0.88.0.tar.gz", hash = "sha256:915bf304180a0e7c5605ec81097b7d4cd8826ff87a02bb198e336fb9f3b5ff02"},
|
{file = "fastapi-0.92.0.tar.gz", hash = "sha256:023a0f5bd2c8b2609014d3bba1e14a1d7df96c6abea0a73070621c9862b9a4de"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
|
pydantic = ">=1.6.2,<1.7 || >1.7,<1.7.1 || >1.7.1,<1.7.2 || >1.7.2,<1.7.3 || >1.7.3,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0"
|
||||||
starlette = "0.22.0"
|
starlette = ">=0.25.0,<0.26.0"
|
||||||
|
|
||||||
[package.extras]
|
[package.extras]
|
||||||
all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
|
all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
|
||||||
dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.19.0)"]
|
dev = ["pre-commit (>=2.17.0,<3.0.0)", "ruff (==0.0.138)", "uvicorn[standard] (>=0.12.0,<0.21.0)"]
|
||||||
doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.7.0)"]
|
doc = ["mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-markdownextradata-plugin (>=0.1.7,<0.3.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pyyaml (>=5.3.1,<7.0.0)", "typer[all] (>=0.6.1,<0.8.0)"]
|
||||||
test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<7.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<=1.4.41)", "types-orjson (==3.6.2)", "types-ujson (==5.5.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
|
test = ["anyio[trio] (>=3.2.1,<4.0.0)", "black (==22.10.0)", "coverage[toml] (>=6.5.0,<8.0)", "databases[sqlite] (>=0.3.2,<0.7.0)", "email-validator (>=1.1.1,<2.0.0)", "flask (>=1.1.2,<3.0.0)", "httpx (>=0.23.0,<0.24.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.982)", "orjson (>=3.2.1,<4.0.0)", "passlib[bcrypt] (>=1.7.2,<2.0.0)", "peewee (>=3.13.3,<4.0.0)", "pytest (>=7.1.3,<8.0.0)", "python-jose[cryptography] (>=3.3.0,<4.0.0)", "python-multipart (>=0.0.5,<0.0.6)", "pyyaml (>=5.3.1,<7.0.0)", "ruff (==0.0.138)", "sqlalchemy (>=1.3.18,<1.4.43)", "types-orjson (==3.6.2)", "types-ujson (==5.6.0.0)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0,<6.0.0)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "frozenlist"
|
name = "frozenlist"
|
||||||
@@ -731,6 +731,7 @@ files = [
|
|||||||
{file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"},
|
{file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0"},
|
||||||
{file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"},
|
{file = "lxml-4.9.2-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e"},
|
||||||
{file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"},
|
{file = "lxml-4.9.2-cp35-cp35m-win32.whl", hash = "sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df"},
|
||||||
|
{file = "lxml-4.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5"},
|
||||||
{file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"},
|
{file = "lxml-4.9.2-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53"},
|
||||||
{file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"},
|
{file = "lxml-4.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7"},
|
||||||
{file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"},
|
{file = "lxml-4.9.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe"},
|
||||||
@@ -740,6 +741,7 @@ files = [
|
|||||||
{file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"},
|
{file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74"},
|
||||||
{file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"},
|
{file = "lxml-4.9.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38"},
|
||||||
{file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"},
|
{file = "lxml-4.9.2-cp36-cp36m-win32.whl", hash = "sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5"},
|
||||||
|
{file = "lxml-4.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3"},
|
||||||
{file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"},
|
{file = "lxml-4.9.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03"},
|
||||||
{file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"},
|
{file = "lxml-4.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941"},
|
||||||
{file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"},
|
{file = "lxml-4.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726"},
|
||||||
@@ -1448,14 +1450,14 @@ files = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "starlette"
|
name = "starlette"
|
||||||
version = "0.22.0"
|
version = "0.25.0"
|
||||||
description = "The little ASGI library that shines."
|
description = "The little ASGI library that shines."
|
||||||
category = "main"
|
category = "main"
|
||||||
optional = false
|
optional = false
|
||||||
python-versions = ">=3.7"
|
python-versions = ">=3.7"
|
||||||
files = [
|
files = [
|
||||||
{file = "starlette-0.22.0-py3-none-any.whl", hash = "sha256:b5eda991ad5f0ee5d8ce4c4540202a573bb6691ecd0c712262d0bc85cf8f2c50"},
|
{file = "starlette-0.25.0-py3-none-any.whl", hash = "sha256:774f1df1983fd594b9b6fb3ded39c2aa1979d10ac45caac0f4255cbe2acb8628"},
|
||||||
{file = "starlette-0.22.0.tar.gz", hash = "sha256:b092cbc365bea34dd6840b42861bdabb2f507f8671e642e8272d2442e08ea4ff"},
|
{file = "starlette-0.25.0.tar.gz", hash = "sha256:854c71e73736c429c2bdb07801f2c76c9cba497e7c3cf4988fde5e95fe4cdb3c"},
|
||||||
]
|
]
|
||||||
|
|
||||||
[package.dependencies]
|
[package.dependencies]
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "nonebot-plugin-tetris-stats"
|
name = "nonebot-plugin-tetris-stats"
|
||||||
version = "0.3.3"
|
version = "0.4.0.post1"
|
||||||
description = "一个基于nonebot2的用于查询TETRIS相关游戏玩家数据的插件"
|
description = "一个基于nonebot2的用于查询TETRIS相关游戏玩家数据的插件"
|
||||||
authors = ["scdhh <wallfjjd@gmail.com>"]
|
authors = ["scdhh <wallfjjd@gmail.com>"]
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
|
|||||||
Reference in New Issue
Block a user