Skip to content
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

✅ 优化测试用例 #1598

Merged
merged 2 commits into from
Sep 2, 2024
Merged

Conversation

AkashiCoin
Copy link
Collaborator

@AkashiCoin AkashiCoin commented Sep 2, 2024

Sourcery的总结

重构插件商店测试用例和实用函数,增强代码的可维护性和测试覆盖率。改进插件管理逻辑,以处理重新安装和未安装插件更新等边缘情况。

增强功能:

  • 重构用于将文件和文件夹添加到tar和zip归档的实用函数,提高代码的可读性和可维护性。
  • 改进插件管理逻辑,以防止重新安装已安装的插件,并处理未安装插件的更新。

测试:

  • 为插件商店功能添加全面的测试用例,包括添加、更新、删除和搜索插件。
  • 重构现有测试用例以提高清晰度和覆盖率,确保对插件商店操作的稳健测试。
Original summary in English

Summary by Sourcery

Refactor plugin store test cases and utility functions, enhancing code maintainability and test coverage. Improve plugin management logic to handle edge cases such as reinstallation and updates for non-installed plugins.

Enhancements:

  • Refactor utility functions for adding files and folders to tar and zip archives, improving code readability and maintainability.
  • Improve plugin management logic to prevent reinstallation of already installed plugins and handle updates for non-installed plugins.

Tests:

  • Add comprehensive test cases for plugin store functionalities, including adding, updating, removing, and searching plugins.
  • Refactor existing test cases to improve clarity and coverage, ensuring robust testing of plugin store operations.

Copy link
Contributor

sourcery-ai bot commented Sep 2, 2024

审核指南由 Sourcery 提供

此拉取请求重构并增强了插件存储功能及其相关的测试用例。更改的重点是改进代码组织、可读性以及插件管理操作的测试覆盖率。

文件级更改

更改 详情 文件
重构插件存储测试用例
  • 根据功能(添加、更新、删除、搜索)将测试用例分离到不同的文件中
  • 创建了一个用于常见测试函数和模拟数据的实用程序文件
  • 改进了边缘情况和错误处理的测试覆盖率
tests/builtin_plugins/plugin_store/test_plugin_store.py
tests/builtin_plugins/plugin_store/test_add_plugin.py
tests/builtin_plugins/plugin_store/test_update_plugin.py
tests/builtin_plugins/plugin_store/test_search_plugin.py
tests/builtin_plugins/plugin_store/test_remove_plugin.py
tests/builtin_plugins/plugin_store/utils.py
增强插件存储功能
  • 改进了版本检查逻辑
  • 添加了对已安装插件的检查
  • 增强了对不存在插件的错误处理
zhenxun/builtin_plugins/plugin_store/data_source.py
重构 auto_update 测试中的实用函数
  • 重命名并改进了将文件和文件夹添加到 tar 和 zip 存档的函数
  • 添加了文档字符串以解释函数目的
tests/builtin_plugins/auto_update/test_check_update.py
小的改进和修复
  • 更新了 create_bot 函数中的类型提示
  • 修复了 linting 问题
tests/conftest.py

提示
  • 通过在拉取请求中评论 @sourcery-ai review 来触发新的 Sourcery 审核。
  • 通过直接回复审核评论继续与 Sourcery 的讨论。
  • 您可以随时通过访问您的仪表板来更改审核设置:
    • 启用或禁用 Sourcery 生成的拉取请求摘要或审核指南;
    • 更改审核语言;
  • 如果您有任何问题或反馈,您可以随时联系我们
Original review guide in English

Reviewer's Guide by Sourcery

This pull request refactors and enhances the plugin store functionality and its associated test cases. The changes focus on improving code organization, readability, and test coverage for plugin management operations.

File-Level Changes

Change Details Files
Refactored plugin store test cases
  • Separated test cases into different files based on functionality (add, update, remove, search)
  • Created a utility file for common test functions and mock data
  • Improved test coverage for edge cases and error handling
tests/builtin_plugins/plugin_store/test_plugin_store.py
tests/builtin_plugins/plugin_store/test_add_plugin.py
tests/builtin_plugins/plugin_store/test_update_plugin.py
tests/builtin_plugins/plugin_store/test_search_plugin.py
tests/builtin_plugins/plugin_store/test_remove_plugin.py
tests/builtin_plugins/plugin_store/utils.py
Enhanced plugin store functionality
  • Improved version checking logic
  • Added checks for already installed plugins
  • Enhanced error handling for non-existent plugins
zhenxun/builtin_plugins/plugin_store/data_source.py
Refactored utility functions in auto_update tests
  • Renamed and improved functions for adding files and folders to tar and zip archives
  • Added docstrings to explain function purposes
tests/builtin_plugins/auto_update/test_check_update.py
Minor improvements and fixes
  • Updated type hints in create_bot function
  • Fixed linting issues
tests/conftest.py

Tips
  • Trigger a new Sourcery review by commenting @sourcery-ai review on the pull request.
  • Continue your discussion with Sourcery by replying directly to review comments.
  • You can change your review settings at any time by accessing your dashboard:
    • Enable or disable the Sourcery-generated pull request summary or reviewer's guide;
    • Change the review language;
  • You can always contact us if you have any questions or feedback.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AkashiCoin - 我已经审查了你的更改 - 这里有一些反馈:

总体评论

  • 在重构测试套件方面做得很好。将测试分离到不同的文件中,并创建一个 utils.py 用于常用函数,提高了代码的整体结构和可维护性。
这是我在审查期间查看的内容
  • 🟢 一般问题:一切看起来都很好
  • 🟢 安全性:一切看起来都很好
  • 🟡 测试:发现4个问题
  • 🟢 复杂性:一切看起来都很好
  • 🟢 文档:一切看起来都很好

Sourcery 对开源项目免费 - 如果你喜欢我们的评论,请考虑分享它们 ✨
帮助我变得更有用!请点击每条评论上的 👍 或 👎 告诉我它是否有帮助。
Original comment in English

Hey @AkashiCoin - I've reviewed your changes - here's some feedback:

Overall Comments:

  • Great job on refactoring the test suite. The separation of tests into different files and the creation of a utils.py for common functions improves the overall structure and maintainability of the code.
Here's what I looked at during the review
  • 🟢 General issues: all looks good
  • 🟢 Security: all looks good
  • 🟡 Testing: 4 issues found
  • 🟢 Complexity: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment to tell me if it was helpful.

Comment on lines +17 to +66
async def test_add_plugin_basic(
app: App,
mocker: MockerFixture,
mocked_api: MockRouter,
create_bot: Callable,
tmp_path: Path,
) -> None:
"""
测试添加基础插件
"""
from zhenxun.builtin_plugins.plugin_store import _matcher

init_mocked_api(mocked_api=mocked_api)
mock_base_path = mocker.patch(
"zhenxun.builtin_plugins.plugin_store.data_source.BASE_PATH",
new=tmp_path / "zhenxun",
)

plugin_id = 1

async with app.test_matcher(_matcher) as ctx:
bot = create_bot(ctx)
bot: Bot = cast(Bot, bot)
raw_message = f"添加插件 {plugin_id}"
event: GroupMessageEvent = _v11_group_message_event(
message=raw_message,
self_id=BotId.QQ_BOT,
user_id=UserId.SUPERUSER,
group_id=GroupId.GROUP_ID_LEVEL_5,
message_id=MessageId.MESSAGE_ID,
to_me=True,
)
ctx.receive_event(bot=bot, event=event)
ctx.should_call_send(
event=event,
message=Message(message=f"正在添加插件 Id: {plugin_id}"),
result=None,
bot=bot,
)
ctx.should_call_send(
event=event,
message=Message(message="插件 识图 安装成功! 重启后生效"),
result=None,
bot=bot,
)
assert mocked_api["basic_plugins"].called
assert mocked_api["extra_plugins"].called
assert mocked_api["zhenxun_bot_plugins_metadata"].called
assert mocked_api["search_image_plugin_file_init"].called
assert (mock_base_path / "plugins" / "search_image" / "__init__.py").is_file()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 添加基本插件的全面测试

此测试全面覆盖了添加基本插件的过程,包括检查 API 调用和文件创建。考虑为创建的文件内容添加断言以确保其正确性。

Original comment in English

suggestion (testing): Comprehensive test for adding a basic plugin

This test covers the process of adding a basic plugin thoroughly, including checking for API calls and file creation. Consider adding assertions for the content of the created file to ensure it's correct.

async def test_add_plugin_basic(
    app: App,
    mocker: MockerFixture,
    mocked_api: MockRouter,
    create_bot: Callable,
    tmp_path: Path,
) -> None:
    # ... (existing setup code)

    assert mocked_api["basic_plugins"].called
    assert mocked_api["extra_plugins"].called
    assert mocked_api["zhenxun_bot_plugins_metadata"].called
    assert mocked_api["search_image_plugin_file_init"].called

    plugin_file = mock_base_path / "plugins" / "search_image" / "__init__.py"
    assert plugin_file.is_file()
    assert "# Plugin: 识图" in plugin_file.read_text()

Comment on lines +17 to +80
async def test_search_plugin_name(
app: App,
mocker: MockerFixture,
mocked_api: MockRouter,
create_bot: Callable,
tmp_path: Path,
) -> None:
"""
测试搜索插件
"""
from zhenxun.builtin_plugins.plugin_store import _matcher
from zhenxun.builtin_plugins.plugin_store.data_source import row_style

init_mocked_api(mocked_api=mocked_api)

mock_table_page = mocker.patch(
"zhenxun.builtin_plugins.plugin_store.data_source.ImageTemplate.table_page"
)
mock_table_page_return = mocker.AsyncMock()
mock_table_page.return_value = mock_table_page_return

mock_build_message = mocker.patch(
"zhenxun.builtin_plugins.plugin_store.MessageUtils.build_message"
)
mock_build_message_return = mocker.AsyncMock()
mock_build_message.return_value = mock_build_message_return

plugin_name = "github订阅"

async with app.test_matcher(_matcher) as ctx:
bot = create_bot(ctx)
bot: Bot = cast(Bot, bot)
raw_message = f"搜索插件 {plugin_name}"
event: GroupMessageEvent = _v11_group_message_event(
message=raw_message,
self_id=BotId.QQ_BOT,
user_id=UserId.SUPERUSER,
group_id=GroupId.GROUP_ID_LEVEL_5,
message_id=MessageId.MESSAGE_ID_3,
to_me=True,
)
ctx.receive_event(bot=bot, event=event)
mock_table_page.assert_awaited_once_with(
"插件列表",
"通过添加/移除插件 ID 来管理插件",
["-", "ID", "名称", "简介", "作者", "版本", "类型"],
[
[
"",
3,
"github订阅",
"订阅github用户或仓库",
"xuanerwa",
"0.7",
"普通插件",
]
],
text_style=row_style,
)
mock_build_message.assert_called_once_with(mock_table_page_return)
mock_build_message_return.send.assert_awaited_once()

assert mocked_api["basic_plugins"].called
assert mocked_api["extra_plugins"].called
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 插件搜索功能的良好测试

此测试有效地检查了插件搜索功能。很好的是你正在测试表格创建和消息构建。考虑添加一个部分名称匹配的测试用例,以确保搜索的灵活性。

Original comment in English

suggestion (testing): Good test for plugin search functionality

This test effectively checks the plugin search functionality. It's good that you're testing both the table creation and message building. Consider adding a test case for partial name matches to ensure the search is flexible.

async def test_search_plugin_name(
    app: App,
    mocker: MockerFixture,
    mocked_api: MockRouter,
    create_bot: Callable,
    tmp_path: Path,
) -> None:
    # ... existing code ...

    # Test partial name match
    plugin_name_partial = "github"
    async with app.test_matcher(_matcher) as ctx:
        bot = create_bot(ctx)
        bot: Bot = cast(Bot, bot)
        raw_message = f"搜索插件 {plugin_name_partial}"
        event: GroupMessageEvent = _v11_group_message_event(
            message=raw_message,
            self_id=BotId.QQ_BOT,
            user_id=UserId.SUPERUSER,
            group_id=GroupId.GROUP_ID_LEVEL_5,
            message_id=MessageId.MESSAGE_ID_3,
            to_me=True,
        )
        ctx.receive_event(bot=bot, event=event)

    # ... rest of the existing assertions ...

Comment on lines +17 to +70
async def test_update_plugin_basic_need_update(
app: App,
mocker: MockerFixture,
mocked_api: MockRouter,
create_bot: Callable,
tmp_path: Path,
) -> None:
"""
测试更新基础插件,插件需要更新
"""
from zhenxun.builtin_plugins.plugin_store import _matcher

init_mocked_api(mocked_api=mocked_api)
mock_base_path = mocker.patch(
"zhenxun.builtin_plugins.plugin_store.data_source.BASE_PATH",
new=tmp_path / "zhenxun",
)
mocker.patch(
"zhenxun.builtin_plugins.plugin_store.data_source.ShopManage.get_loaded_plugins",
return_value=[("search_image", "0.0")],
)

plugin_id = 1

async with app.test_matcher(_matcher) as ctx:
bot = create_bot(ctx)
bot: Bot = cast(Bot, bot)
raw_message = f"更新插件 {plugin_id}"
event: GroupMessageEvent = _v11_group_message_event(
message=raw_message,
self_id=BotId.QQ_BOT,
user_id=UserId.SUPERUSER,
group_id=GroupId.GROUP_ID_LEVEL_5,
message_id=MessageId.MESSAGE_ID,
to_me=True,
)
ctx.receive_event(bot=bot, event=event)
ctx.should_call_send(
event=event,
message=Message(message=f"正在更新插件 Id: {plugin_id}"),
result=None,
bot=bot,
)
ctx.should_call_send(
event=event,
message=Message(message="插件 识图 更新成功! 重启后生效"),
result=None,
bot=bot,
)
assert mocked_api["basic_plugins"].called
assert mocked_api["extra_plugins"].called
assert mocked_api["zhenxun_bot_plugins_metadata"].called
assert mocked_api["search_image_plugin_file_init"].called
assert (mock_base_path / "plugins" / "search_image" / "__init__.py").is_file()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 更新插件的全面测试

此测试很好地覆盖了插件更新过程,包括检查 API 调用和文件更新。考虑添加对更新文件内容的检查,以确保其已正确更新。

Original comment in English

suggestion (testing): Thorough test for updating a plugin

This test covers the plugin update process well, including checking for API calls and file updates. Consider adding a check for the content of the updated file to ensure it's been properly updated.

async def test_update_plugin_basic_need_update(
    app: App,
    mocker: MockerFixture,
    mocked_api: MockRouter,
    create_bot: Callable,
    tmp_path: Path,
) -> None:
    # ... existing setup code ...

    assert (mock_base_path / "plugins" / "search_image" / "__init__.py").is_file()
    with open(mock_base_path / "plugins" / "search_image" / "__init__.py", "r") as f:
        assert "# Updated plugin content" in f.read()

Comment on lines +19 to +66
async def test_remove_plugin(
app: App,
mocker: MockerFixture,
mocked_api: MockRouter,
create_bot: Callable,
tmp_path: Path,
) -> None:
"""
测试删除插件
"""
from zhenxun.builtin_plugins.plugin_store import _matcher

init_mocked_api(mocked_api=mocked_api)
mock_base_path = mocker.patch(
"zhenxun.builtin_plugins.plugin_store.data_source.BASE_PATH",
new=tmp_path / "zhenxun",
)

plugin_path = mock_base_path / "plugins" / "search_image"
plugin_path.mkdir(parents=True, exist_ok=True)

with open(plugin_path / "__init__.py", "wb") as f:
f.write(get_content_bytes("search_image.py"))

plugin_id = 1

async with app.test_matcher(_matcher) as ctx:
bot = create_bot(ctx)
bot: Bot = cast(Bot, bot)
raw_message = f"移除插件 {plugin_id}"
event: GroupMessageEvent = _v11_group_message_event(
message=raw_message,
self_id=BotId.QQ_BOT,
user_id=UserId.SUPERUSER,
group_id=GroupId.GROUP_ID_LEVEL_5,
message_id=MessageId.MESSAGE_ID,
to_me=True,
)
ctx.receive_event(bot=bot, event=event)
ctx.should_call_send(
event=event,
message=Message(message="插件 识图 移除成功! 重启后生效"),
result=None,
bot=bot,
)
assert mocked_api["basic_plugins"].called
assert mocked_api["extra_plugins"].called
assert not (mock_base_path / "plugins" / "search_image" / "__init__.py").is_file()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 插件移除的良好测试

此测试有效地检查了插件移除过程。很好的是你验证了文件确实被移除。考虑添加检查以确保任何相关目录也被清理,如果这是预期行为的一部分。

Original comment in English

suggestion (testing): Good test for plugin removal

This test effectively checks the plugin removal process. It's good that you're verifying the file is actually removed. Consider adding a check to ensure any related directories are also cleaned up if that's part of the expected behavior.

async def test_remove_plugin(
    app: App,
    mocker: MockerFixture,
    mocked_api: MockRouter,
    create_bot: Callable,
    tmp_path: Path,
) -> None:
    # ... (existing setup code)

    assert not (mock_base_path / "plugins" / "search_image" / "__init__.py").is_file()
    assert not (mock_base_path / "plugins" / "search_image").is_dir()

@AkashiCoin
Copy link
Collaborator Author

@sourcery-ai review

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AkashiCoin - 我已经审查了你的更改,看起来很棒!

这是我在审查期间查看的内容
  • 🟡 一般问题: 发现1个问题
  • 🟢 安全性: 一切看起来都很好
  • 🟢 测试: 一切看起来都很好
  • 🟢 复杂性: 一切看起来都很好
  • 🟢 文档: 一切看起来都很好

Sourcery 对开源项目免费 - 如果你喜欢我们的审查,请考虑分享它们 ✨
帮助我变得更有用!请点击 👍 或 👎 在每条评论上告诉我它是否有帮助。
Original comment in English

Hey @AkashiCoin - I've reviewed your changes and they look great!

Here's what I looked at during the review
  • 🟡 General issues: 1 issue found
  • 🟢 Security: all looks good
  • 🟢 Testing: all looks good
  • 🟢 Complexity: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment to tell me if it was helpful.

@@ -254,7 +256,10 @@ async def add_plugin(cls, plugin_id: int) -> str:
if plugin_id < 0 or plugin_id >= len(data):
return "插件ID不存在..."
plugin_key = list(data.keys())[plugin_id]
plugin_list = await cls.get_loaded_plugins("module")
plugin_info = data[plugin_key]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (performance): 考虑将安装检查提前

检查插件是否已安装可以在方法中更早进行,在获取插件信息之前。这将避免对已安装的插件进行不必要的处理。

plugin_list = await cls.get_loaded_plugins("module", "version")
suc_plugin = {p[0]: (p[1] or "Unknown") for p in plugin_list}
if plugin_info.module in [p[0] for p in plugin_list]:
    return f"插件 {plugin_key} 已安装,无需重复安装"
is_external = True
if plugin_info.github_url is None:
    plugin_info.github_url = DEFAULT_GITHUB_URL
logger.info(f"尝试更新插件 {plugin_key}", "插件管理")
logger.debug(f"当前插件列表: {suc_plugin}", "插件管理")
if cls.check_version_is_new(plugin_info, suc_plugin):
    return f"插件 {plugin_key} 已是最新版本"
Original comment in English

suggestion (performance): Consider moving the installation check earlier

The check for whether the plugin is already installed could be moved earlier in the method, before fetching the plugin info. This would avoid unnecessary processing for plugins that are already installed.

plugin_list = await cls.get_loaded_plugins("module", "version")
suc_plugin = {p[0]: (p[1] or "Unknown") for p in plugin_list}
if plugin_info.module in [p[0] for p in plugin_list]:
    return f"插件 {plugin_key} 已安装,无需重复安装"
is_external = True
if plugin_info.github_url is None:
    plugin_info.github_url = DEFAULT_GITHUB_URL
logger.info(f"尝试更新插件 {plugin_key}", "插件管理")
logger.debug(f"当前插件列表: {suc_plugin}", "插件管理")
if cls.check_version_is_new(plugin_info, suc_plugin):
    return f"插件 {plugin_key} 已是最新版本"

@AkashiCoin AkashiCoin merged commit 44e0f2d into HibiKier:dev Sep 2, 2024
1 check passed
@AkashiCoin AkashiCoin deleted the tests/plugin_store branch September 2, 2024 07:00
@HibiKier HibiKier mentioned this pull request Sep 30, 2024
HibiKier added a commit that referenced this pull request Sep 30, 2024
* ✨ 父级插件加载

* ✅ 添加测试:更新与添加插件 (#1594)

* ✅ 测试更新与添加插件

* ✅ Sourcery建议

* 👷 添加pytest

* 🎨 优化代码

* 🐛 bug修复

* 🐛修复添加插件返回403的问题 (#1595)

* 完善测试方法
* vscode测试配置
* 重构插件安装过程

* 🎨 修改readme

* Update README.md

* 🐛 修改bug与版本锁定

* 🐛 修复超级用户对群组功能开关

* 🐛 修复插件商店检查插件更新问题 (#1597)

* 🐛 修复插件商店检查插件更新问题

* 🐛 恶意命令检测问题

* 🐛 增加插件状态检查 (#1598)

* ✅ 优化测试用例

* 🐛 更改插件更新与安装逻辑

* 🐛 修复更新群组成员信息

* 🎨 代码优化

* 🚀 更新Dockerfile (#1599)

* 🎨 更新requirements

* ➕ 添加依赖aiocache

* ⚡ 添加github镜像

* ✨ 添加仓库目录多获取渠道

* 🐛 修复测试用例

* ✨ 添加API缓存

* 🎨 采取Sourcery建议

* 🐛 文件下载逻辑修改

* 🎨 优化代码

* 🐛 修复插件开关有时出现错误

* ✨ 重构自检ui

* 🐛 自检html修正

* 修复签到逻辑bug,并使代码更灵活以适应签到好感度等级配置 (#1606)

* 修复签到功能已知问题

* 修复签到功能已知问题

* 修改参数名称

* 修改uid判断

---------

Co-authored-by: HibiKier <[email protected]>

* 🎨 代码结构优化

* 🐛 私聊时修改插件时删除私聊帮助

* 🐛 过滤父插件

* 🐛 修复自检在ARM上的问题 (#1607)

* 🐛 修复自检在ARM上的问题

* ✅ 优化测试

* ✨ 支持mysql,psql,sqlite随机函数

* 🔧 VSCode配置修改

* 🔧 VSCode配置修改

* ✨ 添加金币排行

Co-Authored-By: HibiKier <[email protected]>

* 📝 修改README

Co-Authored-By: HibiKier <[email protected]>

* 🔨 提取GitHub相关操作 (#1609)

* 🔨 提取GitHub相关操作

* 🔨 重构API策略

* ✨ 签到/金币排行限制最大数量 (#1616)

* ✨ 签到/金币排行限制最大数量

* 🐛 修复超级用户id获取问题

* 🐛 修复路径解压与挂载 (#1619)

* 🐛 修复功能少时zhenxun帮助图片排序问题 (#1620)

* 🐛 签到文本适应 (#1622)

* 🐛 好感度排行提供默认值 (#1624)

* 🎈 优先使用github api (#1625)

* ✨ 重构帮助,限制普通用户查询管理插件 (#1626)

* 🐛 修复群权限与插件等级匹配 (#1627)

* ✨ 当管理员尝试ban真寻时将被反杀 (#1628)

* ✨ 群组发言时间检测提供开关配置 (#1630)

* 🐳 chore: 支持自动修改版本号 (#1629)

* 🎈 perf(github_utils): 支持github url下载遍历 (#1632)

* 🎈 perf(github_utils): 支持github url下载遍历

* 🐞 fix(http_utils): 修复一些下载问题

* 🦄 refactor(http_utils): 部分重构

* chore(version): Update version to v0.2.2-e6f17c4

---------

Co-authored-by: AkashiCoin <[email protected]>

* 🧪 test(auto_update): 修复测试用例 (#1633)

* 🐛 修复商店商品为空时报错 (#1634)

* 🐛 修复群权限与插件等级匹配 (#1635)

* ✨ message_build支持AtAll (#1639)

* 🎈 perf: 使用commit号下载插件 (#1641)

* 🎈 perf: 使用commit号下载插件

* chore(version): Update version to v0.2.2-f9c7360

---------

Co-authored-by: AkashiCoin <[email protected]>

* 🐳 chore: 修改运行检查触发路径 (#1642)

* 🐳 chore: 修改运行检查触发路径

* 🐳 chore: 添加tests目录

* ✨ 重构qq群事件处理 (#1643)

* 🐛 签到名称自适应 (#1644)

* 🎨  更新README (#1645)

* 🐛 fix(http_utils): 流式下载Content-Length错误 (#1647)

* 🐛 修复群组中帮助功能状态显示问题 (#1650)

* 🐛 修复群欢迎消息设置 (#1651)

* 🐛 修复webui下载后首次启动错误 (#1652)

* 🐛 修复webui下载后首次启动错误

* chore(version): Update version to v0.2.2-4a8ef85

---------

Co-authored-by: HibiKier <[email protected]>

* ✨ 移除默认图片文件夹:爬 (#1653)

* ✨ 安装/移除插件提供插件安装/卸载方法用于插件初始化 (#1654)

* ✨ 新增超级用户与管理员帮助模板 (#1655)

* ✨ 新增个人信息命令 (#1657)

* ✨ 修改个人信息菜单名称 (#1658)

* ✨ 新增插件商店api (#1659)

* ✨ 新增插件商店api

* chore(version): Update version to v0.2.2-7e15f20

---------

Co-authored-by: HibiKier <[email protected]>

* ✨ 将cd,block,count限制复原配置文件 (#1662)

* 🎨 修改README (#1663)

* 🎨 修改版本号 (#1664)

* 🎨 修改requirements (#1665)

---------

Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: fanyinrumeng <[email protected]>
Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: Elaga <[email protected]>
Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: HibiKier <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant