Skip to content
This repository was archived by the owner on Aug 16, 2024. It is now read-only.

Commit 938bb22

Browse files
committed
新增通用消息事件 Message (message_event.hpp);
1 parent 44fc00b commit 938bb22

File tree

6 files changed

+176
-18
lines changed

6 files changed

+176
-18
lines changed

examples/RepeatMessage.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,23 @@ system("chcp 65001");
7575
m.Reply(m.MessageChain);
7676
});
7777

78+
// 通用型消息
79+
// 收到 FriendMessage、GroupMessage、TempMessage 时都会调用它
80+
// 判断类型之后,也可调用对应的转换函数进行转换 (类型不正确将转换失败抛出异常)
81+
bot.On<Message>(
82+
[&](Message m)
83+
{
84+
m.Reply("Message事件可处理三种消息:" + m.MessageChain);
85+
86+
// 判断是否群组消息
87+
if(m.GetMessageType() == MessageType::GroupMessage)
88+
{
89+
GroupMessage gm = m.ToGroupMessage();
90+
// TODO: 针对群组消息的特别处理
91+
}
92+
93+
});
94+
7895

7996
// 记录轮询事件时的错误
8097
bot.EventLoop([](const char* errMsg)

include/events/events.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define mirai_cpp_events_events_hpp_H_
44

55
// 消息事件
6+
#include "message_event.hpp"
67
#include "friend_message.hpp"
78
#include "group_message.hpp"
89
#include "temp_message.hpp"

include/events/message_event.hpp

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#pragma once
2+
#ifndef mirai_cpp_events_message_hpp_H_
3+
#define mirai_cpp_events_message_hpp_H_
4+
5+
#include <nlohmann/json.hpp>
6+
#include "defs/qq_types.hpp"
7+
#include "friend_message.hpp"
8+
#include "group_message.hpp"
9+
#include "temp_message.hpp"
10+
#include "event_interface.hpp"
11+
#include "exported.h"
12+
13+
namespace Cyan
14+
{
15+
16+
enum class MessageType
17+
{
18+
FriendMessage, // 好友消息
19+
GroupMessage, // 群组消息
20+
TempMessage // 临时消息
21+
};
22+
23+
// 通用消息事件 (可转换为 FriendMessage GroupMessage TempMessage)
24+
class EXPORTED Message : public EventBase
25+
{
26+
public:
27+
Cyan::MessageChain MessageChain;
28+
29+
static MiraiEvent GetMiraiEvent()
30+
{
31+
return MiraiEvent::Message;
32+
}
33+
34+
MessageType GetMessageType() const
35+
{
36+
return messageType_;
37+
}
38+
39+
FriendMessage ToFriendMessage() const
40+
{
41+
FriendMessage m;
42+
m.Set(this->ToJson());
43+
return m;
44+
}
45+
46+
GroupMessage ToGroupMessage() const
47+
{
48+
GroupMessage m;
49+
m.Set(this->ToJson());
50+
return m;
51+
}
52+
53+
TempMessage ToTempMessage() const
54+
{
55+
TempMessage m;
56+
m.Set(this->ToJson());
57+
return m;
58+
}
59+
60+
MessageId GetMessageId() const
61+
{
62+
return (this->MessageChain).GetMessageId();
63+
}
64+
65+
int64_t GetTimestamp() const
66+
{
67+
return (this->MessageChain).GetTimestamp();
68+
}
69+
70+
virtual void SetMiraiBot(MiraiBot* bot) override
71+
{
72+
this->bot_ = bot;
73+
}
74+
75+
MessageId Reply(const Cyan::MessageChain& mc) const;
76+
MessageId QuoteReply(const Cyan::MessageChain& mc) const;
77+
78+
virtual bool Set(const json& j) override
79+
{
80+
if (j["type"] == "FriendMessage")
81+
{
82+
messageType_ = MessageType::FriendMessage;
83+
friendMessage_.Set(j);
84+
}
85+
if (j["type"] == "GroupMessage")
86+
{
87+
messageType_ = MessageType::GroupMessage;
88+
groupMessage_.Set(j);
89+
}
90+
if (j["type"] == "TempMessage")
91+
{
92+
messageType_ = MessageType::TempMessage;
93+
tempMessage_.Set(j);
94+
}
95+
this->MessageChain.Set(j["messageChain"]);
96+
return true;
97+
}
98+
virtual json ToJson() const override
99+
{
100+
switch (messageType_)
101+
{
102+
case MessageType::FriendMessage: return friendMessage_.ToJson();
103+
case MessageType::GroupMessage: return groupMessage_.ToJson();
104+
case MessageType::TempMessage: return tempMessage_.ToJson();
105+
default: throw std::runtime_error("错误的 MessageType .");
106+
}
107+
}
108+
private:
109+
MiraiBot* bot_;
110+
MessageType messageType_;
111+
FriendMessage friendMessage_;
112+
GroupMessage groupMessage_;
113+
TempMessage tempMessage_;
114+
};
115+
}
116+
117+
#endif // !mirai_cpp_events_message_hpp_H_

include/events/mirai_event.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ namespace Cyan
3434
MemberJoinRequestEvent, // 用户入群申请
3535
BotLeaveEventActive, // Bot 主动离开群
3636
BotLeaveEventKick, // Bot 被剔出群
37+
Message // 通用消息事件
3738
};
3839

3940
inline MiraiEvent MiraiEventStr(const std::string& miraiEvent)

include/mirai_bot.hpp

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -342,25 +342,25 @@ namespace Cyan
342342
template <typename T>
343343
MiraiBot& MiraiBot::OnEventReceived(const EventProcessor<T>& ep)
344344
{
345-
processors_.insert({
346-
T::GetMiraiEvent(),
347-
[=](WeakEvent we)
345+
auto func = [=](WeakEvent we)
346+
{
347+
// 这个lambda函数有两个作用
348+
// 1.创建类型为T的WeakEvent
349+
// 2.将传入的WeakEvent转化为类型T
350+
// 然后给 EventProcessor 使用
351+
if (we == nullptr)
352+
{
353+
std::shared_ptr<T> e = std::make_shared<T>();
354+
return std::dynamic_pointer_cast<EventBase>(e);
355+
}
356+
else
348357
{
349-
// 这个lambda函数有两个作用
350-
// 1.创建类型为T的WeakEvent
351-
// 2.将传入的WeakEvent转化为类型T
352-
// 然后给 EventProcessor 使用
353-
if (we == nullptr)
354-
{
355-
std::shared_ptr<T> e = std::make_shared<T>();
356-
return std::dynamic_pointer_cast<EventBase>(e);
357-
}
358-
else
359-
{
360-
ep(*(std::dynamic_pointer_cast<T>(we)));
361-
return we;
362-
}
363-
} });
358+
ep(*(std::dynamic_pointer_cast<T>(we)));
359+
return we;
360+
}
361+
};
362+
363+
processors_.insert({T::GetMiraiEvent(), func });
364364
return *this;
365365
}
366366

src/event_func.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,26 @@ namespace Cyan
9494
return true;
9595
}
9696

97+
MessageId Message::Reply(const Cyan::MessageChain& mc) const
98+
{
99+
switch (messageType_)
100+
{
101+
case MessageType::FriendMessage: return friendMessage_.Reply(mc);
102+
case MessageType::GroupMessage: return groupMessage_.Reply(mc);
103+
case MessageType::TempMessage: return tempMessage_.Reply(mc);
104+
default: throw std::runtime_error("错误的 MessageType .");
105+
}
106+
}
107+
108+
MessageId Message::QuoteReply(const Cyan::MessageChain& mc) const
109+
{
110+
switch (messageType_)
111+
{
112+
case MessageType::FriendMessage: return friendMessage_.QuoteReply(mc);
113+
case MessageType::GroupMessage: return groupMessage_.QuoteReply(mc);
114+
case MessageType::TempMessage: return tempMessage_.QuoteReply(mc);
115+
default: throw std::runtime_error("错误的 MessageType .");
116+
}
117+
}
118+
97119
}

0 commit comments

Comments
 (0)