⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clustercommandreplypacket.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
 * 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 + -