前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Newbe.Mahua.Samples.ApiExtensions 对IMahuaApi进行扩展

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

作者头像
newbe36524
发布2020-03-16 11:09:20
3810
发布2020-03-16 11:09:20
举报
文章被收录于专栏:newbe36524的技术专栏

本教程将通过对CQP进行API扩展为例,来实现以下功能:

  • 扩展CQP原生不支持的获取好友列表接口
  • 替换CQP原生的发送好友消息接口
  • 通过Newbe.Mahua.CQP.ApiExtensions实现扩展CQP原生不支持的发送群公告接口

对于其他平台的扩展都可以参考此教程。

软硬条件

IDE

VS2017.5

Newbe.Mahua

1.7

业务逻辑

当收到好友消息的时候,获取好友列表。

将好友列表的数据写入到群公告中。

替换发送好友消息接口,实际上将好友消息写入到日志文件中。

新建项目

使用Newbe.Mahua.Plugins.Template模板创建项目,项目名称为Newbe.Mahua.Samples.ApiExtensions

新建项目的详细细节,可以参照右侧链接内容:新建项目

业务逻辑实现

本教程主要为了演示API的调用效果,因此只需要实现”好友消息接收事件”即可,具体代码如下:

MahuaEvents下添加”好友消息接收事件”,并在事件内调用业务逻辑。实现代码如下:

MahuaEvents文件夹是本SDK建议将事件放置的文件夹位置。也可以不接受建议而添加在其他地方。

代码语言:javascript
复制
using Newbe.Mahua.MahuaEvents;

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

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

        public void ProcessFriendMessage(PrivateMessageFromFriendReceivedContext context)
        {
            // 获取好友列表
            var friends = _mahuaApi.GetFriends();

            // 测试好友消息发送
            _mahuaApi.SendPrivateMessage(context.FromQq, "这条消息将写入到日志当中");

            // 测试设置公告接口,需要本QQ在目标群具备管理员权限
            _mahuaApi.SetNotice("610394020", "测试公告", friends);
        }
    }
}

扩展API

以下采用三种方式扩展API。

自己实现原来不支持的

IMahuaApi.GetFriends在CQP平台下,原生是不支持的,本节可以通过添加实现类来进行扩展。

MahuaApis下添加”获取好友列表”。并实现代码如下:

MahuaApis 文件夹是本SDK建议将API扩展放置的文件夹位置。也可以不接受建议而添加在其他地方。

代码语言:javascript
复制
using Newbe.Mahua.Apis;

namespace Newbe.Mahua.Samples.ApiExtensions.MahuaApis
{
    public class GetFriendsApiMahuaCommandHandler : IApiCommandHandler<GetFriendsApiMahuaCommand, GetFriendsApiMahuaCommandResult>
    {
        public GetFriendsApiMahuaCommandResult Handle(GetFriendsApiMahuaCommand message)
        {
            var re = new GetFriendsApiMahuaCommandResult
            {
                FriendsString = "这是一段测试好友消息,这段消息会被发送到公告中"
            };
            return re;
        }
    }
}

替换原来就支持的

IMahuaApi.SendPrivateMessage接口是CQP平台原生就支持的接口。

本节将通过扩展来覆盖原有的逻辑,将需要发送的消息写入到日志文件中。

MahuaApis下添加”发送私聊消息”。并实现代码如下:

MahuaApis 文件夹是本SDK建议将API扩展放置的文件夹位置。也可以不接受建议而添加在其他地方。

代码语言:javascript
复制
using Newbe.Mahua.Apis;
using Newbe.Mahua.Logging;

namespace Newbe.Mahua.Samples.ApiExtensions.MahuaApis
{
    public class SendPrivateMessageApiMahuaCommandHandler : IApiCommandHandler<SendPrivateMessageApiMahuaCommand>
    {
        public void Handle(SendPrivateMessageApiMahuaCommand message)
        {
            var logger = LogProvider.For<SendPrivateMessageApiMahuaCommandHandler>();

            // 将好友消息写入到日志当中
            logger.Info(message.Message);
        }
    }
}

引入扩展包

IMahuaApi.SetNotice在CQP平台下,原生是不支持的。

为了给开发者提供更多便利的功能。本SDK提供了Newbe.Mahua.*.ApiExtensions系列 nuget 包。

插件使用者只需要引入这些 nuget 并恰当的注册,便可以实现对平台原生不支持的API进行扩展。

在项目源码下Readme.md的MahuaApi支持列表详细记录了平台原生支持的API和扩展包支持的API。

Newbe.Mahua.CQP.ApiExtensions 1.7 版本实现了 CQP 平台下发送群公告的功能,因此,通过 nuget 直接安装此包即可。

模块注册

以上三种方式实现API的扩展都需要在模块中进行注册,具体的注册代码如下:

代码语言:javascript
复制
using Autofac;
using Newbe.Mahua.Apis;
using Newbe.Mahua.CQP.ApiExtensions;
using Newbe.Mahua.MahuaEvents;
using Newbe.Mahua.Samples.ApiExtensions.MahuaApis;
using Newbe.Mahua.Samples.ApiExtensions.MahuaEvents;

namespace Newbe.Mahua.Samples.ApiExtensions
{
    /// <summary>
    /// Ioc容器注册
    /// </summary>
    public class MahuaModule : IMahuaModule
    {
        public Module[] GetModules()
        {
            // 可以按照功能模块进行划分,此处可以改造为基于文件配置进行构造。实现模块化编程。
            return new Module[]
            {
                new PluginModule(),
                new MahuaEventsModule(),
                new MyApiModule(),

                // 引入CQP的API扩展包的模块注册
                new CqpApiExtensionsModule(),
            };
        }

        /// <summary>
        /// 基本模块
        /// </summary>
        private class PluginModule : Module
        {
            protected override void Load(ContainerBuilder builder)
            {
                base.Load(builder);
                // 将实现类与接口的关系注入到Autofac的Ioc容器中。如果此处缺少注册将无法启动插件。
                // 注意!!!PluginInfo是插件运行必须注册的,其他内容则不是必要的!!!
                builder.RegisterType<PluginInfo>()
                    .As<IPluginInfo>();

                //注册在“设置中心”中注册菜单,若想订阅菜单点击事件,可以查看教程。http://www.newbe.cf/docs/mahua/2017/12/24/Newbe-Mahua-Navigations.html
                builder.RegisterType<MyMenuProvider>()
                    .As<IMahuaMenuProvider>();
            }
        }

        /// <summary>
        /// <see cref="IMahuaEvent"/> 事件处理模块
        /// </summary>
        private class MahuaEventsModule : Module
        {
            protected override void Load(ContainerBuilder builder)
            {
                base.Load(builder);
                // 将需要监听的事件注册,若缺少此注册,则不会调用相关的实现类
                builder.RegisterType<PrivateMessageFromFriendReceivedMahuaEvent>()
                    .As<IPrivateMessageFromFriendReceivedMahuaEvent>();
            }
        }

        private class MyApiModule : Module
        {
            protected override void Load(ContainerBuilder builder)
            {
                base.Load(builder);

                // 当前平台是CQP时才注册这些扩展API
                if (MahuaGlobal.CurrentPlatform == MahuaPlatform.Cqp)
                {
                    // 作者名称,既然是你实现了这个功能,那就填上你的名字吧
                    var authorName = "Newbe36524";

                    // 此方法没有CQP提供,此处将注册自己的实现
                    builder.RegisterMahuaApi<GetFriendsApiMahuaCommandHandler, GetFriendsApiMahuaCommand, GetFriendsApiMahuaCommandResult>(authorName);

                    // CQP原生也提供了此API的实现,这里注册时候将会覆盖原来的实现
                    builder.RegisterMahuaApi<SendPrivateMessageApiMahuaCommandHandler, SendPrivateMessageApiMahuaCommand>(authorName);
                }

            }
        }
    }
}

集成测试

万事具备,只欠生成。

生成解决方案,运行build.bat,复制相关的 DLL 到对应的平台,向机器人发送消息,效果达成!

以下是 CQP 平台的测试效果。其实其他的没测试

总结

不同平台具备不同的API支持范围。通过自定义扩展和扩展包的引入,可以弥合各平台之间的不同。

Newbe.Mahua.*.ApiExtensions系列 nuget 包的实现需要依托社区发展方可进一步完善,欢迎您参与其中。

实例的项目代码,可以在源码仓库中的Newbe.Mahua.Samples.ApiExtensions解决方案下找到。

教程链接

发布说明

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-01-072,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 软硬条件
  • 业务逻辑
  • 新建项目
  • 业务逻辑实现
  • 扩展API
    • 自己实现原来不支持的
      • 替换原来就支持的
        • 引入扩展包
        • 模块注册
        • 集成测试
        • 总结
        • 教程链接
        • 发布说明
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档