📄 clustercommandreplypacket.java
字号:
* 3. 回复码,1字节,0x00为成功
* 4. 群内部ID,4字节
* 5. 群名片Version id, 4字节
* 6. 下一个请求包的起始位置,4字节。这个字段如果为0,表示所有名片都已经得到
* 如果不为0,表示起始记录数,比如一共有10条名片信息,这次得到了6条,还剩
* 4条,那么这个字段就是0x00000006,因为下一条的序号是6(从0开始)
* 7. 成员QQ号,4字节
* 8. 真实姓名长度,1字节
* 9. 真实姓名
* 10. 如果有更多成员,重复7-9部分
* 11. 尾部
*
* 得到单个成员全部群名片信息的回复包
* 1. 头部
* 2. 命令, 1字节,0x0F
* 3. 回复码,1字节,0x00为成功
* 4. 群内部ID,4字节
* 5. 成员QQ号,4字节
* 6. 真实姓名长度,1字节
* 7. 真实姓名
* 8. 性别索引,1字节,性别的顺序是'男', '女', '-',所以男是0x00,等等
* 9. 电话字符串长度,1字节
* 10. 电话的字符串表示
* 11. 电子邮件长度,1字节
* 12. 电子邮件
* 13. 备注长度,1字节
* 14. 备注内容
* 15. 尾部
*
* 设置角色的回复包
* 1. 头部
* 2. 命令,1字节,0x1B
* 3. 回复码,1字节
* 4. 群内部ID,4字节
* 5. 群version id, 4字节
* 6. 被设置的QQ号,4字节
* 7. 操作之后成员的角色,1字节
* 8. 尾部
*
* 转让角色的回复包
* 1. 头部
* 2. 命令,1字节,0x1B
* 3. 回复码,1字节
* 4. 群内部ID,4字节
* 5. 转让到的QQ号,4字节
* 6. 根据回复码不同,有:
* i. 3部分为0x00时,为群version id,4字节
* ii. 3部分为其他值时,为错误信息
* 7. 尾部
* </pre>
*
* @author luma
*/
@DocumentalPacket
@PacketName("群命令回复包")
@RelatedPacket({ClusterActivatePacket.class,
ClusterActivateTempPacket.class,
ClusterAuthPacket.class,
ClusterCommitMemberOrganizationPacket.class,
ClusterCommitOrganizationPacket.class,
ClusterCreatePacket.class,
ClusterCreateTempPacket.class,
ClusterDismissPacket.class,
ClusterExitPacket.class,
ClusterExitTempPacket.class,
ClusterGetCardBatchPacket.class,
ClusterGetCardPacket.class,
ClusterGetInfoPacket.class,
ClusterGetMemberInfoPacket.class,
ClusterGetOnlineMemberPacket.class,
ClusterGetTempInfoPacket.class,
ClusterJoinPacket.class,
ClusterModifyCardPacket.class,
ClusterModifyInfoPacket.class,
ClusterModifyMemberPacket.class,
ClusterModifyTempInfoPacket.class,
ClusterModifyTempMemberPacket.class,
ClusterSearchPacket.class,
ClusterSendIMExPacket.class,
ClusterSendTempIMPacket.class,
ClusterSetRolePacket.class,
ClusterSubClusterOpPacket.class,
ClusterTransferRolePacket.class,
ClusterUpdateOrganizationPacket.class})
@LinkedEvent({QQ_ACTIVATE_CLUSTER_SUCCESS,
QQ_ACTIVATE_CLUSTER_FAIL,
QQ_ACTIVATE_TEMP_CLUSTER_SUCCESS,
QQ_ACTIVATE_TEMP_CLUSTER_FAIL,
QQ_CREATE_CLUSTER_SUCCESS,
QQ_CREATE_CLUSTER_FAIL,
QQ_CREATE_TEMP_CLUSTER_SUCCESS,
QQ_CREATE_TEMP_CLUSTER_FAIL,
QQ_DISMISS_CLUSTER_SUCCESS,
QQ_DISMISS_CLUSTER_FAIL,
QQ_EXIT_CLUSTER_SUCCESS,
QQ_EXIT_CLUSTER_FAIL,
QQ_EXIT_TEMP_CLUSTER_SUCCESS,
QQ_EXIT_TEMP_CLUSTER_FAIL,
QQ_GET_CLUSTER_INFO_SUCCESS,
QQ_GET_CLUSTER_INFO_FAIL,
QQ_GET_MEMBER_INFO_SUCCESS,
QQ_GET_ONLINE_MEMBER_FAIL,
QQ_GET_ONLINE_MEMBER_SUCCESS,
QQ_GET_ONLINE_MEMBER_FAIL,
QQ_GET_TEMP_CLUSTER_INFO_SUCCESS,
QQ_GET_TEMP_CLUSTER_INFO_FAIL,
QQ_JOIN_CLUSTER_AUTH_SEND_SUCCESS,
QQ_JOIN_CLUSTER_AUTH_SEND_FAIL,
QQ_JOIN_CLUSTER_SUCCESS,
QQ_JOIN_CLUSTER_NEED_AUTH,
QQ_JOIN_CLUSTER_DENIED,
QQ_JOIN_CLUSTER_FAIL,
QQ_MODIFY_CLUSTER_INFO_SUCCESS,
QQ_MODIFY_CLUSTER_INFO_FAIL,
QQ_MODIFY_CLUSTER_MEMBER_SUCCESS,
QQ_MODIFY_CLUSTER_MEMBER_FAIL,
QQ_MODIFY_TEMP_CLUSTER_MEMBER_SUCCESS,
QQ_MODIFY_TEMP_CLUSTER_MEMBER_FAIL,
QQ_SEARCH_CLUSTER_SUCCESS,
QQ_SEARCH_CLUSTER_FAIL,
QQ_SEND_CLUSTER_IM_EX_SUCCESS,
QQ_SEND_CLUSTER_IM_EX_FAIL,
QQ_SEND_TEMP_CLUSTER_IM_SUCCESS,
QQ_SEND_TEMP_CLUSTER_IM_FAIL,
QQ_SUB_CLUSTER_OP_SUCCESS,
QQ_SUB_CLUSTER_OP_FAIL,
QQ_COMMIT_MEMBER_ORGANIZATION_SUCCESS,
QQ_COMMIT_MEMBER_ORGANIZATION_FAIL,
QQ_COMMIT_ORGANIZATION_SUCCESS,
QQ_COMMIT_ORGANIZATION_FAIL,
QQ_GET_CARD_BATCH_SUCCESS,
QQ_GET_CARD_BATCH_FAIL,
QQ_GET_CARD_SUCCESS,
QQ_GET_CARD_FAIL,
QQ_MODIFY_CARD_SUCCESS,
QQ_MODIFY_CARD_FAIL,
QQ_MODIFY_TEMP_CLUSTER_INFO_SUCCESS,
QQ_MODIFY_TEMP_CLUSTER_INFO_FAIL,
QQ_SET_ROLE_SUCCESS,
QQ_SET_ROLE_FAIL,
QQ_TRANSFER_ROLE_SUCCESS,
QQ_TRANSFER_ROLE_FAIL,
QQ_UPDATE_ORGANIZATION_SUCCESS,
QQ_UPDATE_ORGANIZATION_FAIL})
public class ClusterCommandReplyPacket extends BasicInPacket {
// 公共字段
/** 子命令 */
public byte subCommand;
/** 回复码 */
public byte replyCode;
/** 群内部id */
public int clusterId;
/** 群外部id */
public int externalId;
/** 群类型 */
public byte type;
/** 父群内部ID */
public int parentClusterId;
/** 群版本号 */
public int versionId;
/** 如果某个包是对单个群成员进行操作,则使用这个字段保存QQ号 */
public int memberQQ;
/** 如果replyCode不是ok,那么这个字段有效,表示出错信息 */
public String errorMessage;
// 仅用于得到群信息的回复包,list的元素类型为ClusterInfo
/** 群信息 */
public ClusterInfo info;
// 仅用于得到群信息和得到临时群成员列表的回复包
/** 群成员列表,元素类型为Integer,包含了成员的QQ号 */
public List<Member> members;
// 仅用于得到群成员信息的回复包,list的元素类型是QQFriend
/** 包含了群成员信息的列表,元素类型是QQFriend */
public List<QQFriend> memberInfos;
// 仅用于得到在线成员的回复包,list的元素类型是Integer
/** 包含了在线成员列表,元素类型是Integer,表示成员的QQ号 */
public List<Integer> onlineMembers;
/** 子群列表,可能是讨论组也可能是多人对话 */
public List<SimpleClusterInfo> subClusters;
/** 子群操作子类型 */
public byte subClusterOpByte;
// 仅用于加入群的回复包
/** 加入群的回复 */
public byte joinReply;
// 仅用于搜索群的回复包,元素类型是ClusterInfo
/** 搜索类型 */
public byte searchType;
/** 搜索到的群,类型是ClusterInfo */
public List<ClusterInfo> clusters;
// 用于更新组织架构的回复包和提交组织架构的回复包
public int organizationVersionId;
public int organizationCount;
public List<QQOrganization> organizations;
// 用于提交成员分组的回复包
public int memberOrganziationVersionId;
// 用于批量得到群名片真实姓名的回复包
public List<CardStub> cardStubs;
public int cardVersionId;
public int nextStart;
// 用于得到单个成员群名片的回复包
public Card card;
// 用于设置角色回复包
public byte role;
/**
* 构造函数
* @param buf 缓冲区
* @param length 包长度
* @throws PacketParseException 解析错误
*/
public ClusterCommandReplyPacket(ByteBuffer buf, int length, QQUser user) throws PacketParseException {
super(buf, length, user);
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.packets.OutPacket#getPacketName()
*/
@Override
public String getPacketName() {
return "Cluster Command Reply";
}
/* (non-Javadoc)
* @see edu.tsinghua.lumaqq.qq.packets.InPacket#parseBody(java.nio.ByteBuffer)
*/
@Override
protected void parseBody(ByteBuffer buf) throws PacketParseException {
// 得到群操作命令和回复码
subCommand = buf.get();
replyCode = buf.get();
// 判断命令类型
switch(subCommand) {
case QQ.QQ_CLUSTER_CMD_SEND_IM_EX:
parseSendIMReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_SEND_TEMP_IM:
parseSendTempClusterIMReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_CREATE_CLUSTER:
parseCreateReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_CREATE_TEMP:
parseCreateTempCluster(buf);
break;
case QQ.QQ_CLUSTER_CMD_ACTIVATE_CLUSTER:
parseActivateReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_MODIFY_MEMBER:
parseModifyMemberReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_GET_CLUSTER_INFO:
parseGetInfoReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_EXIT_CLUSTER:
parseExitReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_GET_MEMBER_INFO:
parseGetMemberInfoReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_GET_ONLINE_MEMBER:
parseGetOnlineMemberReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_JOIN_CLUSTER:
parseJoinReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_JOIN_CLUSTER_AUTH:
parseJoinAuthReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_MODIFY_CLUSTER_INFO:
parseModifyInfoReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_SEARCH_CLUSTER:
parseSearchReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_GET_TEMP_INFO:
parseGetTempClusterInfoReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_EXIT_TEMP:
parseExitTempClusterReply(buf);
break;
case QQ.QQ_CLUSTER_CMD_ACTIVATE_TEMP:
parseActivateTempCluster(buf);
break;
case QQ.QQ_CLUSTER_CMD_SUB_CLUSTER_OP:
parseSubClusterOp(buf);
break;
case QQ.QQ_CLUSTER_CMD_UPDATE_ORGANIZATION:
parseUpdateOrganization(buf);
break;
case QQ.QQ_CLUSTER_CMD_COMMIT_ORGANIZATION:
parseCommitOrganization(buf);
break;
case QQ.QQ_CLUSTER_CMD_COMMIT_MEMBER_ORGANIZATION:
parseCommitMemberOrganization(buf);
break;
case QQ.QQ_CLUSTER_CMD_MODIFY_TEMP_INFO:
parseModifyTempClusterInfo(buf);
break;
case QQ.QQ_CLUSTER_CMD_MODIFY_CARD:
parseModifyCard(buf);
break;
case QQ.QQ_CLUSTER_CMD_GET_CARD_BATCH:
parseGetCardBatch(buf);
break;
case QQ.QQ_CLUSTER_CMD_GET_CARD:
parseGetCard(buf);
break;
case QQ.QQ_CLUSTER_CMD_SET_ROLE:
parseSetRole(buf);
break;
case QQ.QQ_CLUSTER_CMD_TRANSFER_ROLE:
parseTransferRole(buf);
break;
case QQ.QQ_CLUSTER_CMD_DISMISS_CLUSTER:
parseDismissCluster(buf);
break;
}
// 如果操作失败
if(replyCode != QQ.QQ_REPLY_OK) {
switch(subCommand) {
case QQ.QQ_CLUSTER_CMD_TRANSFER_ROLE:
clusterId = buf.getInt();
memberQQ = buf.getInt();
errorMessage = Util.getString(buf);
break;
case QQ.QQ_CLUSTER_CMD_SET_ROLE:
clusterId = buf.getInt();
errorMessage = Util.getString(buf);
break;
default:
/* 操作失败 */
errorMessage = Util.getString(buf);
break;
}
}
}
/**
* 处理解散群的回复包
*
* @param buf
*/
private void parseDismissCluster(ByteBuffer buf) {
if(replyCode == QQ.QQ_REPLY_OK) {
clusterId = buf.getInt();
}
}
/**
* 处理转让角色的回复包
*
* @param buf
*/
private void parseTransferRole(ByteBuffer buf) {
if(replyCode == QQ.QQ_REPLY_OK) {
clusterId = buf.getInt();
memberQQ = buf.getInt();
versionId = buf.getInt();
}
}
/**
* 处理设置群成员角色的回复包
*
* @param buf
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -