Newbe.Mahua 插件热更新

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

软硬条件

IDEVS2017.5
Newbe.Mahua1.11

项目基础

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

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

PluginInfo.cs文件内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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";
}
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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” 的回复。

开始体验热更新

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

教程链接

发布说明