diff --git a/src/plugins/nonebot_bison/config/db_model.py b/src/plugins/nonebot_bison/config/db_model.py index 75faa12..17a122c 100644 --- a/src/plugins/nonebot_bison/config/db_model.py +++ b/src/plugins/nonebot_bison/config/db_model.py @@ -3,7 +3,7 @@ from datetime import datetime from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship from sqlalchemy.sql.schema import Column, ForeignKey, UniqueConstraint -from sqlalchemy.sql.sqltypes import JSON, DateTime, Integer, String +from sqlalchemy.sql.sqltypes import JSON, DateTime, Integer, String, Time Base = declarative_base() @@ -29,11 +29,22 @@ class Target(Base): platform_name = Column(String(20), nullable=False) target = Column(String(1024), nullable=False) target_name = Column(String(1024), nullable=False) - last_schedule_time = Column( - DateTime(timezone=True), default=datetime(year=2000, month=1, day=1) - ) + default_schedule_weight = Column(Integer, default=10) subscribes = relationship("Subscribe", back_populates="target") + time_weight = relationship("ScheduleTimeWeight", back_populates="target") + + +class ScheduleTimeWeight(Base): + __tablename__ = "schedule_time_weight" + + id = Column(Integer, primary_key=True, autoincrement=True) + target_id = Column(Integer, ForeignKey(Target.id)) + start_time = Column(Time) + end_time = Column(Time) + weight = Column(Integer) + + target = relationship("Target", back_populates="time_weight") class Subscribe(Base): diff --git a/src/plugins/nonebot_bison/config/migrate/versions/5f3370328e44_add_time_weight_table.py b/src/plugins/nonebot_bison/config/migrate/versions/5f3370328e44_add_time_weight_table.py new file mode 100644 index 0000000..1b873b3 --- /dev/null +++ b/src/plugins/nonebot_bison/config/migrate/versions/5f3370328e44_add_time_weight_table.py @@ -0,0 +1,51 @@ +"""add time-weight table + +Revision ID: 5f3370328e44 +Revises: a333d6224193 +Create Date: 2022-05-31 22:05:13.235981 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "5f3370328e44" +down_revision = "a333d6224193" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "schedule_time_weight", + sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), + sa.Column("target_id", sa.Integer(), nullable=True), + sa.Column("start_time", sa.Time(), nullable=True), + sa.Column("end_time", sa.Time(), nullable=True), + sa.Column("weight", sa.Integer(), nullable=True), + sa.ForeignKeyConstraint( + ["target_id"], + ["target.id"], + ), + sa.PrimaryKeyConstraint("id"), + ) + with op.batch_alter_table("target", schema=None) as batch_op: + batch_op.add_column( + sa.Column("default_schedule_weight", sa.Integer(), nullable=True) + ) + batch_op.drop_column("last_schedule_time") + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("target", schema=None) as batch_op: + batch_op.add_column( + sa.Column("last_schedule_time", sa.DATETIME(), nullable=True) + ) + batch_op.drop_column("default_schedule_weight") + + op.drop_table("schedule_time_weight") + # ### end Alembic commands ### diff --git a/src/plugins/nonebot_bison/scheduler.py b/src/plugins/nonebot_bison/scheduler.py deleted file mode 100644 index 64ec4e4..0000000 --- a/src/plugins/nonebot_bison/scheduler.py +++ /dev/null @@ -1,93 +0,0 @@ -import logging - -import nonebot -from apscheduler.schedulers.asyncio import AsyncIOScheduler -from nonebot import get_driver -from nonebot.adapters.onebot.v11.bot import Bot -from nonebot.log import LoguruHandler, logger - -from .config import config -from .platform import platform_manager -from .plugin_config import plugin_config -from .send import do_send_msgs, send_msgs -from .types import UserSubInfo - -scheduler = AsyncIOScheduler(timezone="Asia/Shanghai") - - -@get_driver().on_startup -async def _start(): - for platform_name, platform in platform_manager.items(): - if platform.schedule_type in ["cron", "interval", "date"]: - logger.info( - f"start scheduler for {platform_name} with {platform.schedule_type} {platform.schedule_kw}" - ) - scheduler.add_job( - fetch_and_send, - platform.schedule_type, - **platform.schedule_kw, - args=(platform_name,), - ) - - scheduler.configure({"apscheduler.timezone": "Asia/Shanghai"}) - scheduler.start() - - -# get_driver().on_startup(_start) - - -async def fetch_and_send(target_type: str): - target = config.get_next_target(target_type) - if not target: - return - logger.debug( - "try to fecth new posts from {}, target: {}".format(target_type, target) - ) - send_user_list = config.target_user_cache[target_type][target] - send_userinfo_list = list( - map( - lambda user: UserSubInfo( - user, - lambda target: config.get_sub_category( - target_type, target, user.user_type, user.user - ), - lambda target: config.get_sub_tags( - target_type, target, user.user_type, user.user - ), - ), - send_user_list, - ) - ) - to_send = await platform_manager[target_type].do_fetch_new_post( - target, send_userinfo_list - ) - if not to_send: - return - bot = nonebot.get_bot() - assert isinstance(bot, Bot) - for user, send_list in to_send: - for send_post in send_list: - logger.info("send to {}: {}".format(user, send_post)) - if not bot: - logger.warning("no bot connected") - else: - await send_msgs( - bot, user.user, user.user_type, await send_post.generate_messages() - ) - - -class CustomLogHandler(LoguruHandler): - def filter(self, record: logging.LogRecord): - return record.msg != ( - 'Execution of job "%s" ' - "skipped: maximum number of running instances reached (%d)" - ) - - -if plugin_config.bison_use_queue: - scheduler.add_job(do_send_msgs, "interval", seconds=0.3, coalesce=True) - - aps_logger = logging.getLogger("apscheduler") - aps_logger.setLevel(30) - aps_logger.handlers.clear() - aps_logger.addHandler(CustomLogHandler()) diff --git a/src/plugins/nonebot_bison/scheduler/__init__.py b/src/plugins/nonebot_bison/scheduler/__init__.py new file mode 100644 index 0000000..46bfa64 --- /dev/null +++ b/src/plugins/nonebot_bison/scheduler/__init__.py @@ -0,0 +1 @@ +from .scheduler_config import SchedulerConfig diff --git a/src/plugins/nonebot_bison/scheduler/old_sched.py b/src/plugins/nonebot_bison/scheduler/old_sched.py index 0219f74..64ec4e4 100644 --- a/src/plugins/nonebot_bison/scheduler/old_sched.py +++ b/src/plugins/nonebot_bison/scheduler/old_sched.py @@ -58,7 +58,7 @@ async def fetch_and_send(target_type: str): send_user_list, ) ) - to_send = await platform_manager[target_type].fetch_new_post( + to_send = await platform_manager[target_type].do_fetch_new_post( target, send_userinfo_list ) if not to_send: diff --git a/src/plugins/nonebot_bison/scheduler/scheduler_config.py b/src/plugins/nonebot_bison/scheduler/scheduler_config.py new file mode 100644 index 0000000..8af28e4 --- /dev/null +++ b/src/plugins/nonebot_bison/scheduler/scheduler_config.py @@ -0,0 +1,12 @@ +from typing import Literal, Type + + +class SchedulerConfig: + + schedule_type: Literal["date", "interval", "cron"] + schedule_setting: dict + registry: dict[str, Type["SchedulerConfig"]] = {} + + def __init_subclass__(cls, *, name, **kwargs): + super().__init_subclass__(**kwargs) + cls.registry[name] = cls