diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 95923f1..20d4ef9 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -28,4 +28,5 @@ api_exe(MessageType) api_exe(FetchEventsViaHTTP) api_exe(GroupMemberInfo) api_exe(GroupNameChange) -api_exe(GroupConfig) \ No newline at end of file +api_exe(GroupConfig) +api_exe(MemberCardChange) \ No newline at end of file diff --git a/examples/MemberCardChange.cpp b/examples/MemberCardChange.cpp new file mode 100644 index 0000000..2e48e88 --- /dev/null +++ b/examples/MemberCardChange.cpp @@ -0,0 +1,39 @@ +#include +#include +// 使用静态库必须要在引入 mirai.h 前定义这个宏 +#define MIRAICPP_STATICLIB +#include + +int main() +{ + using namespace std; + using namespace Cyan; + system("chcp 65001"); + MiraiBot bot("127.0.0.1", 539); + while (true) + { + try + { + bot.Auth("INITKEY7A3O1a9v", 1589588851_qq); + break; + } + catch (const std::exception& ex) + { + cout << ex.what() << endl; + } + MiraiBot::SleepSeconds(1); + } + cout << "成功登录 bot。" << endl; + + + // 由于服务器并不会告知名片变动, 此事件只能由 mirai 在发现变动时才广播. 不要依赖于这个事件. + bot.On( + [&](MemberCardChangeEvent e) + { + cout << e.Member.MemberName << "(" << e.Member.QQ.ToInt64() << ") 的群名片被修改了" << endl; + cout << e.OriginName << ", " << e.CurrentName << endl; + }); + + bot.EventLoop(); + return 0; +} \ No newline at end of file diff --git a/include/events/events.hpp b/include/events/events.hpp index 6570018..a33fac2 100644 --- a/include/events/events.hpp +++ b/include/events/events.hpp @@ -19,6 +19,7 @@ // 群组相关事件 #include "group_recall_event.hpp" #include "group_mute_all_event.hpp" +#include "member_card_change_event.hpp" #include "member_join_request_event.hpp" #include "member_join_event.hpp" #include "member_leave_kick.hpp" diff --git a/include/events/member_card_change_event.hpp b/include/events/member_card_change_event.hpp new file mode 100644 index 0000000..c778f03 --- /dev/null +++ b/include/events/member_card_change_event.hpp @@ -0,0 +1,65 @@ +#pragma once +#ifndef mirai_cpp_events_member_card_change_hpp_H_ +#define mirai_cpp_events_member_card_change_hpp_H_ + +#include +#include "event_interface.hpp" +#include "defs/group.hpp" +#include "defs/group_member.hpp" + +namespace Cyan +{ + /** + * \brief 群名片修改事件(由于服务器并不会告知名片变动, 此事件只能由 mirai 在发现变动时才广播. 不要依赖于这个事件.) + */ + class MemberCardChangeEvent : public EventBase + { + public: + string OriginName; + string CurrentName; + GroupMember_t Member; + GroupMember_t Operator; + + static MiraiEvent GetMiraiEvent() + { + return MiraiEvent::MemberCardChangeEvent; + } + + bool OperatorIsBot() const + { + return operator_is_null_; + } + + virtual bool Set(const json& j) override + { + this->OriginName = j["origin"].get(); + this->CurrentName = j["current"].get(); + this->Member.Set(j["member"]); + if (!j["operator"].is_null()) + { + this->Operator.Set(j["operator"]); + this->operator_is_null_ = false; + } + return true; + } + virtual json ToJson() const override + { + json j = json::object(); + j["type"] = "MemberCardChangeEvent"; + j["origin"] = this->OriginName; + j["current"] = this->CurrentName; + j["member"] = this->Member.ToJson(); + if (!operator_is_null_) + j["operator"] = this->Operator.ToJson(); + else + j["operator"] = nullptr; + return j; + } + + private: + bool operator_is_null_ = true; + }; + +} + +#endif // !mirai_cpp_events_member_card_change_hpp_H_ \ No newline at end of file diff --git a/include/events/mirai_event.hpp b/include/events/mirai_event.hpp index 49e4c88..55b75a4 100644 --- a/include/events/mirai_event.hpp +++ b/include/events/mirai_event.hpp @@ -35,7 +35,8 @@ namespace Cyan BotLeaveEventActive, // Bot 主动离开群 BotLeaveEventKick, // Bot 被剔出群 Message, // 通用消息事件 - BotInvitedJoinGroupRequestEvent // Bot被邀请入群申请 + BotInvitedJoinGroupRequestEvent, // Bot被邀请入群申请 + MemberCardChangeEvent // 群成员群名片被修改事件 }; inline MiraiEvent MiraiEventStr(const std::string& miraiEvent) @@ -65,6 +66,7 @@ namespace Cyan if (miraiEvent == "GroupNameChangeEvent") return MiraiEvent::GroupNameChangeEvent; if (miraiEvent == "GroupMuteAllEvent") return MiraiEvent::GroupMuteAllEvent; if (miraiEvent == "BotInvitedJoinGroupRequestEvent") return MiraiEvent::BotInvitedJoinGroupRequestEvent; + if (miraiEvent == "MemberCardChangeEvent") return MiraiEvent::MemberCardChangeEvent; return MiraiEvent::Default; } @@ -133,6 +135,9 @@ namespace Cyan case Cyan::MiraiEvent::BotInvitedJoinGroupRequestEvent: result = "BotInvitedJoinGroupRequestEvent"; break; + case Cyan::MiraiEvent::MemberCardChangeEvent: + result = "MemberCardChangeEvent"; + break; default: result = "Default"; break;