Skip to content

♻️ 迁移至 nonebot_plugin_uninfo #542

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions nonebot_plugin_tetris_stats/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,8 @@
'nonebot_plugin_apscheduler',
'nonebot_plugin_localstore',
'nonebot_plugin_orm',
'nonebot_plugin_session_orm',
'nonebot_plugin_session',
'nonebot_plugin_uninfo',
'nonebot_plugin_user',
'nonebot_plugin_userinfo',
'nonebot_plugin_waiter',
}

Expand Down
3 changes: 2 additions & 1 deletion nonebot_plugin_tetris_stats/config/config.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from nonebot import get_plugin_config
from nonebot import get_driver, get_plugin_config
from nonebot_plugin_localstore import get_plugin_cache_dir, get_plugin_data_dir
from pydantic import BaseModel, Field

Expand Down Expand Up @@ -26,3 +26,4 @@ class Config(BaseModel):


config = get_plugin_config(Config)
global_config = get_driver().config
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"""Create a new table

迁移 ID: 612d8b00d9ac
父迁移: 5a1b93948494
创建时间: 2025-05-26 04:49:29.664480

"""

from __future__ import annotations

from typing import TYPE_CHECKING

import sqlalchemy as sa
from alembic import op

if TYPE_CHECKING:
from collections.abc import Sequence

revision: str = '612d8b00d9ac'
down_revision: str | Sequence[str] | None = '5a1b93948494'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def upgrade(name: str = '') -> None:
if name:
return
op.create_table(
'nonebot_plugin_tetris_stats_triggerhistoricaldatav2',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('trigger_time', sa.DateTime(), nullable=False),
sa.Column('session_persist_id', sa.Integer(), nullable=False),
sa.Column('game_platform', sa.String(length=32), nullable=False),
sa.Column('command_type', sa.String(length=16), nullable=False),
sa.Column('command_args', sa.JSON(), nullable=False),
sa.Column('finish_time', sa.DateTime(), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk_nonebot_plugin_tetris_stats_triggerhistoricaldatav2')),
info={'bind_key': 'nonebot_plugin_tetris_stats'},
)
with op.batch_alter_table('nonebot_plugin_tetris_stats_triggerhistoricaldatav2', schema=None) as batch_op:
batch_op.create_index(
batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_command_type'),
['command_type'],
unique=False,
)
batch_op.create_index(
batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_game_platform'),
['game_platform'],
unique=False,
)


def downgrade(name: str = '') -> None:
if name:
return
with op.batch_alter_table('nonebot_plugin_tetris_stats_triggerhistoricaldatav2', schema=None) as batch_op:
batch_op.drop_index(batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_game_platform'))
batch_op.drop_index(batch_op.f('ix_nonebot_plugin_tetris_stats_triggerhistoricaldatav2_command_type'))

op.drop_table('nonebot_plugin_tetris_stats_triggerhistoricaldatav2')
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
"""Migrate to uninfo

迁移 ID: 766cc7e75a62
父迁移: 612d8b00d9ac
创建时间: 2025-05-26 04:51:54.665200

"""

from __future__ import annotations

import math
from typing import TYPE_CHECKING

from alembic import op
from nonebot.log import logger
from rich.progress import BarColumn, Progress, SpinnerColumn, TaskProgressColumn, TextColumn
from sqlalchemy import inspect
from sqlalchemy.ext.automap import automap_base
from sqlalchemy.orm import Session

if TYPE_CHECKING:
from collections.abc import Sequence

revision: str = '766cc7e75a62'
down_revision: str | Sequence[str] | None = '612d8b00d9ac'
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None


def data_migrate() -> None:
conn = op.get_bind()
insp = inspect(conn)
table_names = insp.get_table_names()
if 'nonebot_plugin_tetris_stats_triggerhistoricaldata' not in table_names:
return

Base = automap_base() # noqa: N806
Base.prepare(autoload_with=conn)
TriggerHistoricalData = Base.classes.nonebot_plugin_tetris_stats_triggerhistoricaldata # noqa: N806
TriggerHistoricalDataV2 = Base.classes.nonebot_plugin_tetris_stats_triggerhistoricaldatav2 # noqa: N806

with Session(conn) as db_session:
count = db_session.query(TriggerHistoricalData).count()
if count == 0:
return

try:
from nonebot_session_to_uninfo import check_tables, get_id_map # type: ignore[import-untyped]
except ImportError as err:
msg = '请安装 `nonebot-session-to-uninfo` 以迁移数据'
raise ValueError(msg) from err

check_tables()

migration_limit = 10000 # 每次迁移的数据量为 10000 条
last_id = -1
id_map: dict[int, int] = {}

logger.warning('tetris_stats: 正在迁移数据, 请不要关闭程序...')

with Progress(
SpinnerColumn(),
TextColumn('[progress.description]{task.description}'),
BarColumn(),
TaskProgressColumn(),
) as progress:
task = progress.add_task('迁移数据...', total=count)

for _ in range(math.ceil(count / migration_limit)):
records = (
db_session.query(TriggerHistoricalData)
.order_by(TriggerHistoricalData.id)
.where(TriggerHistoricalData.id > last_id)
.limit(migration_limit)
.all()
)
last_id = records[-1].id

session_ids = [
record.session_persist_id for record in records if record.session_persist_id not in id_map
]
if session_ids:
id_map.update(get_id_map(session_ids))

db_session.add_all(
TriggerHistoricalDataV2(
id=record.id,
session_persist_id=id_map[record.session_persist_id],
trigger_time=record.trigger_time,
game_platform=record.game_platform,
command_type=record.command_type,
command_args=record.command_args,
finish_time=record.finish_time,
)
for record in records
)

progress.update(task, advance=len(records))

db_session.commit()

logger.success('tetris_stats: 数据迁移完成!')


def upgrade(name: str = '') -> None:
if name:
return
data_migrate()


def downgrade(name: str = '') -> None:
if name:
return
4 changes: 2 additions & 2 deletions nonebot_plugin_tetris_stats/db/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from sqlalchemy import select

from ..utils.typedefs import AllCommandType, BaseCommandType, GameType, TETRIOCommandType
from .models import Bind, TriggerHistoricalData
from .models import Bind, TriggerHistoricalDataV2

UTC = timezone.utc

Expand Down Expand Up @@ -139,7 +139,7 @@ async def trigger(
except FinishedException:
async with get_session() as session:
session.add(
TriggerHistoricalData(
TriggerHistoricalDataV2(
trigger_time=trigger_time,
session_persist_id=session_persist_id,
game_platform=game_platform,
Expand Down
2 changes: 1 addition & 1 deletion nonebot_plugin_tetris_stats/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ class Bind(MappedAsDataclass, Model):
game_account: Mapped[str]


class TriggerHistoricalData(MappedAsDataclass, Model):
class TriggerHistoricalDataV2(MappedAsDataclass, Model):
id: Mapped[int] = mapped_column(init=False, primary_key=True)
trigger_time: Mapped[datetime] = mapped_column(DateTime)
session_persist_id: Mapped[int]
Expand Down
21 changes: 15 additions & 6 deletions nonebot_plugin_tetris_stats/games/tetrio/bind.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
from hashlib import md5
from secrets import choice

from arclet.alconna import Arg, ArgFlag
from nonebot_plugin_alconna import Args, Subcommand
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_session import EventSession
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
from nonebot_plugin_uninfo import QryItrface, Uninfo
from nonebot_plugin_uninfo import User as UninfoUser
from nonebot_plugin_uninfo.orm import get_session_persist_id
from nonebot_plugin_user import User
from nonebot_plugin_userinfo import BotUserInfo, UserInfo
from yarl import URL

from ...config.config import global_config
from ...db import BindStatus, create_or_update_bind, trigger
from ...utils.host import HostPage, get_self_netloc
from ...utils.image import get_avatar
Expand Down Expand Up @@ -44,7 +46,7 @@


@alc.assign('TETRIO.bind')
async def _(nb_user: User, account: Player, event_session: EventSession, bot_info: UserInfo = BotUserInfo()): # noqa: B008
async def _(nb_user: User, account: Player, event_session: Uninfo, interface: QryItrface):
async with trigger(
session_persist_id=await get_session_persist_id(event_session),
game_platform=GAME_TYPE,
Expand Down Expand Up @@ -77,8 +79,15 @@ async def _(nb_user: User, account: Player, event_session: EventSession, bot_inf
name=user.name.upper(),
),
bot=People(
avatar=await get_avatar(bot_info, 'Data URI', '../../static/logo/logo.svg'),
name=bot_info.user_name,
avatar=await get_avatar(
(
bot_user := await interface.get_user(event_session.self_id)
or UninfoUser(id=event_session.self_id)
),
'Data URI',
'../../static/logo/logo.svg',
),
name=bot_user.nick or bot_user.name or choice(list(global_config.nickname) or ['bot']),
),
prompt='io查我',
lang=get_lang(),
Expand Down
6 changes: 3 additions & 3 deletions nonebot_plugin_tetris_stats/games/tetrio/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
from nonebot_plugin_alconna import Option, Subcommand
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_orm import async_scoped_session
from nonebot_plugin_session import EventSession
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_uninfo.orm import get_session_persist_id
from nonebot_plugin_user import User
from sqlalchemy import select

Expand Down Expand Up @@ -34,7 +34,7 @@


@alc.assign('TETRIO.config')
async def _(user: User, session: async_scoped_session, event_session: EventSession, template: Template):
async def _(user: User, session: async_scoped_session, event_session: Uninfo, template: Template):
async with trigger(
session_persist_id=await get_session_persist_id(event_session),
game_platform=GAME_TYPE,
Expand Down
6 changes: 3 additions & 3 deletions nonebot_plugin_tetris_stats/games/tetrio/list.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from nonebot_plugin_alconna import Args, Option, Subcommand
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_session import EventSession
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_uninfo.orm import get_session_persist_id

from ...db import trigger
from ...utils.host import HostPage, get_self_netloc
Expand Down Expand Up @@ -32,7 +32,7 @@

@alc.assign('TETRIO.list')
async def _(
event_session: EventSession,
event_session: Uninfo,
max_tr: float | None = None,
min_tr: float | None = None,
limit: int | None = None,
Expand Down
10 changes: 5 additions & 5 deletions nonebot_plugin_tetris_stats/games/tetrio/query/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from nonebot_plugin_alconna import Args, At, Option, Subcommand
from nonebot_plugin_alconna.uniseg import UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_session import EventSession
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_uninfo.orm import get_session_persist_id
from nonebot_plugin_user import User as NBUser
from nonebot_plugin_user import get_user
from sqlalchemy import select
Expand Down Expand Up @@ -90,7 +90,7 @@ async def _( # noqa: PLR0913
event: Event,
matcher: Matcher,
target: At | Me,
event_session: EventSession,
event_session: Uninfo,
template: Template | None = None,
):
async with trigger(
Expand All @@ -103,7 +103,7 @@ async def _( # noqa: PLR0913
bind = await query_bind_info(
session=session,
user=await get_user(
event_session.platform, target.target if isinstance(target, At) else event.get_user_id()
event_session.scope, target.target if isinstance(target, At) else event.get_user_id()
),
game_platform=GAME_TYPE,
)
Expand All @@ -120,7 +120,7 @@ async def _( # noqa: PLR0913


@alc.assign('TETRIO.query')
async def _(user: NBUser, account: Player, event_session: EventSession, template: Template | None = None):
async def _(user: NBUser, account: Player, event_session: Uninfo, template: Template | None = None):
async with trigger(
session_persist_id=await get_session_persist_id(event_session),
game_platform=GAME_TYPE,
Expand Down
6 changes: 3 additions & 3 deletions nonebot_plugin_tetris_stats/games/tetrio/rank/all.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
from arclet.alconna import Arg
from nonebot_plugin_alconna import Option, Subcommand, UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_session import EventSession
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_uninfo.orm import get_session_persist_id
from sqlalchemy import func, select
from sqlalchemy.orm import selectinload

Expand Down Expand Up @@ -33,7 +33,7 @@


@alc.assign('TETRIO.rank.all')
async def _(event_session: EventSession, template: Template | None = None):
async def _(event_session: Uninfo, template: Template | None = None):
async with trigger(
session_persist_id=await get_session_persist_id(event_session),
game_platform=GAME_TYPE,
Expand Down
6 changes: 3 additions & 3 deletions nonebot_plugin_tetris_stats/games/tetrio/rank/detail.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from nonebot import get_driver
from nonebot_plugin_alconna import Option, UniMessage
from nonebot_plugin_orm import get_session
from nonebot_plugin_session import EventSession
from nonebot_plugin_session_orm import get_session_persist_id # type: ignore[import-untyped]
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_uninfo.orm import get_session_persist_id
from sqlalchemy import func, select
from sqlalchemy.orm import selectinload

Expand All @@ -31,7 +31,7 @@


@alc.assign('TETRIO.rank')
async def _(rank: ValidRank, event_session: EventSession):
async def _(rank: ValidRank, event_session: Uninfo):
async with trigger(
session_persist_id=await get_session_persist_id(event_session),
game_platform=GAME_TYPE,
Expand Down
Loading