# 送信器 >[info] 送信器是与插件进行消息交互的重要对象。如果没有送信器,那么你就只能接收消息而无法响应消息。 >[warning] **各种方法内容以实际代码内容为准。** ## **前排预警** 在你研究送信器之前,有一件事情你首先需要了解。 三个送信器`SENDER`、`SETTER`、`GETTER`内的所有方法都是**接口形式**,而真正去实现接口的,是你所使用的**组件**。每一个组件都会去针对一个插件做通讯,并封装消息,然后以接口类型交给使用者。 为什么要提这个呢,主要是想要表达以下观点: >[danger] (**尤其是非平台所提供的功能中**)并非所有API都可用,也并非所有API中返回的数据的所有方法都能获取到数据。 举个例子,酷Q中其实并没有提供**获取群详细信息**这么一个功能,那么不同的插件之间,对于此功能的实现就可能有所不同,比如A插件不存在群等级,B插件获取不到管理员列表,而C插件压根就不支持之类的。 其次,有时候我可能会偷偷的更新一些api但是忘了更新文档,所以一切内容以实际代码为准。你可以通过maven下载源代码查看各个方法的注释。 ## **消息交互** 核心框架提供了三种类型的送信接口: SENDER、GETTER 、SETTER,并将这三个送信接口整合于送信器对象`MsgSender`中。 (关于这三个送信接口的API请查阅送信器章节下的对应章节) 这三个送信接口在送信器`MsgSender`中均作为公共常量(`public final`)使用,所以你可以直接使用而不用调方法获取。 举个例子,假如你要发送一个私信消息 '你好' 到QQ号:123456789,那么代码是这样的: ```java msgSender.SENDER.sendPrivateMsg("123456789", "你好"); ``` 很简单,不是吗? *关于这三个送信器的API这里不做过多介绍,请查询对应章节。* >[danger] **注①:** 核心框架所提供的这三个送信接口仅作为规范,具体API是否可以实现或使用请参照对应支持组件的文档介绍。 > 例如LEMOC插件本身并不存在获取群成员列表这样的API。 >[danger] **注②:** 有时候插件也有可能会提供一些核心框架中没有的API,此类API可简称为扩展API,而此类扩展API的使用方式均由组件框架所定义,所以如果有,则其具体使用方式参照对应的组件框架。 ## **内容判断** 送信器提供了一些方法以对送信器中存在的元素状态进行判断: ```java /** * 是否存在监听器函数 */ boolean hasMethod(); /** * 是否存在send消息器 */ boolean isSendAble(); /** * 是否存在set消息器 */ boolean isSetAble(); /** * 是否存在Get消息器 */ boolean isGetAble(); ``` ## **执行阻断** 送信器除了于插件交互以外,还有一个重要的功能就是使用阻断机制来对监听函数进行控制了。 关于阻断机制相关内容、讲解请详见 阻断机制 章节。 ## **增强方法** >[info] 从`v1.1-BETA`开始增加 伴随着HttpApi插件对接组件的基础功能开发,我发现正常的接口不会存在类似于群名称、qq好友昵称这样的信息。于是乎,我调整了部分内部消息封装类的接口(对使用无影响),并在MsgSender中增加了部分方法来便捷获取对应的信息。 * 通过QQ号获取陌生人信息 ```java /** * 通过QQ号获取陌生人信息 * @param code qq号 * @return qq号的信息 */ public StrangerInfo getPersonInfoByCode(String code); ``` * 通过携带QQ号信息的对象来获取信息 >[success] 只要能从对象中获取到QQ号信息的监听对象,都可以直接作为参数在此方法中使用。 > 例如:**`PrivateMsg(私信消息的发信人)`、`GroupMsg(群消息的发信人)`**。 > 假如对象中存在多个账号信息,例如两种QQ号(操作者和被操作者),例如 **`GroupMemberReduce(群成员减少事件)`**,则默认获取的为被操作者的QQ号 ```java /** * 通过携带QQ号信息的对象来获取信息 * @param codeAble 携带QQ号信息的对象 * @return */ public StrangerInfo getPersonInfo(QQCodeAble codeAble); ``` * 通过群号获取群详细信息 ```java /** * 通过群号获取群详细信息 * @param groupCode 群号 * @return 群详细信息 */ public GroupInfo getGroupInfoByCode(String groupCode); ``` * 通过携带群号的对象获取群详细信息 > 原理同上,只要能获取到QQ号的监听消息都可以放进去当参数,例如`GroupMsg` ```java /** * 通过携带群号的对象获取群详细信息 * @param groupCodeAble 携带群号的对象 * @return 群详细信息 */ public GroupInfo getGroupInfo(GroupCodeAble groupCodeAble); ``` ## 简化方法 >[info] 从`v1.2.3-BETA`开始增加 在版本迭代的过程中,我在一点点的优化框架中的结构与接口,并且得益于此,我在`v1.2.3-BETA`版本之后在三种送信器中都增加了一部分可以简化操作的API。这些API与原来的方法功能一致,仅仅是参数的填入更加简便了。 在三个送信器中,假如你获取到了一个私信消息(`PrivateMsg`),想要通过这个消息中的QQ号信息来获取一个陌生人信息(`StrangerInfo`),以前是需要先获取QQ号,然后QQ号再作为参数来获取,就像这样: ```java @Listen(MsgGetTypes.privateMsg) public void hello(PrivateMsg privateMsg, MsgSender sender){ String qq = privateMsg.getQQ(); StrangerInfo strangerInfo = sender.GETTER.getStrangerInfo(qq); } ``` 在结构优化之后,只要是携带了QQ号信息的信息对象(例如私信消息`PrivateMsg`、群消息`GroupMsg`),都可以直接作为参数放入。就像这样: ```java @Listen(MsgGetTypes.privateMsg) public void hello(PrivateMsg privateMsg, MsgSender sender){ StrangerInfo strangerInfo = sender.GETTER.getStrangerInfo(privateMsg); } ```