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

📄 qqeventprocessor.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
			}
		}
		// 比较上一次的在线好友列表,如果有些好友不在这一次中,则肯定是下线或者隐身了,改变他们的状态
		// 当前这个操作必须在得到所有online好友时进行,方法是判断包的position字段
		if(packet.finished) {
			for(final User f : main.getCurrentOnlines()) {
				if(!tempHash.containsKey(f)) {
					f.status = Status.OFFLINE;
					main.getBlindHelper().synchronizedLatestStatus(f, false);
				}
			}
			main.getCurrentOnlines().clear();
			main.getCurrentOnlines().addAll(tempHash.values());
			tempHash.clear();
			main.getTipHelper().setFirstTime(false);
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
					main.getBlindHelper().refreshAll();			
				}							
			});
			
			// 对打开的每一个群信息窗口,请求得到在线成员列表
			// 对于打开的每一个多人对话信息窗口,刷新成员的在线状态,因为多人对话的成员按理来说都是
			// 我的好友,所以,得到好友在线信息后就可以刷新他们了
			Iterator<Integer> i = main.getShellRegistry().getSendClusterIMWindowModelIterator();
			while(i.hasNext()) {
			    final Cluster model = ModelRegistry.getCluster(i.next());
			    if(model == null)
			    	continue;
			    if(model.clusterType == ClusterType.NORMAL)
			        main.getClient().getClusterMemberInfo(model.clusterId, model.getMemberQQList());
			    else if(model.parentClusterId == 0) {
			        main.getDisplay().asyncExec(new Runnable() {
                        public void run() {
					        main.getShellRegistry().getSendClusterIMWindow(model).refreshClusterInfo();
                        }
			        });
			    }
			}
		} else
		    main.getClient().getFriendOnline(packet.position);
	}

	/**
	 * 处理登陆成功事件
	 */
	private void processLoginSuccess() {
	    if(main.getClient().getUser().isLoggedIn()) {
	    	main.getMessageQueue().setPostpone(true);	    	
	        retryCount = 0;

			final boolean autoDownloadGroup = main.getOptionHelper().isAutoDownloadGroup();
			final boolean autoDownloadFriendRemark = main.getOptionHelper().isAutoDownloadFriendRemark();
			final boolean userEmpty = ModelRegistry.getUserCount() == 0;
			IExecutor executor = new BackgroundJobExecutor(main);			    
			if(!autoDownloadGroup) {
				main.getMessageQueue().setPostpone(false);
			    main.getMessageHelper().processPostponedIM();
			    if(userEmpty) {
				    executor.addJob(new GetFriendListJob());
					executor.addJob(new DownloadGroupJob());
			    }
				executor.addJob(new GetUserPropertyJob());
				executor.addJob(new DownloadSignatureJob());
				executor.addJob(new GetFriendLevelJob());
				IJob job = new GetCustomHeadInfoJob();
				job.setSuccessLink(new DownloadCustomHeadJob());
				executor.addJob(job);
			}
			if(autoDownloadFriendRemark || autoDownloadGroup) {				
				// 下载好友分组
				if(userEmpty)
				    executor.addJob(new GetFriendListJob());
				if(userEmpty || autoDownloadGroup)
					executor.addJob(new DownloadGroupJob());
				
				// 下载好友属性,个性签名,备注,等级
				executor.addJob(new GetUserPropertyJob());
				executor.addJob(new DownloadSignatureJob());
				executor.addJob(new GetFriendLevelJob());
				if(autoDownloadFriendRemark)
				    executor.addJob(new DownloadFriendRemarkJob());
				IJob job = new GetCustomHeadInfoJob();
				job.setSuccessLink(new DownloadCustomHeadJob());
				executor.addJob(job);
				
				// 第一次同步之后,设置不再自动同步
				main.getOptionHelper().setAutoDownloadGroup(false);
				main.getOptionHelper().setAutoDownloadFriendRemark(false);
			} 
			
			// 启动任务
			if(executor.getAllJobCount() > 0)
				executor.execute();
			
			// 请求在线好友列表
			main.getClient().getFriendOnline();
			
			// 设置界面状态
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
					main.getUIHelper().stopStatusAnimation();
					main.getUIHelper().setTrayIconByStatus();
					if(!autoDownloadFriendRemark && !autoDownloadGroup && !userEmpty) {
						main.stopWaitingPanelAnimation();
						main.switchPanel(MainShell.PANEL_MAIN);
					}
					if(main.getOptionHelper().isShowLastLoginTip())
						main.getShellLauncher().openLastLoginTipWindow(main);
				}
			});
			
			// 检查更新
			if(main.getOptionHelper().isAutoCheckUpdate())
				new CheckUpdateThread(main).start();
	    }
	}

    /**
     * @param e
     */
    private void processClusterGetTempClusterInfoSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				// 搜索这个群
				Cluster c = ModelRegistry.getCluster(packet.clusterId);
				// 群存在操作才有意义
				if(c != null) {					
					c.creator = packet.info.creator;
					c.authType = packet.info.authType;
					c.category = packet.info.category;
					c.oldCategory = packet.info.oldCategory;
					c.description = packet.info.description;
					c.notice = packet.info.notice;
					c.versionId = packet.info.versionId;
					c.externalId = packet.info.externalId;					
					c.clusterType = ClusterType.valueOfTemp(packet.type);
					c.name = packet.info.name;

					// 同步成员列表
					synchronizeMember(c, packet.members, true, c.parentClusterId);							
					// 如果存在这个群的资料窗口,则刷新数据
					if(main.getShellRegistry().hasClusterInfoWindow(c)) {
						ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
						cis.setClusterModel(c);
					}
					// 如果存在这个群的信息窗口,则刷新数据
					if(!main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().hasSendClusterIMWindow(c))
					    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
					// 如果标签页窗口是打开的
					if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
						SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
						sitw.refreshTab(c);						
					}
					// 刷新群组
					main.getBlindHelper().refreshGroup(main.getBlindHelper().getClusterGroup());
				}									
			}
		});
    }
    
    /**
	 * 初始发送群消息失败事件
	 * 
     * @param e
     */
    private void processSendClusterIMFail(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
			    switch(packet.replyCode) {
			        case QQ.QQ_REPLY_TEMP_CLUSTER_REMOVED:
			        case QQ.QQ_REPLY_NOT_CLUSTER_MEMBER:
			        case QQ.QQ_REPLY_NOT_TEMP_CLUSTER_MEMBER:
					    main.getBlindHelper().removeCluster(packet.clusterId);
			        	break;
			    }
			}				
		});			
    }
    
	/**
	 * 处理群命令失败事件,如果错误信息表示自己已经不是群成员,则删除这个群
	 * @param e
	 */
	private void processClusterCommandFail(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
			    switch(packet.replyCode) {
			        case QQ.QQ_REPLY_TEMP_CLUSTER_REMOVED:
			        case QQ.QQ_REPLY_NOT_CLUSTER_MEMBER:
			        case QQ.QQ_REPLY_NOT_TEMP_CLUSTER_MEMBER:
						main.getBlindHelper().removeCluster(packet.clusterId);
			        	break;
			    }
			}				
		});			
	}	

    /**
     * 处理得到群在线成员成功事件
     * 
     * @param e
     */
    private void processClusterGetOnlineMemberSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
			    Cluster c = ModelRegistry.getCluster(packet.clusterId);
			    if(c == null)
			        return;
			    
			    // 重设组内成员状态
			    c.resetMemberStatus();			    
				for(Integer qq : packet.onlineMembers) {
					User u = c.getMember(qq);
					if(u != null)
						u.status = Status.ONLINE;
			    }
			    
				// 如果存在这个群的信息窗口,则刷新数据
				if(!main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().hasSendClusterIMWindow(c))
				    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
				// 如果标签页窗口是打开的
				if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
					SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
					sitw.refreshTab(c);						
				}
				// 重画
				main.getBlindHelper().refreshGroup(c.group);
			}				
		});	
    }
    
	/**
	 * <pre>
	 * 处理得到群信息成功事件,处理完毕后会相继请求群成员信息和在线成员列表,这个方法
	 * 在新增加一个群时会被调用。此外,如果群聊窗口打开后,20分钟请求一次群信息
	 * </pre>
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processClusterGetInfoSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				// 搜索这个群
				Cluster c = ModelRegistry.getCluster(packet.clusterId);
				// 群存在操作才有意义
				if(c != null) {
				    if(packet.externalId == 0) {
				        main.getBlindHelper().removeCluster(packet.clusterId);
				        return;
				    }
				    
					c.creator = packet.info.creator;
					c.authType = packet.info.authType;
					c.category = packet.info.category;
					c.oldCategory = packet.info.oldCategory;
					c.description = packet.info.description;
					c.notice = packet.info.notice;
					c.versionId = packet.info.versionId;
					c.externalId = packet.externalId;	
				    c.clusterType = ClusterType.NORMAL;
				    c.name = packet.info.name;
					// 同步成员列表
					synchronizeMember(c, packet.members, false, 0);						
					// 如果存在这个群的资料窗口,则刷新数据
					if(main.getShellRegistry().hasClusterInfoWindow(c)) {
						ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
						cis.setClusterModel(c);
					}
					// 如果存在这个群的信息窗口,则刷新数据
					if(!main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().hasSendClusterIMWindow(c))
					    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
					// 如果标签页窗口是打开的
					if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
						SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
						sitw.refreshTab(c);						
					}
					// 刷新群组
					main.getBlindHelper().refreshGroup(c.group);
					// 同步最近联系人组
					main.getBlindHelper().synchronizeLatest(c);
					// 请求得到成员信息					
					main.getClient().getClusterMemberInfo(packet.clusterId, packet.members);
				}									
			}
		});
	}
	
	/**
	 * 处理得到用户信息成功事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processGetUserInfoSuccess(QQEvent e) {
	    Display display = main.getDisplay();
	    User myModel = main.getMyModel();
	    ShellRegistry shellRegistry = main.getShellRegistry();
	    
		final ContactInfo info = ((GetUserInfoReplyPacket)e.getSource()).contactInfo;
		int qqNum = info.qq;
		if(qqNum == 0) {
			log.error("得到用户信息,但是解析QQ号失败,该信息被抛弃");
			return;
		}
		// 找到用户的model
		User user = ModelRegistry.getUser(qqNum);
		if(user == null) {
			user = new User();
			user.qq = qqNum;
		}
		user.info = info;
		user.nick = info.nick;
		user.headId = info.head;
		// 似乎userFlag是分成两个部分的,而GetUserInfo只得到低16位的部分
		// 也许低16位是用来表示用户的固有属性,而高16位是用来表示用户的动态属性
		// 所以这里做了一些处理。不过上述理论纯属猜测
		user.userFlag &= 0xFFFF0000;
		user.userFlag |= (info.userFlag & 0x0000FFFF);
		user.female = info.gender.equals(gender_mm);
		if(main.getOptionHelper().isShowNick())
			user.displayName = user.nick;
		else
			user.displayName = user.hasRemarkName() ? user.getRemarkName() : user.nick;
		// 这里还要检查一下被得到信息的用户是不是自己
		if(qqNum == myModel.qq) {
			myModel.info = info;
			myModel.headId = info.head;
			myModel.nick = info.nick;
			myModel.displayName = myModel.nick;
			myModel.userFlag = info.userFlag;
			myModel.female = info.gender.equals(gender_mm);
			main.getClient().getUser().setContactInfo(info);
		}
		
		final User finalUser = user;
		if(shellRegistry.hasUserInfoWindow(user)) {
			// 在最后,我们根据用户的查看资料窗口是否打开来决定是否进行更新操作
			display.syncExec(new Runnable() {
				public void run() {
				    UserInfoWindow uis = main.getShellRegistry().getUserInfoWindow(finalUser);
					if(uis != null)
						uis.setFriendModel(finalUser);
					SendIMWindow siw = main.getShellRegistry().getSendIMWindow(finalUser);
					if(siw != null) 
						siw.refresh(finalUser);
					if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
						SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
						sitw.refreshTab(finalUser);						
					}
				}				
			});			
		}
		if(shellRegistry.hasTempSessionIMWindow(user)) {
			display.syncExec(new Runnable() {
				public void run() {
					TempSessionIMWindow win = main.getShellRegistry().getTempSessionIMWindow(finalUser);
					if(win != null)
						win.refresh(finalUser);
				}
			});
		}
		
		// 刷新
		if(finalUser.group != null) {
			display.syncExec(new Runnable() {
				public void run() {				
					main.getBlindHelper().refreshGroup(finalUser.group);
                	main.getBlindHelper().synchronizeLatest(finalUser);
				}
			});			
		}
	}
	
	/**
	 * 同步成员列表
	 */
	private void synchronizeMember(Cluster c, List<Member> newMembers, boolean tempCluster, int parentClusterId) {		
	    // 去掉重复的成员
		c.clearAdmins();
		c.clearStockholders();
	    List<User> existMembers = new ArrayList<User>();
	    List<Member> newMembersBak = new ArrayList<Member>(newMembers);
		for(Iterator<Member> i = newMembersBak.iterator(); i.hasNext(); ) {
			Member member = i.next();
			User u = c.removeMember(member.qq);
			if(u != null) {
				u.organizationId = member.organization;
				existMembers.add(u);
				i.remove();
				if(member.isAdmin())
					c.addAdmin(member.qq);
				else if(member.isStockholder())
					c.addStockholder(member.qq);
			}
		}
	    
	    // Map中剩下的成员为需要删除掉的成员
		c.removeAllMembers();
	    // 恢复重复的成员
		for(User member: existMembers)
			c.addMember(member);
	    // 添加新成员
        Cluster parent = null;
	    if(tempCluster && parentClusterId != 0) {
	    	parent = ModelRegistry.getCluster(parentClusterId);	   
	    	if(c.group == null) 
	    		parent.addSubCluster(c);
	    }
		for(Member member : newMembersBak) {
	        // 找到这个成员的model,如果是固定群,先从好友里面找
	        // 如果是讨论组,从父群里面找,如果是多人对话,从好友里面找
			int qq = member.qq;
			User f = null;
	        if(qq == main.getMyModel().qq)
	            f = main.getMyModel();
	        else if(tempCluster) {
	            if(parentClusterId == 0)
		            f = ModelRegistry.getUser(qq);
	            else if(parent != null)
	                f = parent.getMember(qq);
	        } else
	            f = ModelRegistry.getUser(qq);
	            
	        // 没找到就新建一个
	        if(f == null) {
				f = new User();
				f.qq = qq;
				f.nick = String.valueOf(qq);				
				f.remark = main.getConfigHelper().getRemark(f.qq);
				f.displayName = main.getOptionHelper().isShowNick() ? f.nick : ((f.remark == null) ? f.nick : f.remark.getName());
				f.organizationId = member.organization;
	        } else {
	        	try {
					f = (User)f.clone();
					f.organizationId = member.organization;
				} catch(CloneNotSupportedException e) {
					continue;
				}
	        }
			c.addMember(f);		
			if(member.isAdmin())
				c.addAdmin(member.qq);
			else if(member.isStockholder())
				c.addStockholder(member.qq);
	    }
	}
}

⌨️ 快捷键说明

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