From 90816796c7c98ef36eb3f1709d3435ab53b006a3 Mon Sep 17 00:00:00 2001
From: uy/sun <hmy0119@gmail.com>
Date: Thu, 9 Mar 2023 17:32:51 +0800
Subject: [PATCH] =?UTF-8?q?:truck:=20=E4=BF=AE=E6=94=B9=20nonebot=5Fbison?=
 =?UTF-8?q?=20=E9=A1=B9=E7=9B=AE=E7=BB=93=E6=9E=84=20(#211)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* :art: 修改 nonebot_bison 目录位置

* auto fix by pre-commit hooks

* :truck: fix frontend build target

* :truck: use soft link

* Revert ":truck: use soft link"

This reverts commit de21f79d5ae1bd5515b04f42a4138cb25ddf3e62.

* :truck: modify dockerfile

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: felinae98 <731499577@qq.com>
---
 .dockerignore                                 | 18 +++++++++++++++++
 admin-frontend/package.json                   |  2 +-
 bot.py                                        |  5 ++++-
 docker/Dockerfile_with_frontend               |  3 +--
 docker/Dockerfile_with_frontend_sentry        |  3 +--
 {src/plugins => extra_plugins}/auto_agree.py  |  0
 .../__init__.py                               |  0
 .../admin_page/__init__.py                    |  0
 .../admin_page/api.py                         |  0
 .../admin_page/dist/.gitkeep                  |  0
 .../admin_page/jwt.py                         |  0
 .../admin_page/token_manager.py               |  0
 .../admin_page/types.py                       |  0
 .../nonebot_bison => nonebot_bison}/apis.py   |  0
 .../bootstrap.py                              |  0
 .../config/__init__.py                        |  0
 .../config/config_legacy.py                   |  0
 .../config/db.py                              |  0
 .../config/db_config.py                       |  0
 .../config/db_model.py                        |  0
 .../config/migrations/0571870f5222_init_db.py |  0
 .../migrations/4a46ba54a3f3_alter_type.py     |  0
 .../migrations/5da28f6facb3_rename_tables.py  |  0
 .../5f3370328e44_add_time_weight_table.py     |  0
 .../a333d6224193_add_last_scheduled_time.py   |  0
 .../bd92923c218f_alter_json_not_null.py       |  0
 .../migrations/c97c445e2bdb_add_constraint.py |  0
 .../config/utils.py                           |  0
 .../config_manager.py                         |  0
 .../platform/__init__.py                      |  0
 .../platform/arknights.py                     |  0
 .../platform/bilibili.py                      |  0
 .../platform/ff14.py                          |  0
 .../platform/mcbbsnews.py                     |  0
 .../platform/ncm.py                           |  0
 .../platform/platform.py                      |  0
 .../platform/rss.py                           |  0
 .../platform/weibo.py                         |  0
 .../plugin_config.py                          |  0
 .../post/__init__.py                          |  0
 .../post/abstract_post.py                     |  0
 .../post/custom_post.py                       |  0
 .../post/post.py                              |  0
 .../post/templates/custom_post.css            |  0
 .../scheduler/__init__.py                     |  0
 .../scheduler/manager.py                      |  0
 .../scheduler/scheduler.py                    |  0
 .../nonebot_bison => nonebot_bison}/send.py   |  0
 .../nonebot_bison => nonebot_bison}/types.py  |  0
 .../utils/__init__.py                         |  0
 .../utils/context.py                          |  0
 .../utils/get_bot.py                          |  0
 .../utils/http.py                             |  0
 .../utils/scheduler_config.py                 |  0
 pyproject.toml                                | 12 ++---------
 tests/config/test_config_operation.py         | 14 +++++++------
 tests/config/test_data_migration.py           |  6 ++++--
 tests/config/test_scheduler_conf.py           | 20 +++++++++++--------
 tests/conftest.py                             |  8 +++++---
 tests/test_config_manager_abort.py            |  5 +++++
 tests/test_config_manager_add.py              |  8 ++++++++
 tests/test_config_manager_admin.py            |  4 ++++
 tests/test_config_manager_query_del.py        |  3 +++
 tests/test_get_bot.py                         |  3 +++
 tests/test_send.py                            |  4 ++++
 65 files changed, 83 insertions(+), 35 deletions(-)
 create mode 100644 .dockerignore
 rename {src/plugins => extra_plugins}/auto_agree.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/admin_page/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/admin_page/api.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/admin_page/dist/.gitkeep (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/admin_page/jwt.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/admin_page/token_manager.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/admin_page/types.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/apis.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/bootstrap.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/config_legacy.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/db.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/db_config.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/db_model.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/0571870f5222_init_db.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/4a46ba54a3f3_alter_type.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/5da28f6facb3_rename_tables.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/5f3370328e44_add_time_weight_table.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/a333d6224193_add_last_scheduled_time.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/bd92923c218f_alter_json_not_null.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/migrations/c97c445e2bdb_add_constraint.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config/utils.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/config_manager.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/arknights.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/bilibili.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/ff14.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/mcbbsnews.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/ncm.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/platform.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/rss.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/platform/weibo.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/plugin_config.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/post/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/post/abstract_post.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/post/custom_post.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/post/post.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/post/templates/custom_post.css (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/scheduler/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/scheduler/manager.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/scheduler/scheduler.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/send.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/types.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/utils/__init__.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/utils/context.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/utils/get_bot.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/utils/http.py (100%)
 rename {src/plugins/nonebot_bison => nonebot_bison}/utils/scheduler_config.py (100%)

diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000..63f568d
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,18 @@
+*.ini
+*.yaml
+*.yml
+*.md
+*.json
+*.toml
+*.xml
+tests
+node_modules
+admin-frontend
+data*
+htmlcov
+docker
+dist
+docs
+.*
+
+!pyproject.toml
diff --git a/admin-frontend/package.json b/admin-frontend/package.json
index ffd0b4a..a8c904b 100644
--- a/admin-frontend/package.json
+++ b/admin-frontend/package.json
@@ -29,7 +29,7 @@
   },
   "scripts": {
     "start": "react-scripts start",
-    "build": "react-scripts build && cp -r -f build/* ../src/plugins/nonebot_bison/admin_page/dist",
+    "build": "react-scripts build && cp -r -f build/* ../nonebot_bison/admin_page/dist",
     "test": "react-scripts test",
     "eject": "react-scripts eject",
     "lint": "eslint --fix src/**/*.ts src/**/*.tsx"
diff --git a/bot.py b/bot.py
index 8af708d..1e92dc8 100644
--- a/bot.py
+++ b/bot.py
@@ -1,3 +1,5 @@
+from pathlib import Path
+
 import nonebot
 from nonebot.adapters.onebot.v11 import Adapter as OneBotV11Adapter
 
@@ -9,7 +11,8 @@ driver.register_adapter(OneBotV11Adapter)
 
 nonebot.load_builtin_plugins("echo")
 # nonebot.load_plugin("nonebot_plugin_help")
-nonebot.load_plugins("src/plugins")
+nonebot.load_plugin(Path(__file__).parent / "nonebot_bison")
+nonebot.load_plugins("extra_plugins")
 
 if __name__ == "__main__":
     nonebot.run()
diff --git a/docker/Dockerfile_with_frontend b/docker/Dockerfile_with_frontend
index f1884c8..0d3484b 100644
--- a/docker/Dockerfile_with_frontend
+++ b/docker/Dockerfile_with_frontend
@@ -41,8 +41,7 @@ RUN --mount=type=cache,target=/var/cache/apt \
 
 COPY --from=builder /runtime /usr/local
 RUN playwright install chromium
-ADD src /app/src
-ADD bot.py /app/
+ADD . /app/
 RUN echo 'DATASTORE_DATA_DIR=/data' > .env
 ENV HOST=0.0.0.0
 CMD ["python", "bot.py"]
diff --git a/docker/Dockerfile_with_frontend_sentry b/docker/Dockerfile_with_frontend_sentry
index 637f49a..0b81e85 100644
--- a/docker/Dockerfile_with_frontend_sentry
+++ b/docker/Dockerfile_with_frontend_sentry
@@ -41,8 +41,7 @@ RUN --mount=type=cache,target=/var/cache/apt \
 
 COPY --from=builder /runtime /usr/local
 RUN playwright install chromium
-ADD src /app/src
-ADD bot.py /app/
+ADD . /app/
 RUN echo 'DATASTORE_DATA_DIR=/data' > .env && sed '/nonebot.load_builtin_plugins("echo")/a nonebot.load_plugin("nonebot_plugin_sentry")' -i bot.py
 ENV HOST=0.0.0.0
 CMD ["python", "bot.py"]
diff --git a/src/plugins/auto_agree.py b/extra_plugins/auto_agree.py
similarity index 100%
rename from src/plugins/auto_agree.py
rename to extra_plugins/auto_agree.py
diff --git a/src/plugins/nonebot_bison/__init__.py b/nonebot_bison/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/__init__.py
rename to nonebot_bison/__init__.py
diff --git a/src/plugins/nonebot_bison/admin_page/__init__.py b/nonebot_bison/admin_page/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/admin_page/__init__.py
rename to nonebot_bison/admin_page/__init__.py
diff --git a/src/plugins/nonebot_bison/admin_page/api.py b/nonebot_bison/admin_page/api.py
similarity index 100%
rename from src/plugins/nonebot_bison/admin_page/api.py
rename to nonebot_bison/admin_page/api.py
diff --git a/src/plugins/nonebot_bison/admin_page/dist/.gitkeep b/nonebot_bison/admin_page/dist/.gitkeep
similarity index 100%
rename from src/plugins/nonebot_bison/admin_page/dist/.gitkeep
rename to nonebot_bison/admin_page/dist/.gitkeep
diff --git a/src/plugins/nonebot_bison/admin_page/jwt.py b/nonebot_bison/admin_page/jwt.py
similarity index 100%
rename from src/plugins/nonebot_bison/admin_page/jwt.py
rename to nonebot_bison/admin_page/jwt.py
diff --git a/src/plugins/nonebot_bison/admin_page/token_manager.py b/nonebot_bison/admin_page/token_manager.py
similarity index 100%
rename from src/plugins/nonebot_bison/admin_page/token_manager.py
rename to nonebot_bison/admin_page/token_manager.py
diff --git a/src/plugins/nonebot_bison/admin_page/types.py b/nonebot_bison/admin_page/types.py
similarity index 100%
rename from src/plugins/nonebot_bison/admin_page/types.py
rename to nonebot_bison/admin_page/types.py
diff --git a/src/plugins/nonebot_bison/apis.py b/nonebot_bison/apis.py
similarity index 100%
rename from src/plugins/nonebot_bison/apis.py
rename to nonebot_bison/apis.py
diff --git a/src/plugins/nonebot_bison/bootstrap.py b/nonebot_bison/bootstrap.py
similarity index 100%
rename from src/plugins/nonebot_bison/bootstrap.py
rename to nonebot_bison/bootstrap.py
diff --git a/src/plugins/nonebot_bison/config/__init__.py b/nonebot_bison/config/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/__init__.py
rename to nonebot_bison/config/__init__.py
diff --git a/src/plugins/nonebot_bison/config/config_legacy.py b/nonebot_bison/config/config_legacy.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/config_legacy.py
rename to nonebot_bison/config/config_legacy.py
diff --git a/src/plugins/nonebot_bison/config/db.py b/nonebot_bison/config/db.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/db.py
rename to nonebot_bison/config/db.py
diff --git a/src/plugins/nonebot_bison/config/db_config.py b/nonebot_bison/config/db_config.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/db_config.py
rename to nonebot_bison/config/db_config.py
diff --git a/src/plugins/nonebot_bison/config/db_model.py b/nonebot_bison/config/db_model.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/db_model.py
rename to nonebot_bison/config/db_model.py
diff --git a/src/plugins/nonebot_bison/config/migrations/0571870f5222_init_db.py b/nonebot_bison/config/migrations/0571870f5222_init_db.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/0571870f5222_init_db.py
rename to nonebot_bison/config/migrations/0571870f5222_init_db.py
diff --git a/src/plugins/nonebot_bison/config/migrations/4a46ba54a3f3_alter_type.py b/nonebot_bison/config/migrations/4a46ba54a3f3_alter_type.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/4a46ba54a3f3_alter_type.py
rename to nonebot_bison/config/migrations/4a46ba54a3f3_alter_type.py
diff --git a/src/plugins/nonebot_bison/config/migrations/5da28f6facb3_rename_tables.py b/nonebot_bison/config/migrations/5da28f6facb3_rename_tables.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/5da28f6facb3_rename_tables.py
rename to nonebot_bison/config/migrations/5da28f6facb3_rename_tables.py
diff --git a/src/plugins/nonebot_bison/config/migrations/5f3370328e44_add_time_weight_table.py b/nonebot_bison/config/migrations/5f3370328e44_add_time_weight_table.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/5f3370328e44_add_time_weight_table.py
rename to nonebot_bison/config/migrations/5f3370328e44_add_time_weight_table.py
diff --git a/src/plugins/nonebot_bison/config/migrations/a333d6224193_add_last_scheduled_time.py b/nonebot_bison/config/migrations/a333d6224193_add_last_scheduled_time.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/a333d6224193_add_last_scheduled_time.py
rename to nonebot_bison/config/migrations/a333d6224193_add_last_scheduled_time.py
diff --git a/src/plugins/nonebot_bison/config/migrations/bd92923c218f_alter_json_not_null.py b/nonebot_bison/config/migrations/bd92923c218f_alter_json_not_null.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/bd92923c218f_alter_json_not_null.py
rename to nonebot_bison/config/migrations/bd92923c218f_alter_json_not_null.py
diff --git a/src/plugins/nonebot_bison/config/migrations/c97c445e2bdb_add_constraint.py b/nonebot_bison/config/migrations/c97c445e2bdb_add_constraint.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/migrations/c97c445e2bdb_add_constraint.py
rename to nonebot_bison/config/migrations/c97c445e2bdb_add_constraint.py
diff --git a/src/plugins/nonebot_bison/config/utils.py b/nonebot_bison/config/utils.py
similarity index 100%
rename from src/plugins/nonebot_bison/config/utils.py
rename to nonebot_bison/config/utils.py
diff --git a/src/plugins/nonebot_bison/config_manager.py b/nonebot_bison/config_manager.py
similarity index 100%
rename from src/plugins/nonebot_bison/config_manager.py
rename to nonebot_bison/config_manager.py
diff --git a/src/plugins/nonebot_bison/platform/__init__.py b/nonebot_bison/platform/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/__init__.py
rename to nonebot_bison/platform/__init__.py
diff --git a/src/plugins/nonebot_bison/platform/arknights.py b/nonebot_bison/platform/arknights.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/arknights.py
rename to nonebot_bison/platform/arknights.py
diff --git a/src/plugins/nonebot_bison/platform/bilibili.py b/nonebot_bison/platform/bilibili.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/bilibili.py
rename to nonebot_bison/platform/bilibili.py
diff --git a/src/plugins/nonebot_bison/platform/ff14.py b/nonebot_bison/platform/ff14.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/ff14.py
rename to nonebot_bison/platform/ff14.py
diff --git a/src/plugins/nonebot_bison/platform/mcbbsnews.py b/nonebot_bison/platform/mcbbsnews.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/mcbbsnews.py
rename to nonebot_bison/platform/mcbbsnews.py
diff --git a/src/plugins/nonebot_bison/platform/ncm.py b/nonebot_bison/platform/ncm.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/ncm.py
rename to nonebot_bison/platform/ncm.py
diff --git a/src/plugins/nonebot_bison/platform/platform.py b/nonebot_bison/platform/platform.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/platform.py
rename to nonebot_bison/platform/platform.py
diff --git a/src/plugins/nonebot_bison/platform/rss.py b/nonebot_bison/platform/rss.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/rss.py
rename to nonebot_bison/platform/rss.py
diff --git a/src/plugins/nonebot_bison/platform/weibo.py b/nonebot_bison/platform/weibo.py
similarity index 100%
rename from src/plugins/nonebot_bison/platform/weibo.py
rename to nonebot_bison/platform/weibo.py
diff --git a/src/plugins/nonebot_bison/plugin_config.py b/nonebot_bison/plugin_config.py
similarity index 100%
rename from src/plugins/nonebot_bison/plugin_config.py
rename to nonebot_bison/plugin_config.py
diff --git a/src/plugins/nonebot_bison/post/__init__.py b/nonebot_bison/post/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/post/__init__.py
rename to nonebot_bison/post/__init__.py
diff --git a/src/plugins/nonebot_bison/post/abstract_post.py b/nonebot_bison/post/abstract_post.py
similarity index 100%
rename from src/plugins/nonebot_bison/post/abstract_post.py
rename to nonebot_bison/post/abstract_post.py
diff --git a/src/plugins/nonebot_bison/post/custom_post.py b/nonebot_bison/post/custom_post.py
similarity index 100%
rename from src/plugins/nonebot_bison/post/custom_post.py
rename to nonebot_bison/post/custom_post.py
diff --git a/src/plugins/nonebot_bison/post/post.py b/nonebot_bison/post/post.py
similarity index 100%
rename from src/plugins/nonebot_bison/post/post.py
rename to nonebot_bison/post/post.py
diff --git a/src/plugins/nonebot_bison/post/templates/custom_post.css b/nonebot_bison/post/templates/custom_post.css
similarity index 100%
rename from src/plugins/nonebot_bison/post/templates/custom_post.css
rename to nonebot_bison/post/templates/custom_post.css
diff --git a/src/plugins/nonebot_bison/scheduler/__init__.py b/nonebot_bison/scheduler/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/scheduler/__init__.py
rename to nonebot_bison/scheduler/__init__.py
diff --git a/src/plugins/nonebot_bison/scheduler/manager.py b/nonebot_bison/scheduler/manager.py
similarity index 100%
rename from src/plugins/nonebot_bison/scheduler/manager.py
rename to nonebot_bison/scheduler/manager.py
diff --git a/src/plugins/nonebot_bison/scheduler/scheduler.py b/nonebot_bison/scheduler/scheduler.py
similarity index 100%
rename from src/plugins/nonebot_bison/scheduler/scheduler.py
rename to nonebot_bison/scheduler/scheduler.py
diff --git a/src/plugins/nonebot_bison/send.py b/nonebot_bison/send.py
similarity index 100%
rename from src/plugins/nonebot_bison/send.py
rename to nonebot_bison/send.py
diff --git a/src/plugins/nonebot_bison/types.py b/nonebot_bison/types.py
similarity index 100%
rename from src/plugins/nonebot_bison/types.py
rename to nonebot_bison/types.py
diff --git a/src/plugins/nonebot_bison/utils/__init__.py b/nonebot_bison/utils/__init__.py
similarity index 100%
rename from src/plugins/nonebot_bison/utils/__init__.py
rename to nonebot_bison/utils/__init__.py
diff --git a/src/plugins/nonebot_bison/utils/context.py b/nonebot_bison/utils/context.py
similarity index 100%
rename from src/plugins/nonebot_bison/utils/context.py
rename to nonebot_bison/utils/context.py
diff --git a/src/plugins/nonebot_bison/utils/get_bot.py b/nonebot_bison/utils/get_bot.py
similarity index 100%
rename from src/plugins/nonebot_bison/utils/get_bot.py
rename to nonebot_bison/utils/get_bot.py
diff --git a/src/plugins/nonebot_bison/utils/http.py b/nonebot_bison/utils/http.py
similarity index 100%
rename from src/plugins/nonebot_bison/utils/http.py
rename to nonebot_bison/utils/http.py
diff --git a/src/plugins/nonebot_bison/utils/scheduler_config.py b/nonebot_bison/utils/scheduler_config.py
similarity index 100%
rename from src/plugins/nonebot_bison/utils/scheduler_config.py
rename to nonebot_bison/utils/scheduler_config.py
diff --git a/pyproject.toml b/pyproject.toml
index 54efd3f..445dc46 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -7,8 +7,7 @@ license = "MIT"
 homepage = "https://github.com/felinae98/nonebot-bison"
 keywords = ["nonebot", "nonebot2", "qqbot"]
 readme = "README.md"
-packages = [{ include = "nonebot_bison", from = "./src/plugins/" }]
-include = ["src/plugins/nonebot_bison/admin_page/dist/**/*"]
+include = ["nonebot_bison/admin_page/dist/**/*"]
 classifiers = [
   "Development Status :: 4 - Beta",
   "Operating System :: POSIX :: Linux",
@@ -76,15 +75,8 @@ line_length = 88
 skip_gitignore = true
 
 [tool.nonebot]
-plugins = ["src.plugins.nonebot_bison"]
+plugins = ["nonebot_bison"]
 
 [tool.pyright]
 pythonVersion = "3.10"
 pythonPlatform = "All"
-executionEnvironments = [
-  { root = "./tests", extraPaths = [
-    "./",
-    "./src/plugins/",
-  ] },
-  { root = "./" },
-]
diff --git a/tests/config/test_config_operation.py b/tests/config/test_config_operation.py
index 61c065a..6185e96 100644
--- a/tests/config/test_config_operation.py
+++ b/tests/config/test_config_operation.py
@@ -3,13 +3,14 @@ from nonebug.app import App
 
 
 async def test_add_subscribe(app: App, init_scheduler):
-    from nonebot_bison.config.db_config import config
-    from nonebot_bison.config.db_model import Subscribe, Target, User
-    from nonebot_bison.types import Target as TTarget
     from nonebot_plugin_datastore.db import get_engine
     from sqlalchemy.ext.asyncio.session import AsyncSession
     from sqlalchemy.sql.expression import select
 
+    from nonebot_bison.config.db_config import config
+    from nonebot_bison.config.db_model import Subscribe, Target, User
+    from nonebot_bison.types import Target as TTarget
+
     await config.add_subscribe(
         user=123,
         user_type="group",
@@ -98,14 +99,15 @@ async def test_add_dup_sub(init_scheduler):
 
 
 async def test_del_subsribe(init_scheduler):
-    from nonebot_bison.config.db_config import config
-    from nonebot_bison.config.db_model import Subscribe, Target
-    from nonebot_bison.types import Target as TTarget
     from nonebot_plugin_datastore.db import get_engine
     from sqlalchemy.ext.asyncio.session import AsyncSession
     from sqlalchemy.sql.expression import select
     from sqlalchemy.sql.functions import func
 
+    from nonebot_bison.config.db_config import config
+    from nonebot_bison.config.db_model import Subscribe, Target
+    from nonebot_bison.types import Target as TTarget
+
     await config.add_subscribe(
         user=123,
         user_type="group",
diff --git a/tests/config/test_data_migration.py b/tests/config/test_data_migration.py
index bf3c1a8..d8c64bd 100644
--- a/tests/config/test_data_migration.py
+++ b/tests/config/test_data_migration.py
@@ -1,7 +1,8 @@
 async def test_migration(use_legacy_config):
+    from nonebot_plugin_datastore.db import init_db
+
     from nonebot_bison.config.config_legacy import config as config_legacy
     from nonebot_bison.config.db_config import config
-    from nonebot_plugin_datastore.db import init_db
 
     config_legacy.add_subscribe(
         user=123,
@@ -54,9 +55,10 @@ async def test_migration(use_legacy_config):
 
 
 async def test_migrate_dup(use_legacy_config):
+    from nonebot_plugin_datastore.db import init_db
+
     from nonebot_bison.config.config_legacy import config as config_legacy
     from nonebot_bison.config.db_config import config
-    from nonebot_plugin_datastore.db import init_db
 
     config_legacy.add_subscribe(
         user=123,
diff --git a/tests/config/test_scheduler_conf.py b/tests/config/test_scheduler_conf.py
index 6b43b93..c3d7f14 100644
--- a/tests/config/test_scheduler_conf.py
+++ b/tests/config/test_scheduler_conf.py
@@ -5,10 +5,11 @@ from pytest_mock import MockerFixture
 
 
 async def test_create_config(init_scheduler):
+    from nonebot_plugin_datastore.db import get_engine
+
     from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig, config
     from nonebot_bison.config.db_model import Subscribe, Target, User
     from nonebot_bison.types import Target as T_Target
-    from nonebot_plugin_datastore.db import get_engine
 
     await config.add_subscribe(
         user=123,
@@ -56,11 +57,12 @@ async def test_create_config(init_scheduler):
 async def test_get_current_weight(init_scheduler, mocker: MockerFixture):
     from datetime import time
 
+    from nonebot_plugin_datastore.db import get_engine
+
     from nonebot_bison.config import db_config
     from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig, config
     from nonebot_bison.config.db_model import Subscribe, Target, User
     from nonebot_bison.types import Target as T_Target
-    from nonebot_plugin_datastore.db import get_engine
 
     await config.add_subscribe(
         user=123,
@@ -121,13 +123,14 @@ async def test_get_current_weight(init_scheduler, mocker: MockerFixture):
 
 
 async def test_get_platform_target(app: App, init_scheduler):
+    from nonebot_plugin_datastore.db import get_engine
+    from sqlalchemy.ext.asyncio.session import AsyncSession
+    from sqlalchemy.sql.expression import select
+
     from nonebot_bison.config import db_config
     from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig, config
     from nonebot_bison.config.db_model import Subscribe, Target, User
     from nonebot_bison.types import Target as T_Target
-    from nonebot_plugin_datastore.db import get_engine
-    from sqlalchemy.ext.asyncio.session import AsyncSession
-    from sqlalchemy.sql.expression import select
 
     await config.add_subscribe(
         user=123,
@@ -171,15 +174,16 @@ async def test_get_platform_target(app: App, init_scheduler):
 
 
 async def test_get_platform_target_subscribers(app: App, init_scheduler):
+    from nonebot_plugin_datastore.db import get_engine
+    from sqlalchemy.ext.asyncio.session import AsyncSession
+    from sqlalchemy.sql.expression import select
+
     from nonebot_bison.config import db_config
     from nonebot_bison.config.db_config import TimeWeightConfig, WeightConfig, config
     from nonebot_bison.config.db_model import Subscribe, Target, User
     from nonebot_bison.types import Target as T_Target
     from nonebot_bison.types import User as T_User
     from nonebot_bison.types import UserSubInfo
-    from nonebot_plugin_datastore.db import get_engine
-    from sqlalchemy.ext.asyncio.session import AsyncSession
-    from sqlalchemy.sql.expression import select
 
     await config.add_subscribe(
         user=123,
diff --git a/tests/conftest.py b/tests/conftest.py
index a6d249f..0b177e5 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -24,6 +24,10 @@ async def app(tmp_path: Path, request: pytest.FixtureRequest, mocker: MockerFixt
     sys.path.append(str(Path(__file__).parent.parent / "src" / "plugins"))
 
     nonebot.require("nonebot_bison")
+    from nonebot_plugin_datastore.config import plugin_config as datastore_config
+    from nonebot_plugin_datastore.db import create_session, init_db
+    from nonebot_plugin_htmlrender.browser import shutdown_browser
+
     from nonebot_bison import plugin_config
     from nonebot_bison.config.db_model import (
         ScheduleTimeWeight,
@@ -31,9 +35,6 @@ async def app(tmp_path: Path, request: pytest.FixtureRequest, mocker: MockerFixt
         Target,
         User,
     )
-    from nonebot_plugin_datastore.config import plugin_config as datastore_config
-    from nonebot_plugin_datastore.db import create_session, init_db
-    from nonebot_plugin_htmlrender.browser import shutdown_browser
 
     plugin_config.bison_config_path = str(tmp_path / "legacy_config")
     plugin_config.bison_filter_log = False
@@ -82,6 +83,7 @@ async def init_scheduler(app: App):
 @pytest.fixture
 async def use_legacy_config(app: App):
     import aiofiles
+
     from nonebot_bison.config.config_legacy import config, get_config_path
 
     async with aiofiles.open(get_config_path()[0], "w") as f:
diff --git a/tests/test_config_manager_abort.py b/tests/test_config_manager_abort.py
index 61124a7..188b1d9 100644
--- a/tests/test_config_manager_abort.py
+++ b/tests/test_config_manager_abort.py
@@ -13,6 +13,7 @@ from .utils import BotReply, fake_admin_user, fake_group_message_event
 async def test_abort_add_on_platform(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
 
@@ -60,6 +61,7 @@ async def test_abort_add_on_platform(app: App, init_scheduler):
 async def test_abort_add_on_id(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
     from nonebot_bison.platform.weibo import Weibo
@@ -117,6 +119,7 @@ async def test_abort_add_on_id(app: App, init_scheduler):
 async def test_abort_add_on_cats(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
     from nonebot_bison.platform.weibo import Weibo
@@ -194,6 +197,7 @@ async def test_abort_add_on_cats(app: App, init_scheduler):
 async def test_abort_add_on_tag(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
     from nonebot_bison.platform.weibo import Weibo
@@ -275,6 +279,7 @@ async def test_abort_add_on_tag(app: App, init_scheduler):
 async def test_abort_del_sub(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import del_sub_matcher
     from nonebot_bison.platform import platform_manager
diff --git a/tests/test_config_manager_add.py b/tests/test_config_manager_add.py
index 70c45d6..f9db7e1 100644
--- a/tests/test_config_manager_add.py
+++ b/tests/test_config_manager_add.py
@@ -12,6 +12,7 @@ from .utils import BotReply, fake_admin_user, fake_group_message_event
 async def test_configurable_at_me_true_failed(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher
     from nonebot_bison.plugin_config import plugin_config
 
@@ -37,6 +38,7 @@ async def test_configurable_at_me_true_failed(app: App):
 async def test_configurable_at_me_false(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
     from nonebot_bison.plugin_config import plugin_config
@@ -62,6 +64,7 @@ async def test_configurable_at_me_false(app: App):
 async def test_add_with_target(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
@@ -185,6 +188,7 @@ async def test_add_with_target(app: App, init_scheduler):
 async def test_add_with_target_no_cat(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
@@ -244,6 +248,7 @@ async def test_add_with_target_no_cat(app: App, init_scheduler):
 async def test_add_no_target(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
@@ -293,6 +298,7 @@ async def test_add_no_target(app: App, init_scheduler):
 async def test_platform_name_err(app: App):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
 
@@ -328,6 +334,7 @@ async def test_platform_name_err(app: App):
 async def test_add_with_get_id(app: App):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message, MessageSegment
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
@@ -409,6 +416,7 @@ async def test_add_with_get_id(app: App):
 async def test_add_with_bilibili_target_parser(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.event import Sender
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import add_sub_matcher, common_platform
     from nonebot_bison.platform import platform_manager
diff --git a/tests/test_config_manager_admin.py b/tests/test_config_manager_admin.py
index c809b37..4d6ff93 100644
--- a/tests/test_config_manager_admin.py
+++ b/tests/test_config_manager_admin.py
@@ -8,6 +8,7 @@ from .utils import fake_group_message_event, fake_private_message_event, fake_su
 async def test_query_with_superuser_private(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import group_manage_matcher
 
     async with app.test_matcher(group_manage_matcher) as ctx:
@@ -70,6 +71,7 @@ async def test_query_with_superuser_private(app: App):
 async def test_query_with_abort_on_idx(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import group_manage_matcher
 
     async with app.test_matcher(group_manage_matcher) as ctx:
@@ -105,6 +107,7 @@ async def test_query_with_abort_on_idx(app: App):
 async def test_query_with_abort_on_command(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import group_manage_matcher
 
     async with app.test_matcher(group_manage_matcher) as ctx:
@@ -149,6 +152,7 @@ async def test_query_with_abort_on_command(app: App):
 async def test_query_with_superuser_group_tome(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config_manager import group_manage_matcher
 
     async with app.test_matcher(group_manage_matcher) as ctx:
diff --git a/tests/test_config_manager_query_del.py b/tests/test_config_manager_query_del.py
index c1a2f70..c829ba4 100644
--- a/tests/test_config_manager_query_del.py
+++ b/tests/test_config_manager_query_del.py
@@ -10,6 +10,7 @@ from .utils import fake_admin_user, fake_group_message_event
 @pytest.mark.asyncio
 async def test_query_sub(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import query_sub_matcher
     from nonebot_bison.platform import platform_manager
@@ -39,6 +40,7 @@ async def test_query_sub(app: App, init_scheduler):
 async def test_del_sub(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import del_sub_matcher
     from nonebot_bison.platform import platform_manager
@@ -89,6 +91,7 @@ async def test_del_sub(app: App, init_scheduler):
 async def test_del_empty_sub(app: App, init_scheduler):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.config import config
     from nonebot_bison.config_manager import del_sub_matcher
     from nonebot_bison.platform import platform_manager
diff --git a/tests/test_get_bot.py b/tests/test_get_bot.py
index 3414e13..ec24c7b 100644
--- a/tests/test_get_bot.py
+++ b/tests/test_get_bot.py
@@ -10,6 +10,7 @@ async def test_get_bots(app: App) -> None:
     from nonebot import get_driver
     from nonebot.adapters.onebot.v11 import Bot as BotV11
     from nonebot.adapters.onebot.v12 import Bot as BotV12
+
     from nonebot_bison.utils.get_bot import get_bots
 
     async with app.test_api() as ctx:
@@ -31,6 +32,7 @@ async def test_refresh_bots(app: App) -> None:
     from nonebot import get_driver
     from nonebot.adapters.onebot.v11 import Bot as BotV11
     from nonebot.adapters.onebot.v12 import Bot as BotV12
+
     from nonebot_bison.types import User
     from nonebot_bison.utils.get_bot import get_bot, get_groups, refresh_bots
 
@@ -66,6 +68,7 @@ async def test_get_bot_two_bots(app: App) -> None:
     from nonebot import get_driver
     from nonebot.adapters.onebot.v11 import Bot as BotV11
     from nonebot.adapters.onebot.v12 import Bot as BotV12
+
     from nonebot_bison.types import User
     from nonebot_bison.utils.get_bot import get_bot, get_groups, refresh_bots
 
diff --git a/tests/test_send.py b/tests/test_send.py
index 29c30cb..c45fb9e 100644
--- a/tests/test_send.py
+++ b/tests/test_send.py
@@ -14,6 +14,7 @@ if typing.TYPE_CHECKING:
 async def test_send_no_queue(app: App, mocker: MockerFixture):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message
+
     from nonebot_bison.plugin_config import plugin_config
     from nonebot_bison.send import send_msgs
 
@@ -40,6 +41,7 @@ async def test_send_queue(app: App, mocker: MockerFixture):
     import nonebot
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message, MessageSegment
+
     from nonebot_bison import send
     from nonebot_bison.plugin_config import plugin_config
     from nonebot_bison.send import MESSGE_SEND_INTERVAL, do_send_msgs, send_msgs
@@ -84,6 +86,7 @@ def _merge_messge(nodes):
 async def test_send_merge_no_queue(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message, MessageSegment
+
     from nonebot_bison.plugin_config import plugin_config
     from nonebot_bison.send import send_msgs
 
@@ -187,6 +190,7 @@ async def test_send_merge_no_queue(app: App):
 async def test_send_merge2_no_queue(app: App):
     from nonebot.adapters.onebot.v11.bot import Bot
     from nonebot.adapters.onebot.v11.message import Message, MessageSegment
+
     from nonebot_bison.plugin_config import plugin_config
     from nonebot_bison.send import send_msgs