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

📄 qqeventprocessor.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	 * 处理状态改变失败事件
	 */
	private void processChangeStatusFail() {
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
					MessageDialog.openWarning(main.getShell(), LumaQQ.getString("message.box.common.fail.title"), LumaQQ.getString("error.change.status.fail"));
				}				
			}
		);
	}

	/**
	 * 处理改变状态成功事件
	 */
	private void processChangeStatusSuccess() {
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
				    main.getUIHelper().setIconByStatus();
				}				
			}
		); 
	}

	/**
	 * 处理得到在线好友列表的事件,判断好友的状态是否改变了,如果改变了,就刷新view
	 * 对于会员,我们把文字颜色设成红色
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processGetFriendOnlineSuccess(QQEvent e) {
		// 得到包
		GetFriendOnlineReplyPacket packet = (GetFriendOnlineReplyPacket)e.getSource();
		Iterator iter = packet.onlineFriends.iterator();
		// 循环检查各个好友的状态,如果改变了就设置
		while(iter.hasNext()) {	
			// 得到好友状态结构
			final FriendStatus fs = ((FriendOnlineEntry)iter.next()).status;
			// 搜索出这个好友的model
			final FriendModel f = main.getMVCHelper().getFriendModel(fs.qqNum);
			if(f != null) {
				// 得到状态,判断是否会员
				tempHash.put(f, f);
				final String status = Util.getStatusString(fs.status);				
				// 如果状态改变了,更新view
				if(!status.equals(f.getStatus())) {
					main.getDisplay().syncExec(new Runnable() {
						public void run() {
							f.addProperty(IQQNode.IP, fs.ip);
							f.addProperty(IQQNode.PORT, String.valueOf(fs.port));
							main.setFriendProperty(f, IQQNode.STATUS, status);
							if(!main.getTipHelper().isFirstTime() && f.isOnline() && OptionUtil.getInstance().isShowOnlineTip())
							    main.getTipHelper().getOnlineTipShell().addFriendModel(f);
						}							
					});
				}
			}
		}
		// 比较上一次的在线好友列表,如果有些好友不在这一次中,则肯定是下线或者隐身了,改变他们的状态
		// 当前这个操作必须在得到所有online好友时进行,方法是判断包的position字段
		if(packet.position == QQ.QQ_FRIEND_ONLINE_LIST_POSITION_END) {
			iter = main.getCurrentOnlines().iterator();
			while(iter.hasNext()) {
				final FriendModel f = (FriendModel)iter.next();
				if(!tempHash.containsKey(f)) {
					main.getDisplay().syncExec(
						new Runnable() {
							public void run() {
								main.setFriendProperty(f, IQQNode.STATUS, IQQNode.VALUE_OFFLINE);					
							}							
						}
					);
				}
			}
			main.getCurrentOnlines().clear();
			main.getCurrentOnlines().addAll(tempHash.values());
			tempHash.clear();
			main.getTipHelper().setFirstTime(false);
			
			// 对打开的每一个群信息窗口,请求得到在线成员列表
			// 对于打开的每一个多人对话信息窗口,刷新成员的在线状态,因为多人对话的成员按理来说都是
			// 我的好友,所以,得到好友在线信息后就可以刷新他们了
			Iterator i = main.getShellRegistry().getSendClusterIMWindowModelIterator();
			while(i.hasNext()) {
			    final ClusterModel model = (ClusterModel)i.next();
			    if(model.isPermanent())
			        main.getClient().getClusterMemberInfo(model.getClusterId(), model.getMemberQQList());
			    else if(model.getParentClusterId() == 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()) {
	        retryCount = 0;
	        
			// 首先我们停止动画,根据当前状态设置相应的图标
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
					main.stopStatusAnimation();
					main.getUIHelper().setIconByStatus();
				}				
			});
			
			final boolean autoDownloadGroup = OptionUtil.getInstance().isAutoDownloadGroup();
			final boolean autoDownloadFriendRemark = OptionUtil.getInstance().isAutoDownloadFriendRemark(); 
			if(autoDownloadFriendRemark || autoDownloadGroup) {
				main.getDisplay().asyncExec(new Runnable() {
					public void run() {
						// 下载好友分组
						JobExecutor executor = new JobExecutor(main);
						if(main.getModel().getAllItemCount() == 0)
						    executor.addJob(new GetFriendListJob());
						if(autoDownloadGroup)
						    executor.addJob(new DownloadGroupJob());
						if(autoDownloadFriendRemark)
						    executor.addJob(new DownloadFriendRemarkJob());
						executor.run();
					}				
				});	
				// 第一次同步之后,设置不再自动同步
				OptionUtil.getInstance().setAutoDownloadGroup(false);
				OptionUtil.getInstance().setAutoDownloadFriendRemark(false);
			} 
			
			main.getClient().getFriendOnline();
	    }
	}

    /**
     * @param e
     */
    private void processClusterGetTempClusterInfoSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				// 搜索这个群
				ClusterModel c = main.getMVCHelper().getClusterModel(packet.clusterId);
				// 群存在操作才有意义
				if(c != null) {					    
					ClusterInfo info = packet.info;
					// 添加info属性
					c.addProperty(IQQNode.INFO, info);
					// 临时群类型
					c.addProperty(IQQNode.TYPE, new Integer(packet.type));
					// name属性
					c.addProperty(INode.NAME, info.name);
					// 同步成员列表
					synchronizeMember(c.getMembers(), packet.members, true, c.getParentClusterId());							
					// 如果存在这个群的资料窗口,则刷新数据
					if(main.getShellRegistry().hasClusterInfoWindow(c)) {
						ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
						cis.setClusterModel(c);
					}
					// 如果存在这个群的信息窗口,则刷新数据
					if(main.getShellRegistry().hasSendClusterIMWindow(c))
					    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
					// 刷新群组
					main.getShutter().refreshTabView(main.getMVCHelper().getFirstClusterGroup());
				}									
			}
		});
    }
    
    /**
	 * 初始发送群消息失败事件
	 * 
     * @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_CLUSTER_CMD_REPLY_TEMP_CLUSTER_REMOVED:
			        case QQ.QQ_CLUSTER_CMD_REPLY_NOT_CLUSTER_MEMBER:
			        case QQ.QQ_CLUSTER_CMD_REPLY_NOT_TEMP_CLUSTER_MEMBER:
					    main.getMVCHelper().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_CLUSTER_CMD_REPLY_TEMP_CLUSTER_REMOVED:
			        case QQ.QQ_CLUSTER_CMD_REPLY_NOT_CLUSTER_MEMBER:
			        case QQ.QQ_CLUSTER_CMD_REPLY_NOT_TEMP_CLUSTER_MEMBER:
						main.getMVCHelper().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() {
			    ClusterModel c = (ClusterModel)main.getMVCHelper().getClusterModel(packet.clusterId);
			    if(c == null)
			        return;
			    
			    Iterator i = c.getMembers().values().iterator();
			    while(i.hasNext()) {
			        FriendModel f = (FriendModel)i.next();
			        if(!main.getMVCHelper().isFriend(f))
			            f.addProperty(IQQNode.STATUS, IQQNode.VALUE_OFFLINE);
			    }
			    
			    i = packet.onlineMembers.iterator();
			    while(i.hasNext()) {
			        Integer qq = (Integer)i.next();
			        if(!main.getMVCHelper().isFriend(qq.intValue())) {
			            FriendModel f = c.getMember(qq.intValue());
			            if(f != null)
			                f.addProperty(IQQNode.STATUS, IQQNode.VALUE_ONLINE);
			        }
			    }
			    
				// 如果存在这个群的信息窗口,则刷新数据
				if(main.getShellRegistry().hasSendClusterIMWindow(c))
				    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
			}				
		});	
    }
    
	/**
	 * <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() {
					// 搜索这个群
					ClusterModel c = main.getMVCHelper().getClusterModel(packet.clusterId);
					// 群存在操作才有意义
					if(c != null) {
					    if(packet.externalId == 0) {
					        main.getMVCHelper().removeCluster(packet.clusterId);
					        return;
					    }
					    
						ClusterInfo info = packet.info;
						// 添加info属性
						c.addProperty(IQQNode.INFO, info);
						// permanent属性
						c.addProperty(IQQNode.TYPE, new Integer(info.type));
						// name属性
						c.addProperty(INode.NAME, info.name);
						// 同步成员列表
						synchronizeMember(c.getMembers(), packet.members, false, 0);						
						// 如果存在这个群的资料窗口,则刷新数据
						if(main.getShellRegistry().hasClusterInfoWindow(c)) {
							ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
							cis.setClusterModel(c);
						}
						// 如果存在这个群的信息窗口,则刷新数据
						if(main.getShellRegistry().hasSendClusterIMWindow(c))
						    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
						// 刷新群组
						main.getShutter().refreshTabView(main.getMVCHelper().getFirstClusterGroup());
						// 请求得到成员信息
						main.getClient().getClusterMemberInfo(packet.clusterId, packet.members);
					}									
				}
			}
		);
	}
	
	/**
	 * 处理得到用户信息成功事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processGetUserInfoSuccess(QQEvent e) {
	    Display display = main.getDisplay();
	    MVCHelper mvcHelper = main.getMVCHelper();
	    FriendModel myModel = main.getMyModel();
	    QQClient client = main.getClient();
	    ShellRegistry shellRegistry = main.getShellRegistry();
	    
		final ContactInfo info = ((GetUserInfoReplyPacket)e.getSource()).contactInfo;
		int qqNum = Util.getInt(info.infos[info.qqStr], 0);
		if(qqNum == 0) {
			log.error("得到用户信息,但是解析QQ号失败,该信息被抛弃");
			return;
		}
		// 找到用户的model
		final FriendModel user = mvcHelper.getFriendModel(qqNum);
		boolean isMe = false;
		if(user != null) {
			display.syncExec(new Runnable() {
				public void run() {
					user.addProperty(IQQNode.CONTACT, info);
					user.addProperty(IQQNode.HEAD, Util.getInteger(info.infos[info.face], 0));							
					user.addProperty(INode.IMAGE, HeadFactory.getHeadByStatus(info.infos[info.face], user.getStatus()));
					if(OptionUtil.getInstance().isShowNick())
					    user.addProperty(INode.NAME, info.infos[info.nick]);
					user.addProperty(IQQNode.NICK, info.infos[info.nick]);
				}					
			});
		}
		// 这里还要检查一下被得到信息的用户是不是自己
		if(qqNum == main.getMyModel().getQQ()) {
			myModel.addProperty(IQQNode.CONTACT, info);
			myModel.addProperty(IQQNode.HEAD, Util.getInteger(info.infos[info.face], 0));
			myModel.addProperty(INode.NAME, info.infos[info.nick]);
			myModel.addProperty(IQQNode.NICK, info.infos[info.nick]);
			isMe = true;
		}
		// 检查这个用户的查看资料框是否是打开的
		// 这个时候还要再检查一下这个model是不是null,这种情况出现在一个陌生人想你请求加你为好友时
		// 那个时候是可以看详细资料的,但是model里面还没有这个用户
		FriendModel temp = isMe?myModel:user;
		final FriendModel f = (temp == null)?new FriendModel(info.infos[info.qqStr]):temp;
		if(temp == null) {
			f.addProperty(INode.NAME, info.infos[info.nick]);
			f.addProperty(IQQNode.NICK, info.infos[info.nick]);
			f.addProperty(IQQNode.HEAD, Util.getInteger(info.infos[info.face], 0));
			f.addProperty(IQQNode.CONTACT, info);
		} 
		if(shellRegistry.hasUserInfoWindow(f)) {
			// 好,在最后,我们根据用户的查看资料窗口是否打开来决定是否进行更新操作
			display.syncExec(
				new Runnable() {
					public void run() {
					    UserInfoWindow uis = main.getShellRegistry().getUserInfoWindow(f);
						if(uis != null)
							uis.setFriendModel(f);
					}				
				}
			);			
		}
	}
	
	/**
	 * 同步成员列表
	 * 
	 * @param oldMembers
	 * @param newMemberQQ
	 */
	private void synchronizeMember(Map oldMembers, List newMemberQQ, boolean tempCluster, int parentClusterId) {
	    // 去掉重复的成员
	    List temp = new ArrayList();
	    List temp2 = new ArrayList(newMemberQQ);
	    Iterator i = temp2.iterator();
	    while(i.hasNext()) {
	        Integer qq = (Integer)i.next();
	        Object member = oldMembers.remove(qq);
	        if(member != null) {
	            temp.add(member);
	            i.remove();
	        }
	    }
	    
	    // Map中剩下的成员为删除掉的成员
	    oldMembers.clear();
	    // 恢复重复的成员
	    i = temp.iterator();
	    while(i.hasNext()) {
	        FriendModel member = (FriendModel)i.next();
	        oldMembers.put(member.getProperty(IQQNode.QQ_NUMBER), member);
	    }
	    // 添加新成员
        ClusterModel parent = null;
	    if(tempCluster && parentClusterId != 0)
	        parent = main.getMVCHelper().getClusterModel(parentClusterId);
	    i = temp2.iterator();
	    while(i.hasNext()) {
	        // 找到这个成员的model,如果是固定群,先从好友里面找
	        // 如果是讨论组,从父群里面找,如果是多人对话,从好友里面找
	        Integer qq = (Integer)i.next();	        
	        FriendModel f = null;
	        if(qq.intValue() == main.getMyModel().getQQ())
	            f = main.getMyModel();
	        else if(tempCluster) {
	            if(parentClusterId == 0)
		            f = main.getMVCHelper().getFriendModel(qq);
	            else if(parent != null)
	                f = parent.getMember(qq.intValue());
	        } else
	            f = main.getMVCHelper().getFriendModel(qq);
	            
	        // 没找到就新建一个
	        if(f == null) {
				f = new FriendModel(qq);
				f.addProperty(IQQNode.HEAD, new Integer(0));
				main.setFriendProperty(f, IQQNode.STATUS, IQQNode.VALUE_OFFLINE);
	        }
	        oldMembers.put(f.getProperty(IQQNode.QQ_NUMBER), f);
	    }
	}
}

⌨️ 快捷键说明

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