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

📄 qqeventprocessor.java

📁 java写的qq代码实现qq的部分功能
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
	 * 处理我被从群中删除事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processIAmRemovedFromCluster(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		ClusterModel c = main.getMVCHelper().getClusterModel(packet.header.sender);
		if(c != null) {
			main.getDisplay().syncExec(
				new Runnable() {
					public void run() {
					    // 如果sender等于自己的QQ号,则表示管理员把自己删除了,如果不是,
					    // 表示这个sender主动退出该群
					    if(packet.sender == main.getMyModel().getQQ())
					        main.getMVCHelper().removeCluster(packet.header.sender);
					    // 推入这个群通知
						main.getMessageHelper().putClusterNotification(packet);
					}				
				}
			);
		}
	}

	/**
	 * 处理我被其他人添加到某个群的事件
	 * 
	 * @param e
	 * 			QQEvent
	 */
	private void processIAmAddedToCluster(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		ClusterModel c = main.getMVCHelper().getClusterModel(packet.header.sender);
		if(c == null) {
			main.getDisplay().syncExec(
				new Runnable() {
					public void run() {
					    main.getMVCHelper().addCluster(packet.header.sender, false);
						main.getMessageHelper().putClusterNotification(packet);
					}				
				}
			);
		}
	}

	/**
	 * 处理接收到群发消息
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processReceiveClusterIM(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		main.getDisplay().asyncExec(
			new Runnable() {
				public void run() {
					main.getMessageHelper().putClusterIM(packet);
				}				
			}
		);
	}

	/**
	 * 处理退出群成功事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processClusterExitClusterSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
				    main.getMVCHelper().removeCluster(packet.clusterId);
				}				
			}
		);
	}

	/**
	 * 处理得到成员信息成功事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processClusterGetMemberInfoSuccess(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) {
						Map members = c.getMembers();
						// 对每个得到信息的成员,设置他们model的属性
						Iterator iter = packet.memberInfos.iterator();
						while(iter.hasNext()) {
							QQFriend friend = (QQFriend)iter.next();
							FriendModel f = (FriendModel)c.getMember(friend.qqNum);
							if(f != null) {
								f.addProperty(IQQNode.NICK, friend.nick);
								f.addProperty(INode.NAME, friend.nick);
								f.addProperty(IQQNode.HEAD, new Integer(friend.face));
								f.addProperty(IQQNode.MEMBER, String.valueOf(friend.isMember()));
								f.addProperty(IQQNode.CONTACT, ModelUtils.createContact(friend));								
							}
						}
						// 如果存在这个群的资料窗口,则刷新数据
						if(main.getShellRegistry().hasClusterInfoWindow(c)) {
							ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
							cis.setClusterModel(c);
						}
						// 如果存在这个群的信息窗口,则刷新数据
						if(main.getShellRegistry().hasSendClusterIMWindow(c))
						    main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
						// 遍历当前打开的群信息窗口,如果存在这个群的子群,则刷新在线状态
						Iterator i = main.getShellRegistry().getSendClusterIMWindowModelIterator();
						while(i.hasNext()) {
						    ClusterModel model = (ClusterModel)i.next();
						    if(model.getParentClusterId() == c.getClusterId())
						        main.getShellRegistry().getSendClusterIMWindow(model).refreshClusterInfo();
						}

						main.getClient().getClusterOnlineMember(packet.clusterId);
					}
				}					
			}
		);
	}

	/**
	 * 处理被系统踢出事件
	 */
	private void processKickedOutBySystem() {
		main.getDisplay().asyncExec(
			new Runnable() {
				public void run() {
				    main.getClient().getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					main.logout();
					MessageDialog.openWarning(main.getShell(), LumaQQ.getString("message.box.common.warning.title"), LumaQQ.getString("message.box.login.twice"));
				}
			}
		);
	}

	/**
	 * 处理创建群成功事件
	 * 
	 * @param e
	 * 			QQEvent
	 */
	private void processClusterCreateSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
				    main.getMVCHelper().addCluster(packet.clusterId, true);
				}
			}
		);
	}

	/**
	 * 处理请求发送文件事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processRequestSendFile(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		if(packet.fileArgs.transferType == QQ.QQ_TRANSFER_FILE) {
			main.getDisplay().syncExec(
				new Runnable() {
					public void run() {
						main.getMessageHelper().putSendFileRequestIM(packet);
					}
				}
			);		    
		} else {
		    log.debug("对方可能发出了如来神掌,我闪~");
		}
	}

	/**
	 * 处理登陆未知错误事件
	 */
	private void processLoginUnknownError() {
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
					main.getClient().getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					main.stopStatusAnimation();
					main.getUIHelper().setIconByStatus();
					main.logout();
					MessageDialog.openError(main.getShell(), LumaQQ.getString("message.box.login.fail.title"), LumaQQ.getString("message.box.login.unknown.error"));
				}				
			}
		);
	}

	/**
	 * 处理登陆超时事件
	 * 
	 * @param e
	 * 			QQEvent
	 */
	private void processLoginTimeout() {
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
				    // 登录超时后自动重连
				    retryCount++;
				    if(retryCount > 6) {
						main.getClient().getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
						main.stopStatusAnimation();
						main.getUIHelper().setIconByStatus();
						main.logout();
						MessageDialog.openError(main.getShell(), LumaQQ.getString("message.box.login.fail.title"), LumaQQ.getString("message.box.login.timeout"));
				    } else {
				    	// 奇数次:随机使用服务器
				    	// 偶数次:随机使用服务器,强制使用TCP登录
					    boolean forceTcp = retryCount % 2 == 0;
					    QQUser me = main.getClient().getUser();
					    byte status = me.getStatus();
					    me.setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					    main.logout();
					    me.setStatus(status);
					    main.checkLogin(true, forceTcp);				        
				    }				    
				}				
			}
		);
	}

	/**
	 * 处理keep alive成功事件,主要就是保存一下当前在线人数
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processKeepAliveSuccess(QQEvent e) {
	    // 设置上线数
		main.setCurrentOnlineNumber(String.valueOf(((KeepAliveReplyPacket)e.getSource()).onlines));		
	}

	/*
	 * 这段代码不再使用,现在我们把删除失败当作是好友已经被删除
	// 处理删除好友失败事件
	private void processDeleteFriendFail(QQEvent e) {
		// 得到被删除的QQ号
		DeleteFriendPacket packet = (DeleteFriendPacket)e.getSource();
		final Integer key = new Integer(packet.getTo());
		// 除去删除走向映射,得到这个好友的组索引和组内索引
		main.removeDeleteToMap(key);
		// 打开消息框通知用户删除失败
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
					MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
					box.setText(LumaQQ.getResourceString("message.box.common.fail.title"));
					box.setMessage(LumaQQ.getResourceString("error.delete.friend.fail", new Object[] { key.toString() }));
					box.open();
				}				
			}
		);
	}*/

	/**
	 * 处理删除好友成功事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processDeleteFriendSuccess(QQEvent e) {
		// 得到被删除的QQ号
		DeleteFriendPacket packet = (DeleteFriendPacket)e.getSource();
		Integer key = new Integer(packet.getTo());
		// 得到这个好友的组索引和组内索引,以及好友的model
		final int[] indices = main.getMVCHelper().getFriendCoordinate(packet.getTo());
		// 得到好友删除后的去向,可能是拖到陌生人或者黑名单里面了,也可能就是直接删了,那样就是null
		final GroupModel g = main.removeDeleteToMap(key);
		
		// 更新服务器端好友列表
		// 这个功能不再使用,因为LumaQQ会允许不自动更新分组信息,所以,这里搞成自动的会带来问题
		//main.getClient().removeFriendFromList(packet.getTo());
		
		// 从model中删除
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
					FriendModel f = null;
					if(indices != null)
						f = (FriendModel)main.getModel().removeItem(indices[0], indices[1]);
					if(g != null && f != null) {
					    int gIndex = main.getModel().indexOf(g);
						main.getModel().addItem(gIndex, f);
						main.getUIHelper().adjustAnimateAfterDrag(f.getQQ(), indices[0], gIndex, f);
						main.setGroupDirty(true);
					}
				}					
			}
		);
	}

	/**
	 * 处理登陆密码错误事件
	 */
	private void processLoginPasswordError() {
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
				    // 隐藏窗口
					main.setVisible(false);
					// 退出登录
					main.getClient().getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					main.logout();
				    // 显示密码错误提示框
					MessageDialog.openError(main.getShell(), LumaQQ.getString("message.box.login.fail.title"), LumaQQ.getString("error.login.password.wrong"));
					// 再次显示登录对话框
					LoginDialog login = new LoginDialog(main.getShell());
					if(login.open()) {
						// 创建QQ用户对象
						QQUser me = new QQUser(login.getQQ(), login.getMd5Password());
						if(login.isLoginHidden()) {
							me.setLoginMode(QQ.QQ_LOGIN_MODE_HIDDEN);
							me.setStatus(QQ.QQ_FRIEND_STATUS_HIDDEN);
						} else {
							me.setLoginMode(QQ.QQ_LOGIN_MODE_NORMAL);
							me.setStatus(QQ.QQ_FRIEND_STATUS_ONLINE);
						}
						// 设置用户对象
						main.getClient().setUser(me);
						// 初始化用户文件路径
						LumaQQ.initUserFilePath(me);
						// 设置client,相当于刷新各种数据
						main.setClient(main.getClient());
						// relayout
						main.getShutter().layout();
						// 打开主界面
						main.setVisible(true);
						main.checkLogin(false, false);
					} else
						main.close();
				}				
			}
		);		
	}

	/**
	 * 处理收到消息事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processReceiveNormalIM(QQEvent e) {
		// 得到包,推入消息队列
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
				    main.getMessageHelper().putNormalIM(packet);
				}				
			}
		);
	}
	
	/**
	 * 处理收到短消息事件
	 * 
     * @param e
     * 			QQEvent
     */
    private void processReceiveSMS(QQEvent e) {
		// 得到包,推入消息队列
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		main.getDisplay().syncExec(
			new Runnable() {
				public void run() {
					main.getMessageHelper().putSMS(packet);
				}				
			}
		);
    }

	/**
	 * 处理收到系统通知事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processReceiveSystemNotification(QQEvent e) {
		final SystemNotificationPacket packet = (SystemNotificationPacket)e.getSource();
		main.getDisplay().asyncExec(
			new Runnable() {
				public void run() {
					if(packet.type == QQ.QQ_MSG_SYS_ADD_FRIEND_APPROVED)
						main.getMVCHelper().addFriendViewPart(packet.from);
					main.getMessageHelper().putSystemNotificationAndUpdateAnimate(packet);
				}				
			}
		);
	}

    /**
     * 处理好友状态改变事件
     * 
     * @param e	
     * 			QQEvent
     */
    private void processFriendChangeStatus(QQEvent e) {
        final FriendStatus fs = ((FriendChangeStatusPacket) e.getSource()).friendStatus;
        final FriendModel f = main.getMVCHelper().getFriendModel(fs.qqNum);
        if(f != null) {
            final String status = Util.getStatusString(fs.status);
            main.getDisplay().syncExec(new Runnable() {
                public void run() {
                    f.addProperty(IQQNode.IP, fs.ip);
                    f.addProperty(IQQNode.PORT, String.valueOf(fs.port));
                    // 状态确实改变时才需要以下操作
                    if(!status.equals(f.getStatus())) {
                        main.setFriendProperty(f, IQQNode.STATUS, status);
                        if(IQQNode.VALUE_ONLINE.equals(status) && OptionUtil.getInstance().isShowOnlineTip())
                            main.getTipHelper().getOnlineTipShell().addFriendModel(f);
                    }
                }
            });
        }
    }

	/**

⌨️ 快捷键说明

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