Skip to content

Commit

Permalink
feat: parse group increase & decrease event & caching_logic
Browse files Browse the repository at this point in the history
  • Loading branch information
pk5ls20 committed Feb 11, 2025
1 parent e0e4a2c commit 36f4f68
Show file tree
Hide file tree
Showing 12 changed files with 284 additions and 43 deletions.
46 changes: 23 additions & 23 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -20,29 +20,29 @@

## Features List

| Protocol | Support | Login | Support | Messages | Support | Operations | Support | Events | Support |
|----------|:-------:|--------------------------------|:-------:|:--------------|:-------:|:------------------|:-------:|:--------------------|:-------:|
| Windows | 🔴 | QrCode | 🟢 | BounceFace | 🔴 | Poke | 🔴 | ~~Captcha~~ | 🔴 |
| macOS | 🔴 | ~~Password~~ | 🔴 | Face | 🟡 [^1] | Recall | 🔴 | BotOnline | 🟢 |
| Linux | 🟢 | EasyLogin | 🟡 | File | 🟡[^1] | Leave Group | 🔴 | BotOffline | 🟢 |
| | | ~~UnusualDevice<br/>Password~~ | 🔴 | Forward | 🟢 | Set Special Title | 🔴 | Message | 🟢 |
| | | ~~UnusualDevice<br/>Easy~~ | 🔴 | ~~GreyTip~~ | 🔴 | Kick Member | 🔴 | Poke | 🟢 |
| | | ~~NewDeviceVerify~~ | 🔴 | GroupReaction | 🟡[^1] | Mute Member | 🔴 | MessageRecall | 🟢 |
| | | | | Image | 🟢 | Set Admin | 🔴 | GroupMemberDecrease | 🔴 |
| | | | | Json | 🟢 | Friend Request | 🔴 | GroupMemberIncrease | 🔴 |
| | | | | KeyBoard | 🔴 | Group Request | 🔴 | GroupPromoteAdmin | 🔴 |
| | | | | LightApp | 🟢 | ~~Voice Call~~ | 🔴 | GroupInvite | 🔴 |
| | | | | LongMsg | 🟡[^1] | Client Key | 🔴 | GroupRequestJoin | 🟢 |
| | | | | Markdown | 🔴 | Cookies | 🔴 | FriendRequest | 🔴 |
| | | | | MarketFace | 🟡[^1] | Send Message | 🔴 | ~~FriendTyping~~ | 🔴 |
| | | | | Mention | 🟢 | | | ~~FriendVoiceCall~~ | 🔴 |
| | | | | MultiMsg | 🟡[^1] | | | | |
| | | | | Poke | 🔴 | | | | |
| | | | | Record | 🟢 | | | | |
| | | | | SpecialPoke | 🔴 | | | | |
| | | | | Text | 🟢 | | | | |
| | | | | Video | 🟢 | | | | |
| | | | | Xml | 🟢 | | | | |
| Protocol | Support | Login | Support | Messages | Support | Operations | Support | Events | Support |
|----------|:-------:|--------------------------------|:-------:|:--------------|:-------:|:------------------|:-------:|:----------------------|:-------:|
| Windows | 🔴 | QrCode | 🟢 | BounceFace | 🔴 | Poke | 🔴 | ~~Captcha~~ | 🔴 |
| macOS | 🔴 | ~~Password~~ | 🔴 | Face | 🟡 [^1] | Recall | 🔴 | BotOnline | 🟢 |
| Linux | 🟢 | EasyLogin | 🟡 | File | 🟡[^1] | Leave Group | 🔴 | BotOffline | 🟢 |
| | | ~~UnusualDevice<br/>Password~~ | 🔴 | Forward | 🟢 | Set Special Title | 🔴 | Message | 🟢 |
| | | ~~UnusualDevice<br/>Easy~~ | 🔴 | ~~GreyTip~~ | 🔴 | Kick Member | 🔴 | Poke | 🟢 |
| | | ~~NewDeviceVerify~~ | 🔴 | GroupReaction | 🟡[^1] | Mute Member | 🔴 | MessageRecall | 🟢 |
| | | | | Image | 🟢 | Set Admin | 🔴 | GroupMemberDecrease | 🟢 |
| | | | | Json | 🟢 | Friend Request | 🔴 | GroupMemberIncrease | 🟢 |
| | | | | KeyBoard | 🔴 | Group Request | 🔴 | ~~GroupPromoteAdmin~~ | 🔴 |
| | | | | LightApp | 🟢 | ~~Voice Call~~ | 🔴 | GroupInvite | 🔴 |
| | | | | LongMsg | 🟡[^1] | Client Key | 🔴 | GroupRequestJoin | 🟢 |
| | | | | Markdown | 🔴 | Cookies | 🔴 | FriendRequest | 🔴 |
| | | | | MarketFace | 🟡[^1] | Send Message | 🔴 | ~~FriendTyping~~ | 🔴 |
| | | | | Mention | 🟢 | | | ~~FriendVoiceCall~~ | 🔴 |
| | | | | MultiMsg | 🟡[^1] | | | | |
| | | | | Poke | 🔴 | | | | |
| | | | | Record | 🟢 | | | | |
| | | | | SpecialPoke | 🔴 | | | | |
| | | | | Text | 🟢 | | | | |
| | | | | Video | 🟢 | | | | |
| | | | | Xml | 🟢 | | | | |

[^1]: Only implemented event parsing

Expand Down
57 changes: 57 additions & 0 deletions mania/src/core/business/caching_logic.rs
Original file line number Diff line number Diff line change
@@ -1 +1,58 @@
use crate::core::business::LogicRegistry;
use crate::core::business::{BusinessHandle, LogicFlow};
use crate::core::event::notify::group_sys_decrease::GroupSysDecreaseEvent;
use crate::core::event::notify::group_sys_increase::GroupSysIncreaseEvent;
use crate::core::event::prelude::*;
use mania_macros::handle_event;
use std::sync::Arc;

#[handle_event(GroupSysIncreaseEvent, GroupSysDecreaseEvent)]
async fn caching_logic(
event: &mut dyn ServerEvent,
handle: Arc<BusinessHandle>,
flow: LogicFlow,
) -> &dyn ServerEvent {
match flow {
LogicFlow::InComing => caching_logic_incoming(event, handle).await,
LogicFlow::OutGoing => event,
}
}

async fn caching_logic_incoming(
event: &mut dyn ServerEvent,
handle: Arc<BusinessHandle>,
) -> &dyn ServerEvent {
match event {
_ if let Some(increase) = event.as_any_mut().downcast_mut::<GroupSysIncreaseEvent>() => {
tracing::info!(
"caching_logic_incoming GroupSysIncreaseEvent: {:?}",
increase
);
if let Err(e) = handle.refresh_group_members_cache(increase.group_uin).await {
tracing::error!("refresh_group_members_cache failed: {:?}", e);
}
}
_ if let Some(decrease) = event.as_any_mut().downcast_mut::<GroupSysDecreaseEvent>() => {
tracing::info!(
"caching_logic_incoming GroupSysDecreaseEvent: {:?}",
decrease
);
let self_uid = handle
.context
.key_store
.uid
.load()
.as_ref()
.expect("Missing self_uid")
.as_ref()
.clone();
if decrease.member_uid != self_uid
&& let Err(e) = handle.refresh_group_members_cache(decrease.group_uin).await
{
tracing::error!("refresh_group_members_cache failed: {:?}", e);
}
}
_ => {}
}
event
}
67 changes: 66 additions & 1 deletion mania/src/core/business/messaging_logic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ use crate::core::business::{BusinessHandle, LogicFlow};
use crate::core::event::message::push_msg::PushMessageEvent;
use crate::core::event::notify::friend_sys_poke::FriendSysPokeEvent;
use crate::core::event::notify::friend_sys_recall::FriendSysRecallEvent;
use crate::core::event::notify::group_sys_decrease::GroupSysDecreaseEvent;
use crate::core::event::notify::group_sys_increase::GroupSysIncreaseEvent;
use crate::core::event::notify::group_sys_poke::GroupSysPokeEvent;
use crate::core::event::notify::group_sys_reaction::GroupSysReactionEvent;
use crate::core::event::notify::group_sys_recall::GroupSysRecallEvent;
Expand All @@ -13,7 +15,9 @@ use crate::event::friend::{FriendEvent, friend_message, friend_recall};
use crate::event::group::group_poke::GroupPokeEvent;
use crate::event::group::group_reaction::GroupReactionEvent;
use crate::event::group::group_recall::GroupRecallEvent;
use crate::event::group::{GroupEvent, group_join_request, group_message};
use crate::event::group::{
GroupEvent, group_join_request, group_member_decrease, group_member_increase, group_message,
};
use crate::event::system::{SystemEvent, temp_message};
use crate::message::chain::{MessageChain, MessageType};
use crate::message::entity::Entity;
Expand All @@ -27,6 +31,8 @@ use std::sync::Arc;
GroupSysPokeEvent,
GroupSysReactionEvent,
GroupSysRecallEvent,
GroupSysIncreaseEvent,
GroupSysDecreaseEvent,
FriendSysRecallEvent,
FriendSysPokeEvent
)]
Expand All @@ -42,6 +48,7 @@ async fn messaging_logic(
}
}

// FIXME: avoid take things from event
async fn messaging_logic_incoming(
event: &mut dyn ServerEvent,
handle: Arc<BusinessHandle>,
Expand Down Expand Up @@ -158,6 +165,64 @@ async fn messaging_logic_incoming(
}
return event;
}
if let Some(join) = event.as_any_mut().downcast_mut::<GroupSysIncreaseEvent>() {
let member_uin = handle
.resolve_stranger_uid2uin(&join.member_uid)
.await
.unwrap_or_default();
let invitor_uin = handle
.uid2uin(
join.invitor_uid.as_deref().unwrap_or(""),
Some(join.group_uin),
)
.await
.ok();
if let Err(e) =
handle
.event_dispatcher
.group
.send(Some(GroupEvent::GroupMemberIncrease(
group_member_increase::GroupMemberIncreaseEvent {
group_uin: join.group_uin,
member_uin,
invitor_uin,
event_type: std::mem::take(&mut join.event_type), // FIXME: maybe bug?
},
)))
{
tracing::error!("Failed to send group increase event: {:?}", e);
}
return event;
}
if let Some(leave) = event.as_any_mut().downcast_mut::<GroupSysDecreaseEvent>() {
let member_uin = handle
.resolve_stranger_uid2uin(&leave.member_uid)
.await
.unwrap_or_default();
let operator_uin = handle
.uid2uin(
leave.operator_uid.as_deref().unwrap_or(""),
Some(leave.group_uin),
)
.await
.ok();
if let Err(e) =
handle
.event_dispatcher
.group
.send(Some(GroupEvent::GroupMemberDecrease(
group_member_decrease::GroupMemberDecreaseEvent {
group_uin: leave.group_uin,
member_uin,
operator_uin,
event_type: std::mem::take(&mut leave.event_type), // FIXME: maybe bug?
},
)))
{
tracing::error!("Failed to send group decrease event: {:?}", e);
}
return event;
}
if let Some(poke) = event.as_any_mut().downcast_mut::<FriendSysPokeEvent>() {
if let Err(e) = handle
.event_dispatcher
Expand Down
1 change: 1 addition & 0 deletions mania/src/core/entity.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
pub mod fetch_group_requests;
pub mod group_sys_enum;
21 changes: 21 additions & 0 deletions mania/src/core/entity/group_sys_enum.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
use crate::core::event::prelude::TryFromPrimitive;

#[derive(Debug, Default, Eq, PartialEq, TryFromPrimitive)]
#[repr(u32)]
pub enum GroupMemberIncreaseEventType {
#[default]
Unknown = 0,
Approve = 130,
Invite = 131,
}

#[derive(Debug, Default, Eq, PartialEq, TryFromPrimitive)]
#[repr(u32)]
pub enum GroupMemberDecreaseEventType {
#[default]
Unknown = 0,
KickMe = 3,
Disband = 129,
Leave = 130,
Kick = 131,
}
78 changes: 77 additions & 1 deletion mania/src/core/event/message/push_msg.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
use crate::core::entity::group_sys_enum::{
GroupMemberDecreaseEventType, GroupMemberIncreaseEventType,
};
use crate::core::event::notify::friend_sys_poke::FriendSysPokeEvent;
use crate::core::event::notify::friend_sys_recall::FriendSysRecallEvent;
use crate::core::event::notify::group_sys_decrease::GroupSysDecreaseEvent;
use crate::core::event::notify::group_sys_increase::GroupSysIncreaseEvent;
use crate::core::event::notify::group_sys_poke::GroupSysPokeEvent;
use crate::core::event::notify::group_sys_reaction::GroupSysReactionEvent;
use crate::core::event::notify::group_sys_recall::GroupSysRecallEvent;
use crate::core::event::notify::group_sys_request_join::GroupSysRequestJoinEvent;
use crate::core::event::prelude::*;
use crate::core::protos::message::{
FriendRecall, GeneralGrayTipInfo, GroupJoin, NotifyMessageBody, PushMsg,
FriendRecall, GeneralGrayTipInfo, GroupChange, GroupJoin, NotifyMessageBody, OperatorInfo,
PushMsg,
};
use crate::message::chain::MessageChain;
use crate::message::packer::MessagePacker;
Expand Down Expand Up @@ -133,6 +139,76 @@ impl ClientEvent for PushMessageEvent {
}));
}
}
PkgType::GroupMemberIncreaseNotice => {
if let Some(msg_content) = packet
.message
.and_then(|content| content.body)
.and_then(|body| body.msg_content)
{
let increase = GroupChange::decode(Bytes::from(msg_content))?;
let invitor_uid = increase
.operator
.and_then(|operator| String::from_utf8(operator).ok());
extra
.as_mut()
.unwrap()
.push(Box::new(GroupSysIncreaseEvent {
group_uin: increase.group_uin,
member_uid: increase.member_uid,
invitor_uid,
event_type: GroupMemberIncreaseEventType::try_from(
increase.decrease_type,
)
.unwrap_or_default(),
}));
}
}
PkgType::GroupMemberDecreaseNotice => {
if let Some(msg_content) = packet
.message
.and_then(|content| content.body)
.and_then(|body| body.msg_content)
{
let decrease = GroupChange::decode(Bytes::from(msg_content))?;
match decrease.decrease_type {
3 => {
// bot itself is kicked
let op = OperatorInfo::decode(Bytes::from(
decrease.operator.unwrap_or_default(),
))?;
extra
.as_mut()
.unwrap()
.push(Box::new(GroupSysDecreaseEvent {
group_uin: decrease.group_uin,
member_uid: decrease.member_uid,
operator_uid: op.operator_field1.map(|o| o.operator_uid),
event_type: GroupMemberDecreaseEventType::try_from(
decrease.decrease_type,
)
.unwrap_or_default(),
}));
}
_ => {
let op_uid = decrease
.operator
.and_then(|operator| String::from_utf8(operator).ok());
extra
.as_mut()
.unwrap()
.push(Box::new(GroupSysDecreaseEvent {
group_uin: decrease.group_uin,
member_uid: decrease.member_uid,
operator_uid: op_uid,
event_type: GroupMemberDecreaseEventType::try_from(
decrease.decrease_type,
)
.unwrap_or_default(),
}));
}
}
}
}
PkgType::Event0x2DC => {
extra = process_event_0x2dc(&packet, &mut extra)?.take();
}
Expand Down
10 changes: 10 additions & 0 deletions mania/src/core/event/notify/group_sys_decrease.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use crate::core::entity::group_sys_enum::GroupMemberDecreaseEventType;
use crate::core::event::prelude::*;

#[derive(Debug, DummyEvent, Default)]
pub struct GroupSysDecreaseEvent {
pub group_uin: u32,
pub member_uid: String,
pub operator_uid: Option<String>,
pub event_type: GroupMemberDecreaseEventType,
}
10 changes: 10 additions & 0 deletions mania/src/core/event/notify/group_sys_increase.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
use crate::core::entity::group_sys_enum::GroupMemberIncreaseEventType;
use crate::core::event::prelude::*;

#[derive(Debug, DummyEvent, Default)]
pub struct GroupSysIncreaseEvent {
pub group_uin: u32,
pub member_uid: String,
pub invitor_uid: Option<String>,
pub event_type: GroupMemberIncreaseEventType,
}
2 changes: 2 additions & 0 deletions mania/src/core/event/notify/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
pub mod friend_sys_poke;
pub mod friend_sys_recall;
pub mod group_sys_decrease;
pub mod group_sys_increase;
pub mod group_sys_poke;
pub mod group_sys_reaction;
pub mod group_sys_recall;
Expand Down
Loading

0 comments on commit 36f4f68

Please sign in to comment.