♻️ cookie 组件不再与 user 关联

This commit is contained in:
suyiiyii 2024-08-31 23:07:43 +08:00
parent c828fd94e4
commit 1cd778c2e0
6 changed files with 85 additions and 50 deletions

View File

@ -259,14 +259,9 @@ class DBConfig:
) )
return res return res
async def get_cookie( async def get_cookie(self, platform_name: str = None, target: T_Target = None) -> list[Cookie]:
self, user: PlatformTarget = None, platform_name: str = None, target: T_Target = None
) -> list[Cookie]:
async with create_session() as sess: async with create_session() as sess:
query = select(Cookie).distinct().join(User) query = select(Cookie).distinct()
if user:
user_id = await sess.scalar(select(User.id).where(User.user_target == model_dump(user)))
query = query.where(Cookie.user_id == user_id)
if platform_name: if platform_name:
query = query.where(Cookie.platform_name == platform_name) query = query.where(Cookie.platform_name == platform_name)
query = query.outerjoin(CookieTarget).options(selectinload(Cookie.targets)) query = query.outerjoin(CookieTarget).options(selectinload(Cookie.targets))
@ -277,24 +272,9 @@ class DBConfig:
res = [cookie for cookie in res if cookie.id in ids] res = [cookie for cookie in res if cookie.id in ids]
return res return res
async def get_cookie_by_user_and_platform(self, user: PlatformTarget, platform_name: str) -> list[Cookie]: async def add_cookie(self, platform_name: str, content: str) -> int:
async with create_session() as sess: async with create_session() as sess:
res = await sess.scalar( cookie = Cookie(platform_name=platform_name, content=content)
select(User)
.where(User.user_target == model_dump(user))
.join(Cookie)
.where(Cookie.platform_name == platform_name)
.outerjoin(CookieTarget)
.options(selectinload(User.cookies))
)
if not res:
return []
return res.cookies
async def add_cookie(self, user: PlatformTarget, platform_name: str, content: str) -> int:
async with create_session() as sess:
user_obj = await sess.scalar(select(User).where(User.user_target == model_dump(user)))
cookie = Cookie(user=user_obj, platform_name=platform_name, content=content)
sess.add(cookie) sess.add(cookie)
await sess.commit() await sess.commit()
await sess.refresh(cookie) await sess.refresh(cookie)

View File

@ -20,7 +20,6 @@ class User(Model):
user_target: Mapped[dict] = mapped_column(JSON().with_variant(JSONB, "postgresql")) user_target: Mapped[dict] = mapped_column(JSON().with_variant(JSONB, "postgresql"))
subscribes: Mapped[list["Subscribe"]] = relationship(back_populates="user") subscribes: Mapped[list["Subscribe"]] = relationship(back_populates="user")
cookies: Mapped[list["Cookie"]] = relationship(back_populates="user")
@property @property
def saa_target(self) -> PlatformTarget: def saa_target(self) -> PlatformTarget:
@ -73,14 +72,12 @@ class Subscribe(Model):
class Cookie(Model): class Cookie(Model):
id: Mapped[int] = mapped_column(primary_key=True) id: Mapped[int] = mapped_column(primary_key=True)
user_id: Mapped[int] = mapped_column(ForeignKey("nonebot_bison_user.id"))
platform_name: Mapped[str] = mapped_column(String(20)) platform_name: Mapped[str] = mapped_column(String(20))
content: Mapped[str] = mapped_column(String(1024)) content: Mapped[str] = mapped_column(String(1024))
last_usage: Mapped[datetime.datetime] = mapped_column(DateTime, default=datetime.datetime(1970, 1, 1)) last_usage: Mapped[datetime.datetime] = mapped_column(DateTime, default=datetime.datetime(1970, 1, 1))
status: Mapped[str] = mapped_column(String(20), default="") status: Mapped[str] = mapped_column(String(20), default="")
tags: Mapped[dict[str, Any]] = mapped_column(JSON().with_variant(JSONB, "postgresql"), default={}) tags: Mapped[dict[str, Any]] = mapped_column(JSON().with_variant(JSONB, "postgresql"), default={})
user: Mapped[User] = relationship(back_populates="cookies")
targets: Mapped[list["CookieTarget"]] = relationship(back_populates="cookie") targets: Mapped[list["CookieTarget"]] = relationship(back_populates="cookie")

View File

@ -0,0 +1,59 @@
"""empty message
Revision ID: 590dc2911ea7
Revises: f9baef347cc8
Create Date: 2024-08-31 23:06:02.123932
"""
import sqlalchemy as sa
from alembic import op
from sqlalchemy import Text
from sqlalchemy.dialects import postgresql
# revision identifiers, used by Alembic.
revision = "590dc2911ea7"
down_revision = "f9baef347cc8"
branch_labels = None
depends_on = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table(
"nonebot_bison_cookie",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("platform_name", sa.String(length=20), nullable=False),
sa.Column("content", sa.String(length=1024), nullable=False),
sa.Column("last_usage", sa.DateTime(), nullable=False),
sa.Column("status", sa.String(length=20), nullable=False),
sa.Column("tags", sa.JSON().with_variant(postgresql.JSONB(astext_type=Text()), "postgresql"), nullable=False),
sa.PrimaryKeyConstraint("id", name=op.f("pk_nonebot_bison_cookie")),
)
op.create_table(
"nonebot_bison_cookietarget",
sa.Column("id", sa.Integer(), nullable=False),
sa.Column("target_id", sa.Integer(), nullable=False),
sa.Column("cookie_id", sa.Integer(), nullable=False),
sa.ForeignKeyConstraint(
["cookie_id"],
["nonebot_bison_cookie.id"],
name=op.f("fk_nonebot_bison_cookietarget_cookie_id_nonebot_bison_cookie"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["target_id"],
["nonebot_bison_target.id"],
name=op.f("fk_nonebot_bison_cookietarget_target_id_nonebot_bison_target"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_nonebot_bison_cookietarget")),
)
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("nonebot_bison_cookietarget")
op.drop_table("nonebot_bison_cookie")
# ### end Alembic commands ###

View File

@ -1,21 +1,18 @@
from nonebot.typing import T_State from nonebot.typing import T_State
from nonebot.matcher import Matcher from nonebot.matcher import Matcher
from nonebot.params import Arg, ArgPlainText from nonebot.params import Arg, ArgPlainText
from nonebot_plugin_saa import PlatformTarget
from nonebot.adapters import Message, MessageTemplate from nonebot.adapters import Message, MessageTemplate
from ..types import Target from ..types import Target
from ..config import config from ..config import config
from ..platform import platform_manager from ..platform import platform_manager
from ..apis import check_sub_target_cookie from ..apis import check_sub_target_cookie
from .utils import common_platform, ensure_user_info, gen_handle_cancel from .utils import common_platform, gen_handle_cancel
def do_add_cookie(add_cookie: type[Matcher]): def do_add_cookie(add_cookie: type[Matcher]):
handle_cancel = gen_handle_cancel(add_cookie, "已中止添加cookie") handle_cancel = gen_handle_cancel(add_cookie, "已中止添加cookie")
add_cookie.handle()(ensure_user_info(add_cookie))
@add_cookie.handle() @add_cookie.handle()
async def init_promote(state: T_State): async def init_promote(state: T_State):
state["_prompt"] = ( state["_prompt"] = (
@ -56,8 +53,8 @@ def do_add_cookie(add_cookie: type[Matcher]):
state["name"] = await check_sub_target_cookie(state["platform"], Target(""), cookie_text) state["name"] = await check_sub_target_cookie(state["platform"], Target(""), cookie_text)
@add_cookie.handle() @add_cookie.handle()
async def add_cookie_process(state: T_State, user: PlatformTarget = Arg("target_user_info")): async def add_cookie_process(state: T_State):
await config.add_cookie(user, state["platform"], state["cookie"]) await config.add_cookie(state["platform"], state["cookie"])
await add_cookie.finish( await add_cookie.finish(
f"已添加 Cookie: {state['cookie']} 到平台 {state['platform']}" + "\n请使用“关联cookie”为 Cookie 关联订阅" f"已添加 Cookie: {state['cookie']} 到平台 {state['platform']}" + "\n请使用“关联cookie”为 Cookie 关联订阅"
) )

View File

@ -1,25 +1,21 @@
from nonebot.typing import T_State from nonebot.typing import T_State
from nonebot.matcher import Matcher from nonebot.matcher import Matcher
from nonebot.params import Arg, ArgPlainText from nonebot.params import ArgPlainText
from nonebot_plugin_saa import MessageFactory
from nonebot.internal.adapter import MessageTemplate from nonebot.internal.adapter import MessageTemplate
from nonebot_plugin_saa import MessageFactory, PlatformTarget
from ..config import config from ..config import config
from ..utils import parse_text from ..utils import parse_text
from ..apis import get_cookie_friendly_name from ..apis import get_cookie_friendly_name
from .utils import ensure_user_info, gen_handle_cancel, generate_sub_list_text from .utils import gen_handle_cancel, generate_sub_list_text
def do_add_cookie_target(add_cookie_target_matcher: type[Matcher]): def do_add_cookie_target(add_cookie_target_matcher: type[Matcher]):
handle_cancel = gen_handle_cancel(add_cookie_target_matcher, "已中止关联 cookie") handle_cancel = gen_handle_cancel(add_cookie_target_matcher, "已中止关联 cookie")
add_cookie_target_matcher.handle()(ensure_user_info(add_cookie_target_matcher))
@add_cookie_target_matcher.handle() @add_cookie_target_matcher.handle()
async def init_promote(state: T_State, user_info: PlatformTarget = Arg("target_user_info")): async def init_promote(state: T_State):
res = await generate_sub_list_text( res = await generate_sub_list_text(add_cookie_target_matcher, state, is_index=True, is_show_cookie=True)
add_cookie_target_matcher, state, user_info, is_index=True, is_show_cookie=True
)
res += "请输入要关联 cookie 的订阅的序号\n输入'取消'中止" res += "请输入要关联 cookie 的订阅的序号\n输入'取消'中止"
await MessageFactory(await parse_text(res)).send() await MessageFactory(await parse_text(res)).send()
@ -34,11 +30,8 @@ def do_add_cookie_target(add_cookie_target_matcher: type[Matcher]):
@add_cookie_target_matcher.handle() @add_cookie_target_matcher.handle()
async def init_promote_cookie(state: T_State): async def init_promote_cookie(state: T_State):
cookies = await config.get_cookie( cookies = await config.get_cookie(platform_name=state["target"]["platform_name"])
user=state["target_user_info"], platform_name=state["target"]["platform_name"]
)
associated_cookies = await config.get_cookie( associated_cookies = await config.get_cookie(
user=state["target_user_info"],
target=state["target"]["target"], target=state["target"]["target"],
platform_name=state["target"]["platform_name"], platform_name=state["target"]["platform_name"],
) )
@ -62,7 +55,7 @@ def do_add_cookie_target(add_cookie_target_matcher: type[Matcher]):
await add_cookie_target_matcher.reject("序号错误") await add_cookie_target_matcher.reject("序号错误")
@add_cookie_target_matcher.handle() @add_cookie_target_matcher.handle()
async def add_cookie_target_process(state: T_State, user: PlatformTarget = Arg("target_user_info")): async def add_cookie_target_process(state: T_State):
await config.add_cookie_target(state["target"]["target"], state["target"]["platform_name"], state["cookie"].id) await config.add_cookie_target(state["target"]["target"], state["target"]["platform_name"], state["cookie"].id)
await add_cookie_target_matcher.finish( await add_cookie_target_matcher.finish(
f"已关联 Cookie: {await get_cookie_friendly_name(state['cookie'])} " f"已关联 Cookie: {await get_cookie_friendly_name(state['cookie'])} "

View File

@ -1,5 +1,7 @@
import contextlib import contextlib
from typing import Annotated from typing import Annotated
from itertools import groupby
from operator import attrgetter
from nonebot.rule import Rule from nonebot.rule import Rule
from nonebot.adapters import Event from nonebot.adapters import Event
@ -66,9 +68,16 @@ def admin_permission():
async def generate_sub_list_text( async def generate_sub_list_text(
matcher: type[Matcher], state: T_State, user_info: PlatformTarget, is_index=False, is_show_cookie=False matcher: type[Matcher], state: T_State, user_info: PlatformTarget = None, is_index=False, is_show_cookie=False
): ):
sub_list = await config.list_subscribe(user_info) if user_info:
sub_list = await config.list_subscribe(user_info)
else:
sub_list = await config.list_subs_with_all_info()
sub_list = [
next(group)
for key, group in groupby(sorted(sub_list, key=attrgetter("target_id")), key=attrgetter("target_id"))
]
if not sub_list: if not sub_list:
await matcher.finish("暂无已订阅账号\n请使用“添加订阅”命令添加订阅") await matcher.finish("暂无已订阅账号\n请使用“添加订阅”命令添加订阅")
res = "订阅的帐号为:\n" res = "订阅的帐号为:\n"
@ -88,7 +97,7 @@ async def generate_sub_list_text(
res += " {}".format(", ".join(sub.tags)) + "\n" res += " {}".format(", ".join(sub.tags)) + "\n"
if is_show_cookie: if is_show_cookie:
target_cookies = await config.get_cookie( target_cookies = await config.get_cookie(
user=user_info, target=sub.target.target, platform_name=sub.target.platform_name target=sub.target.target, platform_name=sub.target.platform_name
) )
if target_cookies: if target_cookies:
res += " 关联的 Cookie\n" res += " 关联的 Cookie\n"