Newbe.Mahua 插件热更新

本教程阐述如何在使用 Newbe.Mahua 开发插件时使用”插件热更新”技术。

软硬条件

IDE VS2017.5
Newbe.Mahua 1.11

项目基础

在阅读本教程之前,想必开发者已经学会了如何插件插件项目。因此本节只将本示例使用的关键参数和代码贴出。

本插件项目名称使用Newbe.Mahua.Samples.HotUpdate,使用Newbe.Mahua.Plugins.Template模板。

PluginInfo.cs文件内容:

namespace Newbe.Mahua.Samples.HotUpdate
{
    /// <summary>
    /// 本插件的基本信息
    /// </summary>
    public class PluginInfo : IPluginInfo
    {
        /// <summary>
        /// 版本号,建议采用 主版本.次版本.修订号 的形式
        /// </summary>
        public string Version { get; set; } = "1.0.0";

        /// <summary>
        /// 插件名称
        /// </summary>

        public string Name { get; set; } = "Newbe.Mahua.Samples.HotUpdate";

        /// <summary>
        /// 作者名称
        /// </summary>
        public string Author { get; set; } = "Newbe";

        /// <summary>
        /// 插件Id,用于唯一标识插件产品的Id,至少包含 AAA.BBB.CCC 三个部分
        /// </summary>
        public string Id { get; set; } = "Newbe.Mahua.Samples.HotUpdate";

        /// <summary>
        /// 插件描述
        /// </summary>
        public string Description { get; set; } = "Newbe.Mahua.Samples.HotUpdate";
    }
}

新建一个好友消息处理事件(不要忘记注册):

using Newbe.Mahua.MahuaEvents;

namespace Newbe.Mahua.Samples.HotUpdate.MahuaEvents
{
    /// <summary>
    /// 来自好友的私聊消息接收事件
    /// </summary>
    public class PrivateMessageMahuaEventV1
        : IPrivateMessageReceivedMahuaEvent
    {
        private readonly IMahuaApi _mahuaApi;

        public PrivateMessageMahuaEventV1(
            IMahuaApi mahuaApi)
        {
            _mahuaApi = mahuaApi;
        }

        public void ProcessPrivateMessage(PrivateMessageReceivedContext context)
        {
            _mahuaApi.SendPrivateMessage(context.FromQq)
                .Text("嘤嘤嘤 v1")
                .Done();
        }
    }
}

运行build.bat生成插件文件,复制到机器人平台启动。

那么当向机器人发送任意消息时,将会得到 “嘤嘤嘤 v1” 的回复。

开始体验热更新

在上一节项目的基础上,我们再增加一个好友消息处理事件(不要忘记注册):

using Newbe.Mahua.MahuaEvents;

namespace Newbe.Mahua.Samples.HotUpdate.MahuaEvents
{
    /// <summary>
    /// 来自好友的私聊消息接收事件
    /// </summary>
    public class PrivateMessageMahuaEventV2
        : IPrivateMessageReceivedMahuaEvent
    {
        private readonly IMahuaApi _mahuaApi;

        public PrivateMessageMahuaEventV2(
            IMahuaApi mahuaApi)
        {
            _mahuaApi = mahuaApi;
        }
        public void ProcessPrivateMessage(PrivateMessageReceivedContext context)
        {
            _mahuaApi.SendPrivateMessage(context.FromQq)
                .Text("嘤嘤嘤 v2")
                .Done();
        }
    }
}

运行build.bat生成插件文件。

注意!从这步开始之后不一样了。

进入生成了对应平台的文件夹,文件夹中包含一个文件夹名称为YUELUO的文件夹。

该文件夹就是”插件热更新”的核心文件夹。

将YUELUO文件夹,复制到对应的机器人平台根目录

通过 LogView 日志查看器,便可以看到热更新已经启动。

经过一段时间的等待后,热更新将会结束。

此时,向机器人发送任意消息时,将会得到 “嘤嘤嘤 v1” 和 “嘤嘤嘤 v2” 的两条回复即表示热更新已经成功。

YUELUO 是 You unknow every lucky ubuntu owner 的缩写。摘自某论坛上centos使用者对ubuntu使用者的嘲讽。绝对没有月落的意思

其他注意点

开始热更新事件 IPluginHotUpgradingMahuaEvent

开发者可以订阅”开始热更新事件”,在插件开始热更新时进行一些操作。并且能够通过参数控制是否取消热更新。

以下便是一个订阅的例子,该示例将允许在奇数秒进行热更新,偶数秒阻止热更新:

using Newbe.Mahua.MahuaEvents;
using System;

namespace Newbe.Mahua.Samples.HotUpdate.MahuaEvents
{
    public class PluginHotUpgradingMahuaEvent : IPluginHotUpgradingMahuaEvent
    {
        public void HotUpgrading(
            PluginHotUpgradingContext context)
        {
            if (DateTime.Now.Second % 2 == 0)
            {
                context.Canceled = true;
                context.Reason = "月老板说,该时辰不利于更新!";
            }
        }
    }
}

热更新成功事件 IPluginHotUpgradedMahuaEvent

开发者可以订阅”热更新成功事件”,在插件热更新成功时进行一些操作。若在”开始热更新事件”中取消了热更新,将不会触发该事件。

以下便是一个订阅的例子,该示例将在热更新成功之后输出一条日志:

using Newbe.Mahua.Logging;
using Newbe.Mahua.MahuaEvents;

namespace Newbe.Mahua.Samples.HotUpdate.MahuaEvents
{
    public class PluginHotUpgradedMahuaEvent : IPluginHotUpgradedMahuaEvent
    {
        private static readonly ILog Logger = LogProvider.For<PluginHotUpgradedMahuaEvent>();

        public void HotUpgraded(PluginHotUpgradedContext context)
        {
            Logger.Info("更新完毕,感谢月落大佬的奇妙点子");
        }
    }
}

插件初始化事件 IInitializationMahuaEvent

该事件原本在插件机器人初始化插件时,将会进行调用。

同时,在热更新成功之后,也将再次触发此事件。

热更新过程中的消息

热更新开始后,将会将后续接收的所有的消息进行暂存,在热更新成功之后发送后热更新之后的插件进行处理。

热回滚

其实只要将文件夹自行备份就能够自己实现热回滚功能。

示例代码

本教程中的所有示例代码,都可以在以下链接获取:

https://github.com/newbe36524/Newbe.Mahua.Framework/tree/master/src/Newbe.Mahua.Samples.HotUpdate

教程链接

Newbe.Mahua 1.X 主要特性介绍与常见问题讲解

开始第一个QQ机器人【适用于v1.9-1.14】

Newbe.Mahua 插件热更新

Newbe.Mahua.Samples.ApiExtensions 对IMahuaApi进行扩展

Newbe.Mahua.Samples.LiveGirl 操作定时任务

Newbe.Mahua.Samples.Sqlite SQLite操作实例

Newbe.Mahua 测试与调试

Newbe.Mahua 扩展设置中心

【开源访谈】对接 QQ 机器人平台,对接共同成长的开源社区(开源中国采访)

发布说明

Newbe.Mahua 1.14 全新项目模板

Newbe.Mahua 1.13 支持撤回消息

Newbe.Mahua 1.12 第一个LTS版本

Newbe.Mahua 1.11 支持热更新

Newbe.Mahua 1.10 全新日志查看器

Newbe.Mahua 1.9 引入 Session

Newbe.Mahua 1.8 消息发送Fluent API

Newbe.Mahua 1.7.0 支持API扩展

Newbe.Mahua 1.6.0 开发便利性提升