mirror of
https://github.com/suyiiyii/nonebot-bison.git
synced 2025-06-08 12:53:00 +08:00
update
This commit is contained in:
parent
b8af6d0024
commit
ea928bf3fc
@ -2,12 +2,14 @@ import { configureStore, ThunkAction, Action } from '@reduxjs/toolkit';
|
|||||||
import authReducer from '../features/auth/authSlice';
|
import authReducer from '../features/auth/authSlice';
|
||||||
import globalConfReducer from '../features/globalConf/globalConfSlice';
|
import globalConfReducer from '../features/globalConf/globalConfSlice';
|
||||||
import { subscribeApi } from '../features/subsribeConfigManager/subscribeConfigSlice';
|
import { subscribeApi } from '../features/subsribeConfigManager/subscribeConfigSlice';
|
||||||
|
import { weightApi } from '../features/weightConfig/weightConfigSlice';
|
||||||
|
|
||||||
export const store = configureStore({
|
export const store = configureStore({
|
||||||
reducer: {
|
reducer: {
|
||||||
auth: authReducer,
|
auth: authReducer,
|
||||||
globalConf: globalConfReducer,
|
globalConf: globalConfReducer,
|
||||||
[subscribeApi.reducerPath]: subscribeApi.reducer,
|
[subscribeApi.reducerPath]: subscribeApi.reducer,
|
||||||
|
[weightApi.reducerPath]: weightApi.reducer,
|
||||||
},
|
},
|
||||||
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(subscribeApi.middleware),
|
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(subscribeApi.middleware),
|
||||||
});
|
});
|
||||||
|
@ -1,18 +1,13 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { useGetSubsQuery, useDeleteSubMutation } from './subscribeConfigSlice';
|
import { useGetSubsQuery } from './subscribeConfigSlice';
|
||||||
|
|
||||||
export default function SubscribeManager() {
|
export default function SubscribeManager() {
|
||||||
const { data: subs } = useGetSubsQuery();
|
const { data: subs } = useGetSubsQuery();
|
||||||
const [patchSub] = useDeleteSubMutation();
|
|
||||||
|
|
||||||
const createNewSub = () => {
|
|
||||||
patchSub({ target: '2773976700', platformName: 'weibo', groupNumber: 868610060 }).unwrap();
|
|
||||||
};
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div>{ subs && JSON.stringify(subs) }</div>
|
<div>{ subs && JSON.stringify(subs) }</div>
|
||||||
<div>1</div>
|
<div>1</div>
|
||||||
<button onClick={() => createNewSub()} type="button">new</button>
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useGetWeightQuery } from './weightConfigSlice';
|
||||||
|
|
||||||
|
export default function WeightManager() {
|
||||||
|
const { data: weight } = useGetWeightQuery();
|
||||||
|
return (
|
||||||
|
<div>{weight && JSON.stringify(weight)}</div>
|
||||||
|
);
|
||||||
|
}
|
@ -0,0 +1,18 @@
|
|||||||
|
import { createApi } from '@reduxjs/toolkit/query/react';
|
||||||
|
import baseQueryWithAuth from '../auth/authQuery';
|
||||||
|
|
||||||
|
export const weightApi = createApi({
|
||||||
|
reducerPath: 'weight',
|
||||||
|
baseQuery: baseQueryWithAuth,
|
||||||
|
tagTypes: ['Weight'],
|
||||||
|
endpoints: (builder) => ({
|
||||||
|
getWeight: builder.query<any, void>({
|
||||||
|
query: () => '/weight',
|
||||||
|
providesTags: ['Weight'],
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
export const {
|
||||||
|
useGetWeightQuery,
|
||||||
|
} = weightApi;
|
@ -1,11 +1,12 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import SubscribeManager from '../features/subsribeConfigManager/SubscribeManager';
|
// import SubscribeManager from '../features/subsribeConfigManager/SubscribeManager';
|
||||||
|
import WeightManager from '../features/weightConfig/WeightManager';
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div>hoem</div>
|
<div>hoem</div>
|
||||||
<SubscribeManager />
|
<WeightManager />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -52,3 +52,9 @@ export interface SubmitParam {
|
|||||||
groupNumber: number;
|
groupNumber: number;
|
||||||
sub: SubscribeConfig;
|
sub: SubscribeConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface TimeWeightConfig {
|
||||||
|
start_time: string;
|
||||||
|
end_time: string;
|
||||||
|
weight: number;
|
||||||
|
}
|
||||||
|
@ -14,6 +14,7 @@ from nonebot.rule import to_me
|
|||||||
from nonebot.typing import T_State
|
from nonebot.typing import T_State
|
||||||
|
|
||||||
from ..plugin_config import plugin_config
|
from ..plugin_config import plugin_config
|
||||||
|
from ..types import WeightConfig
|
||||||
from .api import (
|
from .api import (
|
||||||
add_group_sub,
|
add_group_sub,
|
||||||
auth,
|
auth,
|
||||||
@ -21,8 +22,10 @@ from .api import (
|
|||||||
get_global_conf,
|
get_global_conf,
|
||||||
get_subs_info,
|
get_subs_info,
|
||||||
get_target_name,
|
get_target_name,
|
||||||
|
get_weight_config,
|
||||||
test,
|
test,
|
||||||
update_group_sub,
|
update_group_sub,
|
||||||
|
update_weigth_config,
|
||||||
)
|
)
|
||||||
from .jwt import load_jwt
|
from .jwt import load_jwt
|
||||||
from .token_manager import token_manager as tm
|
from .token_manager import token_manager as tm
|
||||||
@ -32,6 +35,7 @@ GLOBAL_CONF_URL = f"{URL_BASE}api/global_conf"
|
|||||||
AUTH_URL = f"{URL_BASE}api/auth"
|
AUTH_URL = f"{URL_BASE}api/auth"
|
||||||
SUBSCRIBE_URL = f"{URL_BASE}api/subs"
|
SUBSCRIBE_URL = f"{URL_BASE}api/subs"
|
||||||
GET_TARGET_NAME_URL = f"{URL_BASE}api/target_name"
|
GET_TARGET_NAME_URL = f"{URL_BASE}api/target_name"
|
||||||
|
WEIGHT_URL = f"{URL_BASE}api/weight"
|
||||||
TEST_URL = f"{URL_BASE}test"
|
TEST_URL = f"{URL_BASE}test"
|
||||||
|
|
||||||
STATIC_PATH = (Path(__file__).parent / "dist").resolve()
|
STATIC_PATH = (Path(__file__).parent / "dist").resolve()
|
||||||
@ -74,6 +78,10 @@ def register_router_fastapi(driver: Driver, socketio):
|
|||||||
return
|
return
|
||||||
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
|
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
|
async def check_is_superuser(token_obj: dict = Depends(get_jwt_obj)):
|
||||||
|
if token_obj.get("type") != "admin":
|
||||||
|
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class AddSubscribeReq:
|
class AddSubscribeReq:
|
||||||
platformName: str
|
platformName: str
|
||||||
@ -124,6 +132,14 @@ def register_router_fastapi(driver: Driver, socketio):
|
|||||||
async def _del_group_subs(groupNumber: int, target: str, platformName: str):
|
async def _del_group_subs(groupNumber: int, target: str, platformName: str):
|
||||||
return await del_group_sub(groupNumber, platformName, target)
|
return await del_group_sub(groupNumber, platformName, target)
|
||||||
|
|
||||||
|
@app.get(WEIGHT_URL, dependencies=[Depends(check_is_superuser)])
|
||||||
|
async def _get_weight_config():
|
||||||
|
return await get_weight_config()
|
||||||
|
|
||||||
|
@app.patch(WEIGHT_URL, dependencies=[Depends(check_is_superuser)])
|
||||||
|
async def _update_weight_config(platformName: str, target: str, req: WeightConfig):
|
||||||
|
return await update_weigth_config(platformName, target, req)
|
||||||
|
|
||||||
app.mount(URL_BASE, SinglePageApplication(directory=static_path), name="bison")
|
app.mount(URL_BASE, SinglePageApplication(directory=static_path), name="bison")
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,9 +1,15 @@
|
|||||||
import nonebot
|
import nonebot
|
||||||
from nonebot.adapters.onebot.v11.bot import Bot
|
from nonebot.adapters.onebot.v11.bot import Bot
|
||||||
|
|
||||||
from ..config import NoSuchSubscribeException, NoSuchUserException, config
|
from ..config import (
|
||||||
|
NoSuchSubscribeException,
|
||||||
|
NoSuchTargetException,
|
||||||
|
NoSuchUserException,
|
||||||
|
config,
|
||||||
|
)
|
||||||
from ..platform import check_sub_target, platform_manager
|
from ..platform import check_sub_target, platform_manager
|
||||||
from ..types import Target as T_Target
|
from ..types import Target as T_Target
|
||||||
|
from ..types import WeightConfig
|
||||||
from .jwt import pack_jwt
|
from .jwt import pack_jwt
|
||||||
from .token_manager import token_manager
|
from .token_manager import token_manager
|
||||||
|
|
||||||
@ -47,6 +53,7 @@ async def auth(token: str):
|
|||||||
if str(qq) in nonebot.get_driver().config.superusers:
|
if str(qq) in nonebot.get_driver().config.superusers:
|
||||||
jwt_obj = {
|
jwt_obj = {
|
||||||
"id": qq,
|
"id": qq,
|
||||||
|
"type": "admin",
|
||||||
"groups": list(
|
"groups": list(
|
||||||
map(
|
map(
|
||||||
lambda info: {
|
lambda info: {
|
||||||
@ -65,7 +72,7 @@ async def auth(token: str):
|
|||||||
}
|
}
|
||||||
return {"status": 200, **ret_obj}
|
return {"status": 200, **ret_obj}
|
||||||
if admin_groups := await get_admin_groups(int(qq)):
|
if admin_groups := await get_admin_groups(int(qq)):
|
||||||
jwt_obj = {"id": str(qq), "groups": admin_groups}
|
jwt_obj = {"id": str(qq), "type": "user", "groups": admin_groups}
|
||||||
ret_obj = {
|
ret_obj = {
|
||||||
"type": "user",
|
"type": "user",
|
||||||
"name": nickname,
|
"name": nickname,
|
||||||
@ -147,3 +154,19 @@ async def update_group_sub(
|
|||||||
except (NoSuchUserException, NoSuchSubscribeException):
|
except (NoSuchUserException, NoSuchSubscribeException):
|
||||||
return {"status": 400, "msg": "更新错误"}
|
return {"status": 400, "msg": "更新错误"}
|
||||||
return {"status": 200, "msg": ""}
|
return {"status": 200, "msg": ""}
|
||||||
|
|
||||||
|
|
||||||
|
async def get_weight_config():
|
||||||
|
return await config.get_all_weight_config()
|
||||||
|
|
||||||
|
|
||||||
|
async def update_weigth_config(
|
||||||
|
platform_name: str, target: str, weight_config: WeightConfig
|
||||||
|
):
|
||||||
|
try:
|
||||||
|
await config.update_time_weight_config(
|
||||||
|
T_Target(target), platform_name, weight_config
|
||||||
|
)
|
||||||
|
except NoSuchTargetException:
|
||||||
|
return {"status": 400, "msg": "该订阅不存在"}
|
||||||
|
return {"status": 200, "msg": ""}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
from .config_legacy import NoSuchSubscribeException, NoSuchUserException
|
|
||||||
from .db import DATA
|
from .db import DATA
|
||||||
from .db_config import config
|
from .db_config import config
|
||||||
|
from .utils import NoSuchSubscribeException, NoSuchTargetException, NoSuchUserException
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from collections import defaultdict
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from datetime import datetime, time
|
from datetime import datetime, time
|
||||||
from typing import Any, Awaitable, Callable, Optional
|
from typing import Any, Awaitable, Callable, Optional
|
||||||
@ -8,11 +9,13 @@ from sqlalchemy.orm import selectinload
|
|||||||
from sqlalchemy.sql.expression import delete, select
|
from sqlalchemy.sql.expression import delete, select
|
||||||
from sqlalchemy.sql.functions import func
|
from sqlalchemy.sql.functions import func
|
||||||
|
|
||||||
from ..types import Category, Tag
|
from ..types import Category, PlatformWeightConfigResp, Tag
|
||||||
from ..types import Target as T_Target
|
from ..types import Target as T_Target
|
||||||
|
from ..types import TimeWeightConfig
|
||||||
from ..types import User as T_User
|
from ..types import User as T_User
|
||||||
from ..types import UserSubInfo
|
from ..types import UserSubInfo, WeightConfig
|
||||||
from .db_model import ScheduleTimeWeight, Subscribe, Target, User
|
from .db_model import ScheduleTimeWeight, Subscribe, Target, User
|
||||||
|
from .utils import NoSuchTargetException
|
||||||
|
|
||||||
|
|
||||||
def _get_time():
|
def _get_time():
|
||||||
@ -21,20 +24,6 @@ def _get_time():
|
|||||||
return cur_time
|
return cur_time
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class TimeWeightConfig:
|
|
||||||
start_time: time
|
|
||||||
end_time: time
|
|
||||||
weight: int
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
|
||||||
class WeightConfig:
|
|
||||||
|
|
||||||
default: int
|
|
||||||
time_config: list[TimeWeightConfig]
|
|
||||||
|
|
||||||
|
|
||||||
class DBConfig:
|
class DBConfig:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.add_target_hook: Optional[Callable[[str, T_Target], Awaitable]] = None
|
self.add_target_hook: Optional[Callable[[str, T_Target], Awaitable]] = None
|
||||||
@ -202,6 +191,8 @@ class DBConfig:
|
|||||||
Target.platform_name == platform_name, Target.target == target
|
Target.platform_name == platform_name, Target.target == target
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
if not targetObj:
|
||||||
|
raise NoSuchTargetException()
|
||||||
target_id = targetObj.id
|
target_id = targetObj.id
|
||||||
targetObj.default_schedule_weight = conf.default
|
targetObj.default_schedule_weight = conf.default
|
||||||
delete(ScheduleTimeWeight).where(ScheduleTimeWeight.target_id == target_id)
|
delete(ScheduleTimeWeight).where(ScheduleTimeWeight.target_id == target_id)
|
||||||
@ -262,5 +253,40 @@ class DBConfig:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def get_all_weight_config(
|
||||||
|
self,
|
||||||
|
) -> dict[str, dict[str, PlatformWeightConfigResp]]:
|
||||||
|
res: dict[str, dict[str, PlatformWeightConfigResp]] = defaultdict(dict)
|
||||||
|
async with AsyncSession(get_engine()) as sess:
|
||||||
|
query = select(Target)
|
||||||
|
targets: list[Target] = (await sess.scalars(query)).all()
|
||||||
|
query = select(ScheduleTimeWeight).options(
|
||||||
|
selectinload(ScheduleTimeWeight.target)
|
||||||
|
)
|
||||||
|
time_weights: list[ScheduleTimeWeight] = (await sess.scalars(query)).all()
|
||||||
|
|
||||||
|
for target in targets:
|
||||||
|
platform_name = target.platform_name
|
||||||
|
if platform_name not in res.keys():
|
||||||
|
res[platform_name][target.target] = PlatformWeightConfigResp(
|
||||||
|
target=T_Target(target.target),
|
||||||
|
target_name=target.target_name,
|
||||||
|
weight=WeightConfig(
|
||||||
|
default=target.default_schedule_weight, time_config=[]
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
for time_weight_config in time_weights:
|
||||||
|
platform_name = time_weight_config.target.platform_name
|
||||||
|
target = time_weight_config.target.target
|
||||||
|
res[platform_name][target].weight.time_config.append(
|
||||||
|
TimeWeightConfig(
|
||||||
|
start_time=time_weight_config.start_time,
|
||||||
|
end_time=time_weight_config.end_time,
|
||||||
|
weight=time_weight_config.weight,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
config = DBConfig()
|
config = DBConfig()
|
||||||
|
@ -4,3 +4,7 @@ class NoSuchUserException(Exception):
|
|||||||
|
|
||||||
class NoSuchSubscribeException(Exception):
|
class NoSuchSubscribeException(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class NoSuchTargetException(Exception):
|
||||||
|
pass
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
from datetime import time
|
||||||
from typing import Any, Callable, Literal, NamedTuple, NewType
|
from typing import Any, Callable, Literal, NamedTuple, NewType
|
||||||
|
|
||||||
RawPost = NewType("RawPost", Any)
|
RawPost = NewType("RawPost", Any)
|
||||||
@ -24,3 +25,24 @@ class UserSubInfo(NamedTuple):
|
|||||||
user: User
|
user: User
|
||||||
categories: list[Category]
|
categories: list[Category]
|
||||||
tags: list[Tag]
|
tags: list[Tag]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class TimeWeightConfig:
|
||||||
|
start_time: time
|
||||||
|
end_time: time
|
||||||
|
weight: int
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class WeightConfig:
|
||||||
|
|
||||||
|
default: int
|
||||||
|
time_config: list[TimeWeightConfig]
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class PlatformWeightConfigResp:
|
||||||
|
target: Target
|
||||||
|
target_name: str
|
||||||
|
weight: WeightConfig
|
||||||
|
Loading…
x
Reference in New Issue
Block a user