cpp-mirai-client  v2.6.1
cpp client for mirai-api-http
GMockAdaptor.hpp
浏览该文件的文档.
1// Copyright (C) 2022 Numendacil and contributors
2//
3// This program is free software: you can redistribute it and/or modify
4// it under the terms of the GNU Affero General Public License as
5// published by the Free Software Foundation, either version 3 of the
6// License, or (at your option) any later version.
7//
8// This program is distributed in the hope that it will be useful,
9// but WITHOUT ANY WARRANTY; without even the implied warranty of
10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11// GNU Affero General Public License for more details.
12//
13// You should have received a copy of the GNU Affero General Public License
14// along with this program. If not, see <http://www.gnu.org/licenses/>.
15
16#if __has_include(<gmock/gmock.h>)
17
18#ifndef MIRAI_GMOCK_ADAPTOR_HPP_
19#define MIRAI_GMOCK_ADAPTOR_HPP_
20
21#include <memory>
22#include <string_view>
23
24#include <gmock/gmock.h>
25
26#include "IAdaptor.hpp"
27
28/// 所有mirai相关的对象的命名空间
29namespace Mirai
30{
31
32class GMockAdaptor : public IAdaptor
33{
34 static constexpr std::string_view SESSION_KEY = "SessionKey";
35
36public:
37 template<typename... Args> using Callback = std::function<void(Args...)>;
38 using string = std::string;
39
40 GMockAdaptor() = default;
41 ~GMockAdaptor() override = default;
42
43 Callback<ClientConnectionEstablishedEvent> ConnectionEstablishedCallback;
44 Callback<const string&> TextCallback;
45 Callback<ClientConnectionErrorEvent> ConnectionErrorCallback;
46 Callback<ClientConnectionClosedEvent> ConnectionClosedCallback;
47
48
49 // *********************************************
50 // ******* Connection & Event related **********
51 // *********************************************
52
53 /**
54 * @brief Register callback for ConnectionEstablished event
55 *
56 */
57 void OnConnectionEstablished(Callback<ClientConnectionEstablishedEvent> callback) override
58 {
59 this->ConnectionEstablishedCallback = callback;
60 }
61
62 /**
63 * @brief Register callback for receiving content
64 *
65 */
66 void OnRecv(Callback<const string&> callback) override { this->TextCallback = callback; }
67
68 /**
69 * @brief Register callback for ConnectionError event
70 *
71 */
72 void OnConnectionError(Callback<ClientConnectionErrorEvent> callback) override
73 {
74 this->ConnectionErrorCallback = callback;
75 }
76
77 /**
78 * @brief Register callback for ConnectionClosed event
79 *
80 */
81 void OnConnectionClosed(Callback<ClientConnectionClosedEvent> callback) override
82 {
83 this->ConnectionClosedCallback = callback;
84 }
85
86 /**
87 * @brief Called for opening a session to mirai-api-http
88 *
89 * Connect should not return before ConnectionEstablished callback is called
90 */
91 void Connect() override
92 {
93
94 if (this->ConnectionEstablishedCallback)
95 {
96 ClientConnectionEstablishedEvent event;
97
98 event.uri = "/api";
99 event.headers = {{"Date", "Tue, 07 Mar 2023 07:35:38 GMT"}, {"Server", "ktor-server-core/1.6.7"}};
100 event.protocol = "HTTP";
101 event.SessionKey = SESSION_KEY;
102 event.BotProfile.id = 12345_qq;
103 event.BotProfile.nickname = "Elanor";
104 event.BotProfile.remark = "Elanor";
105
106 this->ConnectionEstablishedCallback(std::move(event));
107 }
108 }
109
110 /**
111 * @brief Called for closing a session
112 *
113 * Disconnect should not return before ConnectionClosed callback is called
114 */
115 void Disconnect(string SessionKey) override
116 {
117 if (SessionKey != SESSION_KEY) return;
118
119 if (!this->ConnectionClosedCallback) return;
120
121 ClientConnectionClosedEvent event;
122 event.code = 1000;
123 event.reason = "Normal Closure";
124 event.remote = false;
125
126 this->ConnectionClosedCallback(std::move(event));
127 }
128
129
130 // *********************************************
131 // *************** Request API *****************
132 // *********************************************
133
134 /// 获取版本号
135 MOCK_METHOD(string, Version, (), (override));
136
137 /// 获取Bot账号
138 MOCK_METHOD(QQ_t, GetBotQQ, (), (override));
139
140 /// 获取登录账号
141 MOCK_METHOD(std::vector<QQ_t>, BotList, (), (override));
142
143 /// 通过messageId获取消息
144 MOCK_METHOD((std::variant<FriendMessageEvent, GroupMessageEvent, TempMessageEvent, StrangerMessageEvent>),
145 MessageFromId, (string SessionKey, MessageId_t id, UID_t target),
146 (override)); //? std::any or std::variant
147
148
149 /// 获取好友列表
150 MOCK_METHOD(std::vector<User>, FriendList, (string SessionKey), (override));
151
152 /// 获取群列表
153 MOCK_METHOD(std::vector<Group>, GroupList, (string SessionKey), (override));
154
155 /// 获取群成员列表
156 MOCK_METHOD(std::vector<GroupMember>, MemberList, (string SessionKey, GID_t target), (override));
157
158 /// 获取最新群成员列表
159 MOCK_METHOD(std::vector<GroupMember>, LatestMemberList, (string SessionKey, GID_t target), (override));
160
161
162 /// 获取Bot资料
163 MOCK_METHOD(UserProfile, GetBotProfile, (string SessionKey), (override));
164
165 /// 获取好友资料
166 MOCK_METHOD(UserProfile, GetFriendProfile, (string SessionKey, QQ_t target), (override));
167
168 /// 获取群成员资料
169 MOCK_METHOD(UserProfile, GetMemberProfile, (string SessionKey, GID_t target, QQ_t MemberId), (override));
170
171 /// 获取QQ用户资料
172 MOCK_METHOD(UserProfile, GetUserProfile, (string SessionKey, QQ_t target), (override));
173
174
175 /// 发送好友消息
176 MOCK_METHOD(MessageId_t, SendFriendMessage,
177 (string SessionKey, QQ_t qq, const MessageChain& message, std::optional<MessageId_t> QuoteId),
178 (override));
179 /// 发送好友消息
180 MOCK_METHOD(MessageId_t, SendFriendMessage,
181 (string SessionKey, QQ_t qq, MessageChain&& message, std::optional<MessageId_t> QuoteId),
182 (override));
183
184 /// 发送群消息
185 MOCK_METHOD(MessageId_t, SendGroupMessage,
186 (string SessionKey, GID_t group, const MessageChain& message,
187 std::optional<MessageId_t> QuoteId),
188 (override));
189 /// 发送群消息
190 MOCK_METHOD(MessageId_t, SendGroupMessage,
191 (string SessionKey, GID_t group, MessageChain&& message,
192 std::optional<MessageId_t> QuoteId),
193 (override));
194
195 /// 发送临时会话消息
196 MOCK_METHOD(MessageId_t, SendTempMessage,
197 (string SessionKey, QQ_t qq, GID_t group, const MessageChain& message,
198 std::optional<MessageId_t> QuoteId),
199 (override));
200 /// 发送临时会话消息
201 MOCK_METHOD(MessageId_t, SendTempMessage,
202 (string SessionKey, QQ_t qq, GID_t group, MessageChain&& message,
203 std::optional<MessageId_t> QuoteId),
204 (override));
205
206 /// 发送头像戳一戳消息
207 MOCK_METHOD(void, SendNudge, (string SessionKey, QQ_t target, UID_t subject, NudgeType kind), (override));
208
209 /// 撤回消息
210 MOCK_METHOD(void, Recall, (string SessionKey, MessageId_t id, UID_t target), (override));
211
212 /// 获取漫游消息
213 MOCK_METHOD(std::vector<MessageChain>, RoamingMessages,
214 (string SessionKey, std::time_t TimeStart, std::time_t TimeEnd, UID_t target), (override));
215
216
217 /// 查看文件列表
218 MOCK_METHOD(std::vector<GroupFileInfo>, FileList,
219 (string SessionKey, string id, string path, UID_t target, int64_t offset,
220 int64_t size, bool withDownloadInfo),
221 (override));
222
223 /// 获取文件信息
224 MOCK_METHOD(GroupFileInfo, GetFileInfo,
225 (string SessionKey, string id, string path, UID_t target, bool withDownloadInfo),
226 (override));
227
228 /// 创建文件夹
229 MOCK_METHOD(GroupFileInfo, FileMkdir,
230 (string SessionKey, string id, string path, UID_t target, string directory),
231 (override));
232
233 /// 删除文件
234 MOCK_METHOD(void, FileDelete, (string SessionKey, string id, string path, UID_t target),
235 (override));
236
237 /// 移动文件
238 MOCK_METHOD(void, FileMove,
239 (string SessionKey, string id, string path, UID_t target,
240 string TargetDirId, string TargetDirPath),
241 (override));
242
243 /// 重命名文件
244 MOCK_METHOD(void, FileRename,
245 (string SessionKey, string id, string path, UID_t target, string name),
246 (override));
247
248
249 /// 上传文件
250 MOCK_METHOD(GroupFileInfo, FileUpload,
251 (string SessionKey, string path, UID_t target, string type, string name,
252 string content),
253 (override));
254
255 /**
256 * @brief 分块上传文件
257 *
258 * @attention Experimental API
259 */
260 MOCK_METHOD(GroupFileInfo, FileUploadChunked,
261 (string SessionKey, string path, UID_t target, string type, string name,
262 std::function<bool(size_t offset, std::ostream& sink, bool& finish)> ContentProvider),
263 (override));
264
265 /// 上传图片
266 MOCK_METHOD(MiraiImage, UploadImage, (string SessionKey, string type, string image), (override));
267
268 /**
269 * @brief 分块上传图片
270 *
271 * @attention Experimental API
272 */
273 MOCK_METHOD(MiraiImage, UploadImageChunked,
274 (string SessionKey, string type,
275 std::function<bool(size_t offset, std::ostream& sink, bool& finish)> ContentProvider),
276 (override));
277 /// 上传音频
278 MOCK_METHOD(MiraiAudio, UploadAudio, (string SessionKey, string type, string Audio), (override));
279
280 /**
281 * @brief 分块上传音频
282 *
283 * @attention Experimental API
284 */
285 MOCK_METHOD(MiraiAudio, UploadAudioChunked,
286 (string SessionKey, string type,
287 std::function<bool(size_t offset, std::ostream& sink, bool& finish)> ContentProvider),
288 (override));
289
290
291 /// 删除好友
292 MOCK_METHOD(void, DeleteFriend, (string SessionKey, QQ_t target), (override));
293
294
295 /// 禁言群成员
296 MOCK_METHOD(void, Mute, (string SessionKey, GID_t target, QQ_t member, std::chrono::seconds time),
297 (override));
298
299 /// 解除群成员禁言
300 MOCK_METHOD(void, Unmute, (string SessionKey, GID_t target, QQ_t member), (override));
301
302 /// 移除群成员
303 MOCK_METHOD(void, Kick, (string SessionKey, GID_t target, QQ_t member, string message, bool block), (override));
304
305 /// 退出群聊
306 MOCK_METHOD(void, Quit, (string SessionKey, GID_t target), (override));
307
308 /// 全体禁言
309 MOCK_METHOD(void, MuteAll, (string SessionKey, GID_t target), (override));
310
311 /// 解除全体禁言
312 MOCK_METHOD(void, UnmuteAll, (string SessionKey, GID_t target), (override));
313
314 /// 设置群精华消息
315 MOCK_METHOD(void, SetEssence, (string SessionKey, MessageId_t id, GID_t target), (override));
316
317 /// 获取群设置
318 MOCK_METHOD(GroupConfig, GetGroupConfig, (string SessionKey, GID_t target), (override));
319
320 /// 修改群设置
321 MOCK_METHOD(void, SetGroupConfig,
322 (string SessionKey, GID_t target, string name, std::optional<bool> AllowConfessTalk,
323 std::optional<bool> AllowMemberInvite, std::optional<bool> AutoApprove,
324 std::optional<bool> AllowAnonymousChat),
325 (override));
326
327 /// 获取群员设置
328 MOCK_METHOD(GroupMember, GetMemberInfo, (string SessionKey, GID_t target, QQ_t member), (override));
329
330 /// 修改群员设置
331 MOCK_METHOD(void, SetMemberInfo,
332 (string SessionKey, GID_t target, QQ_t member, string name, string title),
333 (override));
334
335 /// 修改群员管理员
336 MOCK_METHOD(void, MemberAdmin, (string SessionKey, GID_t target, QQ_t member, bool assign), (override));
337
338
339 /// 获取群公告
340 MOCK_METHOD(std::vector<GroupAnnouncement>, AnnoList,
341 (string SessionKey, GID_t target, int64_t offset, int64_t size), (override));
342
343 /// 发布群公告
344 MOCK_METHOD(GroupAnnouncement, AnnoPublish,
345 (string SessionKey, GID_t target, string content, string url, string path,
346 string base64, bool ToNewMember, bool pinned, bool ShowEditCard, bool ShowPopup,
347 bool RequireConfirm),
348 (override));
349
350 /// 删除群公告
351 MOCK_METHOD(void, AnnoDelete, (string SessionKey, GID_t target, string fid), (override));
352
353
354 /// 添加好友申请
355 MOCK_METHOD(void, RespNewFriendRequestEvent,
356 (string SessionKey, int64_t EventId, QQ_t FromId, GID_t GroupId, int operate,
357 string message),
358 (override));
359
360 /// 用户入群申请
361 MOCK_METHOD(void, RespMemberJoinRequestEvent,
362 (string SessionKey, int64_t EventId, QQ_t FromId, GID_t GroupId, int operate,
363 string message),
364 (override));
365
366 /// Bot被邀请入群申请
367 MOCK_METHOD(void, RespBotInvitedJoinGroupRequestEvent,
368 (string SessionKey, int64_t EventId, QQ_t FromId, GID_t GroupId, int operate,
369 string message),
370 (override));
371
372
373 /// 执行命令
374 MOCK_METHOD(void, CmdExecute, (string SessionKey, const MessageChain& command), (override));
375 /// 执行命令
376 MOCK_METHOD(void, CmdExecute, (string SessionKey, MessageChain&& command), (override));
377
378 /// 注册命令
379 MOCK_METHOD(void, CmdRegister,
380 (string SessionKey, string name, std::vector<string> alias, string usage,
381 string description),
382 (override));
383
384
385 /// Call any api, just in case
386 MOCK_METHOD(string, CallAPI, (const string& path, const string& method, const string& data), (override));
387};
388
389template<typename Callable>
390auto MakeGMockAdaptor(Callable&& func)
391 -> std::enable_if_t< std::is_invocable_v<Callable, GMockAdaptor&>, std::unique_ptr<IAdaptor>>
392{
393 auto adaptor = std::make_unique<GMockAdaptor>();
394 func(*adaptor);
395 return adaptor;
396}
397
398} // namespace Mirai
399
400#endif
401
402#endif
所有mirai相关的对象的命名空间
NudgeType
头像戳一戳消息的发送环境
Definition: BasicTypes.hpp:205
int64_t MessageId_t
消息id类型,用于撤回消息和引用消息
Definition: BasicTypes.hpp:35