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

📄 messagehelper.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
			SendIMTabWindow window = shellRegistry.getSendIMTabWindow();
			while(mq.hasMessage(f.qq)) {
				ReceiveIMPacket p = (ReceiveIMPacket)mq.getMessage(f.qq);
				window.putMessage(f, p);
			}
			window.putMessage(f, packet);
			// 停止跳动和闪烁头像
			blindHelper.getViewer(f).stopAnimation(f);
			blindHelper.resetGroupImageEffect(f.group);
			uiHelper.resetTrayImageEffect();
			return;
		}
		// 修改好友的是否有消息属性,这个属性主要用于排序,也就是如果一个好友是隐身的
		// 那么一般他在排在下面,需要翻页才能看到,很不方便,所以通过设置这个属性,
		// 能够让好友有消息来时排到列表的最前面,方便用户选择查看消息
		if(f.isOffline()) {
			// 如果好友当前是离线状态,临时设置他的状态为在线
			f.status = Status.ONLINE;
			// 把好友加入到当前在线名单
			main.getCurrentOnlines().add(f);		    
		}
		f.hasMessage = true;
		f.headId = packet.normalHeader.senderHead;
		blindHelper.refreshGroup(f.group);
		// 从model得到好友的头像
		Image head = HeadFactory.getOnlineHead(f);
		// 检查这是否是第一个消息,如果是,则需要闪烁tray icon,同时还要
		// 在tab上闪烁图标,还要在friend上跳动一个图标,如果不是,则
		// 不需要闪动tray icon,但是其他两个还是要的。如果当前好友已经
		// 有其他消息还没有读,则声音提示就免掉
		if(!mq.hasNext())
		    uiHelper.startBlinkImage(HeadFactory.getOnlineSmallHead(f));
		blindHelper.startBlinkGroupImage(f.group, head);
		blindHelper.startBlinkText(f.group);
		if(!blindHelper.hasAnimation(f)) {		    
			blindHelper.startBounceImage(f);
			main.getSounder().play(LumaQQ.MSG_SOUND);
		}
		
		// 推入队列
		mq.putMessage(packet);
		// 检查是否这个好友的消息窗口已经被打开,如果是,使下一条按钮使能
		if(!useTabIM && shellRegistry.hasReceiveIMWindow(f)) {
			ReceiveIMWindow rms = shellRegistry.getReceiveIMWindow(f);
			rms.setNextButtonEnabled(true);
		}
		// 检查当前是否在离开状态,并且是否设置了自动回复,如果是,自动回复消息
		if(client.getUser().getStatus() == QQ.QQ_STATUS_AWAY 
				&& packet.normalIM.replyType != QQ.QQ_IM_AUTO_REPLY
				&& main.getConfigHelper().isAutoReply()) {
			client.sendIM(packet.normalHeader.sender, Util.getBytes(main.getConfigHelper().getCurrentAutoReplyString()), QQ.QQ_IM_AUTO_REPLY);	
		}
		// 检查是否设置了自动弹出消息且当前没有打开的查看消息窗口,则自动弹出
		// 如果没有设置自动弹出,且目前主窗口处于最小化状态,显示消息提示
		if((!shellRegistry.hasReceiveIMWindow(f) || useTabIM) && options.isAutoEject()) {
	        main.getShellLauncher().openNormalIMWindow(f);
		}	    
	}
	
	/**
	 * 推入一条群消息并更新各种图标的闪烁状态,如果好友列表还没有全部得到,
	 * 则推入延迟队列
	 * 
	 * @param packet
	 * 		消息包对象
	 * @param resolved
	 * 		true表示其中的自定义表情都已经得到
	 */
	public void putClusterIM(ReceiveIMPacket packet) {
	    MessageQueue mq = main.getMessageQueue();	    
	    if(mq.isPostpone()) {
	    	mq.postponeMessage(packet);
	    	return;
	    }
	    
	    ShellRegistry shellRegistry = main.getShellRegistry();
	    Sounder sounder = main.getSounder();
	    BlindHelper blindHelper = main.getBlindHelper();
	    OptionHelper options = main.getOptionHelper();
	    boolean useTabIM = main.getOptionHelper().isUseTabIMWindow();
	    
		// 得到群的内部ID
		int clusterId = packet.header.sender;
		if(packet.header.type == QQ.QQ_RECV_IM_TEMP_CLUSTER)
		    clusterId = packet.clusterIM.clusterId;
		// 得到群的model。如果没有,则新建一个
		Cluster c = null;
		if(packet.header.type == QQ.QQ_RECV_IM_TEMP_CLUSTER)
		    c = main.getBlindHelper().addTempCluster(packet.clusterIM.type, clusterId, packet.clusterIM.externalId);
		else
		    c = main.getBlindHelper().addCluster(clusterId, false);
		if(c == null) 
			return;
		
		// 如果群消息发送者是我自己,则不处理这条消息
		if(main.getMyModel().qq == packet.clusterIM.sender) return;
		
		// 得到消息设定,如果设置了阻止群消息,返回
		if(c.messageSetting == BLOCK)
	        return;
	        
	    // 如果这个消息是分片消息,如果这个消息已经完成,则继续处理,否则推入分片缓冲
	    if(!packet.clusterIM.faceResolved && isFragment(packet.clusterIM)) {
	        addFragment(packet.clusterIM);
	        if(isMessageComplete(packet.clusterIM.messageId)) {
	            packet.clusterIM = getIntegratedClusterIM(packet.clusterIM.messageId);
	        } else {
	            return;
	        }
	    } 
	    
	    // 检查消息里面是否有自定义表情,如果是,提交给自定义表情接收器,返回
	    if(!packet.clusterIM.faceResolved) {
	        if(packet.clusterIM.message == null)
	            packet.clusterIM.message = convertBytes(packet.clusterIM.messageBytes);			    
	        if(packet.clusterIM.message.indexOf(IRichContent.CUSTOM_FACE_TAG) != -1) {		            
	            main.getFaceReceiver().addClusterIM(packet);
	            return;
	        } 
	    }
	    
		// 检查versionId,如果不符合,更新群信息
		if(c.isClusterDirty(packet.clusterIM.versionId)) {
		    c.versionId = packet.clusterIM.versionId;
		    if(c.isPermanent()) {
		    	main.getClient().getClusterInfo(clusterId);
		    	main.getClient().getSubjectList(clusterId);
		    } else
		        main.getClient().getTempClusterInfo(c.clusterType.toQQConstant(), clusterId, c.parentClusterId);
		}
		// 保存到聊天记录
		RecordEntry entry = new RecordEntry();
		entry.type = IKeyConstants.CLUSTER;
		entry.owner = clusterId;
		entry.sender = packet.clusterIM.sender;
		entry.senderParent = clusterId;
		entry.receiver = main.getMyModel().qq;
		entry.time = System.currentTimeMillis();
		entry.message = packet.clusterIM.message;
	    main.getRecordManager().addRecord(entry);
		// 如果这个群的聊天窗口当前处于打开状态,则把消息直接推入,但是也是有一个例外
		// 就是用户设置了阻止该群的一切消息时。
	    // 如果这个群的聊天窗口没有打开,则要根据用户的设置来判断动作
		if(!useTabIM && shellRegistry.hasSendClusterIMWindow(c)) {
			if(c.messageSetting != BLOCK) {
				// 得到发送消息窗口实例
			    SendClusterIMWindow scms = shellRegistry.getSendClusterIMWindow(c);
				// 把这条消息推入窗口中
				scms.appendMessage(c, packet.clusterIM, false);			    
				// 如果窗口不是active的,闪烁图标并播放声音提醒用户
				// 目前禁止声音提示,有些用户觉得群窗口打开时播放声音太烦
				if(!scms.isActive()) {
				    scms.startBlinkImage();						    
					//soundDaemon.play(LumaQQ.MSG_SOUND);
				}
			}
		} else if(useTabIM && shellRegistry.isSendIMTabWindowOpened()) {
			SendIMTabWindow window = shellRegistry.getSendIMTabWindow();
			if(main.getOptionHelper().isAutoEject() || window.hasContainer(c)) {
				window.putMessage(c, packet);
				if(!window.isActive())
					window.startBlinkImage();					
			}		
		} else {
			if(c.messageSetting == ACCEPT) {
				// 检查这是否是第一个消息,如果是,则需要闪烁tray icon,同时还要
				// 在tab上闪烁图标,还要在群上跳动一个图标,如果不是,则
				// 不需要闪动tray icon,但是其他两个还是要的。如果当前群有
			    // 消息未读,则不播放提示声音					
				if(!mq.hasNext()) {
					if(c.isPermanent())
						main.getUIHelper().startBlinkImage(res.getSmallClusterHead(c.headId));
					else
						main.getUIHelper().startBlinkImage(res.getImage(Resources.icoDialog));						
				}
				if(!blindHelper.hasAnimation(c)) {
					blindHelper.startBounceImage(c);
					// 播放消息提示声音
					sounder.play(LumaQQ.MSG_SOUND);						    
				}
				switch(c.clusterType) {
					case NORMAL:
						blindHelper.startBlinkGroupImage(c.group, res.getClusterHead(c.headId));
						break;
					case SUBJECT:
						blindHelper.startBlinkGroupImage(c.group, res.getImage(Resources.icoDialog));
						blindHelper.startBlinkText(c.getParentCluster().getSubjectDummy());
						blindHelper.startBounceImage(c.getParentCluster());
						break;
					case DIALOG:
						blindHelper.startBlinkGroupImage(c.group, res.getImage(Resources.icoDialog));
						blindHelper.startBlinkText(c.getParentCluster());
						break;
				}
				// 推入队列
				mq.putMessage(packet);
			} else if(c.messageSetting == EJECT) {
				// 推入队列
				mq.putMessage(packet);
				// 弹出窗口
				main.getShellLauncher().openClusterIMWindow(c);
				// 播放消息提示声音
				sounder.play(LumaQQ.MSG_SOUND);
			} else if(c.messageSetting == COUNTER) {
				// 推入队列
				mq.putMessage(packet, false);
			}
			
			// 同步最近联系人列表
			if(options.isEnableLatest()) 
				blindHelper.updateLatest(c);
			
			// 消息数增1,刷新界面显示
		    c.messageCount++;
		    main.getBlindHelper().refreshModel(c);
		}
	}

    /**
	 * 推入一个系统消息并更新动画,这个比较简单,如果系统消息按钮没有闪烁就闪烁它
	 * 如果这是第一个消息,则tray icon也要闪烁,其他没什么要判断的了
	 * 
	 * @param packet
	 * 			系统通知包
	 */
	public void putSystemNotificationAndUpdateAnimate(SystemNotificationPacket packet) {
		// 保存到聊天记录
		String qq = String.valueOf(packet.from);
		RecordEntry entry = new RecordEntry();
		entry.type = IKeyConstants.SYSTEM;
		entry.owner = 10000;
		entry.sender = packet.from;
		entry.senderParent = 0;
		entry.receiver = main.getMyModel().qq;
		entry.time = System.currentTimeMillis();		
		switch(packet.type) {
			case QQ.QQ_SYS_BEING_ADDED:
				entry.subType = IKeyConstants.SUB_BEING_ADDED;
			case QQ.QQ_SYS_BEING_ADDED_EX:
				entry.subType = IKeyConstants.SUB_BEING_ADDED_EX;
				entry.message = NLS.bind(receive_system_message_addme, qq);
				packet.message = entry.message;
				break;
			case QQ.QQ_SYS_ADD_FRIEND_REQUEST:
				entry.subType = IKeyConstants.SUB_ADD_FRIEND_REQUEST;
			case QQ.QQ_SYS_ADD_FRIEND_REQUEST_EX:
				entry.subType = IKeyConstants.SUB_ADD_FRIEND_REQUEST_EX;
				entry.message = NLS.bind(receive_system_message_request, qq, packet.message);
				packet.message = entry.message;
				break;
			case QQ.QQ_SYS_ADD_FRIEND_APPROVED_AND_ADD:
				entry.subType = IKeyConstants.SUB_ADD_FRIEND_APPROVED_AND_ADD;
				entry.message = NLS.bind(receive_system_message_approved_and_add, qq);
				packet.message = entry.message;
				break;
			case QQ.QQ_SYS_ADD_FRIEND_APPROVED:
				entry.subType = IKeyConstants.SUB_ADD_FRIEND_APPROVED;
				entry.message = NLS.bind(receive_system_message_approved, qq);
				packet.message = entry.message;
				break;
			case QQ.QQ_SYS_ADD_FRIEND_REJECTED:
				entry.subType = IKeyConstants.SUB_ADD_FRIEND_REJECTED;
				entry.message = NLS.bind(receive_system_message_rejected, qq, packet.message);
				packet.message = entry.message;
				break;
			default:
				entry.subType = IKeyConstants.SUB_UNKNOWN;
				entry.message = "";
				packet.message = entry.message;
				break;
		}
		// 保存记录
		main.getRecordManager().addRecord(entry);
		// 调整动画状态
		if(!main.getMessageQueue().hasNext())
		    main.getUIHelper().startBlinkImage(res.getImage(Resources.icoSysMsg));
		if(!main.getMessageQueue().hasSystemMessage())
			main.getUIHelper().startBlinkSystemMessageIcon();
		
		main.getMessageQueue().putSystemMessage(packet);
		// 播放声音
		main.getSounder().play(LumaQQ.SYS_MSG_SOUND);
		log.debug("一个系统消息被推入队列");
	}
	
    /**
	 * 把对方的文件传输请求推入到发送消息窗口中
	 * 
	 * @param packet
	 * 		ReceiveIMPacket对象
	 */
	public void putSendFileRequestIM(ReceiveIMPacket packet) {
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -