Skip to content

Commit f0b1a1c

Browse files
♻️ 迁移至 nonebot_plugin_uninfo (#542)
* ➕ 添加依赖 nonebot-plugin-uninfo * ♻️ 使用 nonebot_plugin_uninfo 替代 nonebot_plugin_session nonebot_plugin_session_orm nonebot_plugin_userinfo * 🗃️ 迁移数据库数据至 nonebot_plugin_uninfo * ➖ 删除依赖 nonebot-plugin-session nonebot-plugin-session-orm nonebot-plugin-userinfo * ➕ 添加依赖 nonebot-session-to-uninfo
1 parent 0bc3b86 commit f0b1a1c

24 files changed

Lines changed: 2641 additions & 2334 deletions

nonebot_plugin_tetris_stats/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
'nonebot_plugin_apscheduler',
77
'nonebot_plugin_localstore',
88
'nonebot_plugin_orm',
9-
'nonebot_plugin_session_orm',
10-
'nonebot_plugin_session',
9+
'nonebot_plugin_uninfo',
1110
'nonebot_plugin_user',
12-
'nonebot_plugin_userinfo',
1311
'nonebot_plugin_waiter',
1412
}
1513

nonebot_plugin_tetris_stats/config/config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from nonebot import get_plugin_config
1+
from nonebot import get_driver, get_plugin_config
22
from nonebot_plugin_localstore import get_plugin_cache_dir, get_plugin_data_dir
33
from pydantic import BaseModel, Field
44

@@ -26,3 +26,4 @@ class Config(BaseModel):
2626

2727

2828
config = get_plugin_config(Config)
29+
global_config = get_driver().config
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
"""Create a new table
2+
3+
迁移 ID: 612d8b00d9ac
4+
父迁移: 5a1b93948494
5+
创建时间: 2025-05-26 04:49:29.664480
6+
7+
"""
8+
9+
from __future__ import annotations
10+
11+
from typing import TYPE_CHECKING
12+
13+
import sqlalchemy as sa
14+
from alembic import op
15+
16+
if TYPE_CHECKING:
17+
from collections.abc import Sequence
18+
19+
revision: str = '612d8b00d9ac'
20+
down_revision: str | Sequence[str] | None = '5a1b93948494'
21+
branch_labels: str | Sequence[str] | None = None
22+
depends_on: str | Sequence[str] | None = None
23+
24+
25+
def upgrade(name: str = '') -> None:
26+
if name:
27+
return
28+
op.create_table(
29+
'nonebot_plugin_tetris_stats_triggerhistoricaldatav2',
30+
sa.Column('id', sa.Integer(), nullable=False),
31+
sa.Column('trigger_time', sa.DateTime(), nullable=False),
32+
sa.Column('session_persist_id', sa.Integer(), nullable=False),
33+
sa.Column('game_platform', sa.String(length=32), nullable=False),
34+
sa.Column('command_type', sa.String(length=16), nullable=False),
35+
sa.Column('command_args', sa.JSON(), nullable=False),
36+
sa.Column('finish_time', sa.DateTime(), nullable=False),
37+
sa.PrimaryKeyConstraint('id', name=op.f('pk_nonebot_plugin_tetris_stats_triggerhistoricaldatav2')),
38+
info={'bind_key': 'nonebot_plugin_tetris_stats'},
39+
)
40+
with op.batch_alter_table('nonebot_plugin_tetris_stats_triggerhistoricaldatav2', schema=None) as batch_op:
41+
batch_op.create_index(
42+
batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_command_type'),
43+
['command_type'],
44+
unique=False,
45+
)
46+
batch_op.create_index(
47+
batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_game_platform'),
48+
['game_platform'],
49+
unique=False,
50+
)
51+
52+
53+
def downgrade(name: str = '') -> None:
54+
if name:
55+
return
56+
with op.batch_alter_table('nonebot_plugin_tetris_stats_triggerhistoricaldatav2', schema=None) as batch_op:
57+
batch_op.drop_index(batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_game_platform'))
58+
batch_op.drop_index(batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_command_type'))
59+
60+
op.drop_table('nonebot_plugin_tetris_stats_triggerhistoricaldatav2')
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
"""Migrate to uninfo
2+
3+
迁移 ID: 766cc7e75a62
4+
父迁移: 612d8b00d9ac
5+
创建时间: 2025-05-26 04:51:54.665200
6+
7+
"""
8+
9+
from __future__ import annotations
10+
11+
import math
12+
from typing import TYPE_CHECKING
13+
14+
from alembic import op
15+
from nonebot.log import logger
16+
from rich.progress import BarColumn, Progress, SpinnerColumn, TaskProgressColumn, TextColumn
17+
from sqlalchemy import inspect
18+
from sqlalchemy.ext.automap import automap_base
19+
from sqlalchemy.orm import Session
20+
21+
if TYPE_CHECKING:
22+
from collections.abc import Sequence
23+
24+
revision: str = '766cc7e75a62'
25+
down_revision: str | Sequence[str] | None = '612d8b00d9ac'
26+
branch_labels: str | Sequence[str] | None = None
27+
depends_on: str | Sequence[str] | None = None
28+
29+
30+
def data_migrate() -> None:
31+
conn = op.get_bind()
32+
insp = inspect(conn)
33+
table_names = insp.get_table_names()
34+
if 'nonebot_plugin_tetris_stats_triggerhistoricaldata' not in table_names:
35+
return
36+
37+
Base = automap_base() # noqa: N806
38+
Base.prepare(autoload_with=conn)
39+
TriggerHistoricalData = Base.classes.nonebot_plugin_tetris_stats_triggerhistoricaldata # noqa: N806
40+
TriggerHistoricalDataV2 = Base.classes.nonebot_plugin_tetris_stats_triggerhistoricaldatav2 # noqa: N806
41+
42+
with Session(conn) as db_session:
43+
count = db_session.query(TriggerHistoricalData).count()
44+
if count == 0:
45+
return
46+
47+
try:
48+
from nonebot_session_to_uninfo import check_tables, get_id_map # type: ignore[import-untyped]
49+
except ImportError as err:
50+
msg = '请安装 `nonebot-session-to-uninfo` 以迁移数据'
51+
raise ValueError(msg) from err
52+
53+
check_tables()
54+
55+
migration_limit = 10000 # 每次迁移的数据量为 10000 条
56+
last_id = -1
57+
id_map: dict[int, int] = {}
58+
59+
logger.warning('tetris_stats: 正在迁移数据, 请不要关闭程序...')
60+
61+
with Progress(
62+
SpinnerColumn(),
63+
TextColumn('[progress.description]{task.description}'),
64+
BarColumn(),
65+
TaskProgressColumn(),
66+
) as progress:
67+
task = progress.add_task('迁移数据...', total=count)
68+
69+
for _ in range(math.ceil(count / migration_limit)):
70+
records = (
71+
db_session.query(TriggerHistoricalData)
72+
.order_by(TriggerHistoricalData.id)
73+
.where(TriggerHistoricalData.id > last_id)
74+
.limit(migration_limit)
75+
.all()
76+
)
77+
last_id = records[-1].id
78+
79+
session_ids = [
80+
record.session_persist_id for record in records if record.session_persist_id not in id_map
81+
]
82+
if session_ids:
83+
id_map.update(get_id_map(session_ids))
84+
85+
db_session.add_all(
86+
TriggerHistoricalDataV2(
87+
id=record.id,
88+
session_persist_id=id_map[record.session_persist_id],
89+
trigger_time=record.trigger_time,
90+
game_platform=record.game_platform,
91+
command_type=record.command_type,
92+
command_args=record.command_args,
93+
finish_time=record.finish_time,
94+
)
95+
for record in records
96+
)
97+
98+
progress.update(task, advance=len(records))
99+
100+
db_session.commit()
101+
102+
logger.success('tetris_stats: 数据迁移完成!')
103+
104+
105+
def upgrade(name: str = '') -> None:
106+
if name:
107+
return
108+
data_migrate()
109+
110+
111+
def downgrade(name: str = '') -> None:
112+
if name:
113+
return

nonebot_plugin_tetris_stats/db/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from sqlalchemy import select
1313

1414
from ..utils.typedefs import AllCommandType, BaseCommandType, GameType, TETRIOCommandType
15-
from .models import Bind, TriggerHistoricalData
15+
from .models import Bind, TriggerHistoricalDataV2
1616

1717
UTC = timezone.utc
1818

@@ -139,7 +139,7 @@ async def trigger(
139139
except FinishedException:
140140
async with get_session() as session:
141141
session.add(
142-
TriggerHistoricalData(
142+
TriggerHistoricalDataV2(
143143
trigger_time=trigger_time,
144144
session_persist_id=session_persist_id,
145145
game_platform=game_platform,

nonebot_plugin_tetris_stats/db/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class Bind(MappedAsDataclass, Model):
7171
game_account: Mapped[str]
7272

7373

74-
class TriggerHistoricalData(MappedAsDataclass, Model):
74+
class TriggerHistoricalDataV2(MappedAsDataclass, Model):
7575
id: Mapped[int] = mapped_column(init=False, primary_key=True)
7676
trigger_time: Mapped[datetime] = mapped_column(DateTime)
7777
session_persist_id: Mapped[int]

nonebot_plugin_tetris_stats/games/tetrio/bind.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
from hashlib import md5
2+
from secrets import choice
23

34
from arclet.alconna import Arg, ArgFlag
45
from nonebot_plugin_alconna import Args, Subcommand
56
from nonebot_plugin_alconna.uniseg import UniMessage
67
from nonebot_plugin_orm import get_session
7-
from nonebot_plugin_session import EventSession
8-
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
8+
from nonebot_plugin_uninfo import QryItrface, Uninfo
9+
from nonebot_plugin_uninfo import User as UninfoUser
10+
from nonebot_plugin_uninfo.orm import get_session_persist_id
911
from nonebot_plugin_user import User
10-
from nonebot_plugin_userinfo import BotUserInfo, UserInfo
1112
from yarl import URL
1213

14+
from ...config.config import global_config
1315
from ...db import BindStatus, create_or_update_bind, trigger
1416
from ...utils.host import HostPage, get_self_netloc
1517
from ...utils.image import get_avatar
@@ -44,7 +46,7 @@
4446

4547

4648
@alc.assign('TETRIO.bind')
47-
async def _(nb_user: User, account: Player, event_session: EventSession, bot_info: UserInfo = BotUserInfo()): # noqa: B008
49+
async def _(nb_user: User, account: Player, event_session: Uninfo, interface: QryItrface):
4850
async with trigger(
4951
session_persist_id=await get_session_persist_id(event_session),
5052
game_platform=GAME_TYPE,
@@ -77,8 +79,15 @@ async def _(nb_user: User, account: Player, event_session: EventSession, bot_inf
7779
name=user.name.upper(),
7880
),
7981
bot=People(
80-
avatar=await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg'),
81-
name=bot_info.user_name,
82+
avatar=await get_avatar(
83+
(
84+
bot_user := await interface.get_user(event_session.self_id)
85+
or UninfoUser(id=event_session.self_id)
86+
),
87+
'Data URI',
88+
'../../static/logo/logo.svg',
89+
),
90+
name=bot_user.nick or bot_user.name or choice(list(global_config.nickname) or ['bot']),
8291
),
8392
prompt='io查我',
8493
lang=get_lang(),

nonebot_plugin_tetris_stats/games/tetrio/config.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from nonebot_plugin_alconna import Option, Subcommand
33
from nonebot_plugin_alconna.uniseg import UniMessage
44
from nonebot_plugin_orm import async_scoped_session
5-
from nonebot_plugin_session import EventSession
6-
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
5+
from nonebot_plugin_uninfo import Uninfo
6+
from nonebot_plugin_uninfo.orm import get_session_persist_id
77
from nonebot_plugin_user import User
88
from sqlalchemy import select
99

@@ -34,7 +34,7 @@
3434

3535

3636
@alc.assign('TETRIO.config')
37-
async def _(user: User, session: async_scoped_session, event_session: EventSession, template: Template):
37+
async def _(user: User, session: async_scoped_session, event_session: Uninfo, template: Template):
3838
async with trigger(
3939
session_persist_id=await get_session_persist_id(event_session),
4040
game_platform=GAME_TYPE,

nonebot_plugin_tetris_stats/games/tetrio/list.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from nonebot_plugin_alconna import Args, Option, Subcommand
22
from nonebot_plugin_alconna.uniseg import UniMessage
3-
from nonebot_plugin_session import EventSession
4-
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
3+
from nonebot_plugin_uninfo import Uninfo
4+
from nonebot_plugin_uninfo.orm import get_session_persist_id
55

66
from ...db import trigger
77
from ...utils.host import HostPage, get_self_netloc
@@ -32,7 +32,7 @@
3232

3333
@alc.assign('TETRIO.list')
3434
async def _(
35-
event_session: EventSession,
35+
event_session: Uninfo,
3636
max_tr: float | None = None,
3737
min_tr: float | None = None,
3838
limit: int | None = None,

nonebot_plugin_tetris_stats/games/tetrio/query/__init__.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
from nonebot_plugin_alconna import Args, At, Option, Subcommand
88
from nonebot_plugin_alconna.uniseg import UniMessage
99
from nonebot_plugin_orm import get_session
10-
from nonebot_plugin_session import EventSession
11-
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
10+
from nonebot_plugin_uninfo import Uninfo
11+
from nonebot_plugin_uninfo.orm import get_session_persist_id
1212
from nonebot_plugin_user import User as NBUser
1313
from nonebot_plugin_user import get_user
1414
from sqlalchemy import select
@@ -90,7 +90,7 @@ async def _( # noqa: PLR0913
9090
event: Event,
9191
matcher: Matcher,
9292
target: At | Me,
93-
event_session: EventSession,
93+
event_session: Uninfo,
9494
template: Template | None = None,
9595
):
9696
async with trigger(
@@ -103,7 +103,7 @@ async def _( # noqa: PLR0913
103103
bind = await query_bind_info(
104104
session=session,
105105
user=await get_user(
106-
event_session.platform, target.target if isinstance(target, At) else event.get_user_id()
106+
event_session.scope, target.target if isinstance(target, At) else event.get_user_id()
107107
),
108108
game_platform=GAME_TYPE,
109109
)
@@ -120,7 +120,7 @@ async def _( # noqa: PLR0913
120120

121121

122122
@alc.assign('TETRIO.query')
123-
async def _(user: NBUser, account: Player, event_session: EventSession, template: Template | None = None):
123+
async def _(user: NBUser, account: Player, event_session: Uninfo, template: Template | None = None):
124124
async with trigger(
125125
session_persist_id=await get_session_persist_id(event_session),
126126
game_platform=GAME_TYPE,

0 commit comments

Comments
 (0)