AQchat
在当前项目里,Handler
类主要用于处理不同类型的命令或者消息,下面按照不同功能模块为你详细介绍各 Handler
的作用。
命令处理 Handler
(位于 com.howcode.aqchat.handler.impl
包)
SyncRoomMembersCmdHandler
:处理同步房间成员命令。验证用户登录状态和是否加入指定房间,若验证通过则获取房间所有成员信息并返回给客户端。
// 验证用户登录和房间信息,同步房间成员信息
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.SyncRoomMembersCmd cmd) {
// ...已有代码...
}
JoinRoomCmdHandler
:处理加入房间命令。验证用户登录状态、是否已在房间中以及房间号是否存在,若都满足条件则将用户加入房间并返回加入成功消息。
// 验证用户登录和房间信息,将用户加入房间
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.JoinRoomCmd cmd) {
// ...已有代码...
}
SendMsgCmdHandler
:处理发送消息命令。验证消息ID
、用户登录状态、是否在房间以及房间是否存在等信息,若验证通过则发送消息并处理 AI 消息,最后返回消息发送成功消息。
// 验证消息和用户信息,发送消息并处理 AI 消息
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.SendMsgCmd cmd) {
// ...已有代码...
}
LeaveRoomCmdHandler
:处理离开房间命令。验证用户登录状态、是否在房间以及房间是否存在,若验证通过则将用户从房间移除,判断房间是否为空并决定是否解散房间,最后返回离开房间成功消息。
// 验证用户登录和房间信息,将用户从房间移除
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.LeaveRoomCmd cmd) {
// ...已有代码...
}
CreateRoomCmdHandler
:处理创建房间命令。验证用户登录状态、是否已在房间以及房间号是否已存在,若都满足条件则创建房间,将创建者加入房间,处理 AI 助手相关操作,最后返回创建房间成功消息。
// 验证用户登录和房间信息,创建房间并将用户加入房间
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.CreateRoomCmd cmd) {
// ...已有代码...
}
OpenAiRoomCmdHandler
:处理创建 AI 房间命令。验证用户登录状态、是否已在房间,若都满足条件则创建 AI 房间,将创建者和 AI 成员加入房间,最后返回创建 AI 房间成功消息。
// 验证用户登录和房间信息,创建 AI 房间并将用户和 AI 成员加入房间
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.OpenAiRoomCmd cmd) {
// ...已有代码...
}
RecoverUserCmdHandler
:处理恢复用户命令。验证用户信息是否存在,若存在则重新登录用户,添加用户channel
,判断用户是否有房间,若有则将用户加入房间,最后返回用户信息。
// 验证用户信息,恢复用户登录状态并处理房间信息
@Override
public void handle(ChannelHandlerContext ctx, AQChatMsgProtocol.RecoverUserCmd cmd) {
// ...已有代码...
}
AI 消息处理 Handler
(位于 com.howcode.aqchat.handler.at.chain
包)
这些 Handler
采用责任链模式处理 AI 消息,若当前 Handler
无法处理消息,则将消息传递给下一个 Handler
。
XQHandler
:判断消息是否 @ 了 AI 助手,若是则复制消息,修改消息ID
和内容,去掉 @AI 部分,然后通过消息队列发送给 AI 助手。
// 判断消息是否 @ 了 AI 助手,处理 AI 消息
@Override
public void handleMessage(MessageDto messageDto) {
// ...已有代码...
}
MultipleRoundsHandler
:判断房间类型是否为 AI 空间且消息扩展信息为空,若是则复制消息,修改消息ID
,然后通过消息队列发送进行多轮对话处理。
// 判断房间类型和消息信息,处理多轮对话消息
@Override
public void handleMessage(MessageDto messageDto) {
// ...已有代码...
}
XMHandler
:判断消息是否 @ 了 XM,若是则复制消息,修改消息ID
和内容,去掉 @XM 部分,然后通过消息队列发送给 XM。
// 判断消息是否 @ 了 XM,处理 XM 相关消息
@Override
public void handleMessage(MessageDto messageDto) {
// ...已有代码...
}
XTHandler
:判断消息是否 @ 了 XT,若是则复制消息,修改消息ID
和内容,去掉 @XT 部分,然后通过消息队列发送给 XT。
// 判断消息是否 @ 了 XT,处理 XT 相关消息
@Override
public void handleMessage(MessageDto messageDto) {
// ...已有代码...
}
XVHandler
:判断消息是否 @ 了 XV,若是则复制消息,修改消息ID
和内容,去掉 @XV 部分,然后通过消息队列发送给 XV。
// 判断消息是否 @ 了 XV,处理 XV 相关消息
@Override
public void handleMessage(MessageDto messageDto) {
// ...已有代码...
}
工厂类 Handler
(位于 com.howcode.aqchat.handler.at
包)
HandlerFactory
:实现ApplicationContextAware
和InitializingBean
接口,在初始化时获取所有Handler
实例并构建责任链。提供handleMessage
方法,处理消息内容,然后将消息传递给责任链的第一个Handler
进行处理。
// 初始化 Handler 责任链,处理消息并传递给责任链
public void handleMessage(MessageDto messageDto) {
// ...已有代码...
}