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

📄 qqeventprocessor.java

📁 类似于MSN
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
					*/
				    // 现在策略改成连接丢失后自动重连,上面一段代码注释掉不再使用
				    QQUser me = main.client.getUser();
				    byte status = me.getStatus();				    
				    main.logout();
				    me.setStatus(status);
				    main.checkLogin();
				}				
			}
		);
	}

	// 处理登陆未知错误事件
	private void processLoginUnknownError() {
		main.display.syncExec(
			new Runnable() {
				public void run() {
					main.client.getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					main.btnStatus.stopAnimate();
					main.setIconByStatus();
					MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
					box.setText(LumaQQ.getResourceString("message.box.login.fail.title"));
					box.setMessage(LumaQQ.getResourceString("message.box.login.unknown.error"));
					box.open();
				}				
			}
		);
	}

	// 处理登陆超时事件
	private void processLoginTimeout(QQEvent e) {
		main.display.syncExec(
			new Runnable() {
				public void run() {
					main.client.getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					main.btnStatus.stopAnimate();
					main.setIconByStatus();
					MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
					box.setText(LumaQQ.getResourceString("message.box.login.fail.title"));
					box.setMessage(LumaQQ.getResourceString("message.box.login.timeout"));
					box.open();
				}				
			}
		);
	}

	// 处理得到好友列表超时事件,我们简单得重发超时的包
	private void processGetFriendListTimeout(QQEvent e) {
		GetFriendListPacket packet = (GetFriendListPacket)e.getSource();
		main.client.getFriendList(packet.getStartPosition());
	}

	// 处理keep alive成功事件,主要就是保存一下当前在线人数
	private void processKeepAliveSuccess(QQEvent e) {
		main.currentOnlineNumber = 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.display.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();
				}				
			}
		);
	}*/

	// 处理删除好友成功事件
	private void processDeleteFriendSuccess(QQEvent e) {
		// 得到被删除的QQ号
		DeleteFriendPacket packet = (DeleteFriendPacket)e.getSource();
		Integer key = new Integer(packet.getTo());
		// 得到这个好友的组索引和组内索引,以及好友的model
		final int[] indices = main.getFriendCoordinate(packet.getTo());
		// 得到好友删除后的去向,可能是拖到陌生人或者黑名单里面了,也可能就是直接删了,那样就是null
		final GroupModel g = main.removeDeleteToMap(key);
		// 从model中删除
		main.display.syncExec(
			new Runnable() {
				public void run() {
					FriendModel f = null;
					if(indices != null)
						f = (FriendModel)main.model.removeItem(indices[0], indices[1]);
					if(g != null && f != null) {
					    int gIndex = main.model.indexOf(g);
						main.model.addItem(gIndex, f);
						main.adjustAnimateAfterDrag(f.getQQ(), indices[0], gIndex, f);
					}
				}					
			}
		);
	}

	// 处理登陆密码错误事件
	private void processLoginPasswordError() {
		main.display.syncExec(
			new Runnable() {
				public void run() {
				    // 隐藏窗口
					main.setVisible(false);
					// 退出登录
					main.client.getUser().setStatus(QQ.QQ_FRIEND_STATUS_OFFLINE);
					main.logout();
				    // 显示密码错误提示框
					MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
					box.setText(LumaQQ.getResourceString("message.box.login.fail.title"));
					box.setMessage(LumaQQ.getResourceString("error.login.password.wrong"));
					box.open();
					// 再次显示登录对话框
					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.client.setUser(me);
						// 初始化用户文件路径
						LumaQQ.initUserFilePath(me);
						// 设置client,相当于刷新各种数据
						main.setClient(main.client);
						// relayout
						main.shutter.layout();
						// 打开主界面
						main.setVisible(true);
						main.checkLogin();
					} else
						main.close();
				}				
			}
		);		
	}

	// 处理收到消息事件
	private void processReceiveNormalIM(QQEvent e) {
		// 得到包,推入消息队列
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		main.display.asyncExec(
			new Runnable() {
				public void run() {
					main.putMessageAndUpdateAnimate(packet);
				}				
			}
		);
	}

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

	// 处理好友状态改变事件
    private void processFriendChangeStatus(QQEvent e) {
        final FriendStatus fs = ((FriendChangeStatusPacket) e.getSource()).friendStatus;
        final FriendModel f = main.getFriendModel(fs.qqNum);
        if(f != null) {
            final String status = Utils.getStatusString(fs.status);
            main.display.syncExec(new Runnable() {
                public void run() {
                    f.addProperty("ip", fs.ip);
                    f.addProperty("port", String.valueOf(fs.port));
                    // 状态确实改变时才需要以下操作
                    if(!status.equals(f.getProperty("status"))) {
                        f.addProperty("status", status);
                        if("online".equals(status) && main.options.isShowOnlineTip())
                                onlineTipShell.addFriendModel(f);
                    }
                }
            });
        }
    }

	// 处理状态改变失败事件
	private void processChangeStatusFail() {
		final MessageBox box = new MessageBox(main.shell, SWT.ICON_WARNING | SWT.OK);
		box.setText(LumaQQ.getResourceString("message.box.common.fail.title"));
		box.setMessage(LumaQQ.getResourceString("error.change.status.fail"));
		main.display.syncExec(
			new Runnable() {
				public void run() {
					box.open();
				}				
			}
		);
	}

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

	// 处理得到在线好友列表的事件,判断好友的状态是否改变了,如果改变了,就刷新view
	//     对于会员,我们把文字颜色设成红色
	private void processGetFriendOnline(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.getFriendModel(fs.qqNum);
			if(f != null) {
				// 得到状态,判断是否会员
				tempHash.put(f, f);
				final String status = Utils.getStatusString(fs.status);				
				// 如果状态改变了,更新view
				if(!status.equals(f.getProperty("status"))) {
					main.display.syncExec(
						new Runnable() {
							public void run() {
								f.addProperty("status", status);
								f.addProperty("ip", fs.ip);
								f.addProperty("port", String.valueOf(fs.port));
								if(!firstTime && "online".equals(status) && main.options.isShowOnlineTip())
								    onlineTipShell.addFriendModel(f);
							}							
						}
					);
				}
			}
		}
		// 比较上一次的在线好友列表,如果有些好友不在这一次中,则肯定是下线或者隐身了,改变他们的状态
		//     当前这个操作必须在得到所有online好友时进行,方法是判断包的position字段
		if(packet.position == QQ.QQ_FRIEND_ONLINE_LIST_POSITION_END) {
			iter = main.currentOnlines.iterator();
			while(iter.hasNext()) {
				final FriendModel f = (FriendModel)iter.next();
				if(!tempHash.containsKey(f)) {
					main.display.syncExec(
						new Runnable() {
							public void run() {
								f.addProperty("status", "hidden");									
							}							
						}
					);
				}
			}
			main.currentOnlines.clear();
			main.currentOnlines.addAll(tempHash.values());
			tempHash.clear();
			firstTime = false;
		}
	}

	// 处理得到好友列表成功事件,我们得到每一个好友,然后生成model对象,添加到总的model中
	//     如果事件是get friend list end事件,还需要处理postponed message
	private void processGetFriendList(QQEvent e) {
		GetFriendListReplyPacket packet = (GetFriendListReplyPacket)e.getSource();
		Iterator iter = packet.friends.iterator();
		while(iter.hasNext()) {
			QQFriend friend = (QQFriend)iter.next();
			if(friend.qqNum == 9887070)
			    System.out.println("");
			if(main.getFriendModel(friend.qqNum) != null) continue;
			final FriendModel friendModel = ModelUtils.createFriendModel(friend);
			// 检查是否本地得到的列表是重复的,如果是,返回
			main.display.syncExec(
				new Runnable() {
					public void run() {
					    main.model.addItem(0, friendModel);
					}					
				}
			);
		}
		// 如果是得到好友列表结束事件,处理延迟队列的消息
		if(packet.position == QQ.QQ_FRIEND_LIST_POSITION_END) {
			log.debug("好友列表完全得到,开始处理延迟队列消息");
			main.friendListFinished = true;
			main.display.syncExec(
				new Runnable() {
					public void run() {
						main.processPostponedMessage();
					}						
				}
			);
		}
	}	

	// 处理登陆成功事件
	private void processLoginSuccess() {
	    if(!main.client.getUser().isLoggedIn()) {
			// 首先我们停止动画,根据当前状态设置相应的图标
			main.display.syncExec(
				new Runnable() {
					public void run() {
						main.btnStatus.stopAnimate();
						main.setIconByStatus();
					}				
				}
			);
			// 如果需要从服务器得到好友列表,则请求,如果不需要,则获取在线好友列表
			//     注意这两个操作不都进行,因为请求好友列表结束后会自动获取在线好友
			//     而且也不方便把getFriendOnline置于条件判断之外,因为如果需要从服务器
			//     获得好友列表的话,那请求在线好友的回复包可能先到,这样同步起来又麻烦
			//     多些,所以这两个操作不都进行
			if(main.getFriendFromServer)
				main.client.getFriendList();
			else
				main.client.getFriendOnline();	        
	    }
	}
}

⌨️ 快捷键说明

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