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

📄 qqeventprocessor.java

📁 lumaQQ的源文件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
     * 处理我被赋予管理员身份事件
     * 
     * @param e
     */
    private void processAdminEntitled(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		final Cluster c = ModelRegistry.getCluster(packet.header.sender);
		if(c != null) {
			// 修改相关数据
			c.addAdmin(packet.memberQQ);
			
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
				    // 如果接收者是我,表示我被设为管理员,推入这个群通知
					if(packet.memberQQ == main.getMyModel().qq)
						main.getMessageHelper().putClusterNotification(packet);
					// 刷新群窗口
					refreshClusterRelatedWindow(c);
				}
			});
		}
	}    

	/**
	 * 处理我被取消管理员身份事件
	 * 
	 * @param e
	 */
	private void processAdminWithdrawed(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		final Cluster c = ModelRegistry.getCluster(packet.header.sender);
		if(c != null) {
			// 修改相关数据
			c.removeAdmin(packet.memberQQ);
			
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
				    // 如果接收者是我,表示我被取消管理员,推入这个群通知
					if(packet.memberQQ == main.getMyModel().qq)
						main.getMessageHelper().putClusterNotification(packet);
					// 刷新群窗口
					refreshClusterRelatedWindow(c);
				}
			});
		}
	}

	/**
	 * 处理我被其他人添加到某个群的事件
	 * 
	 * @param e
	 * 			QQEvent
	 */
	private void processIAmAddedToCluster(QQEvent e) {
		final ReceiveIMPacket packet = (ReceiveIMPacket)e.getSource();
		Cluster c = ModelRegistry.getCluster(packet.header.sender);
		if(c == null) {
			main.getDisplay().syncExec(new Runnable() {
				public void run() {
				    main.getBlindHelper().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().syncExec(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.getBlindHelper().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() {
				boolean showNick = main.getOptionHelper().isShowNick();
				Cluster c = ModelRegistry.getCluster(packet.clusterId);	
				if(c != null) {
					// 对每个得到信息的成员,设置他们model的属性
					for(QQFriend friend : packet.memberInfos) {
						ContactInfo info = ModelUtils.createContact(friend);
						User f = ModelRegistry.getUser(friend.qqNum);						
						if(f != null) {
							f.nick = friend.nick;							
							f.headId = friend.head;
							f.member = friend.isMember();
							f.userFlag = friend.userFlag;
							f.female = !friend.isGG();
							f.info = info;
							if(!f.hasCardName())
								f.displayName = showNick ? f.nick : (f.hasRemarkName() ? f.getRemarkName() : f.nick);
						}
						f = c.getMember(friend.qqNum);
						if(f != null) {
							f.nick = friend.nick;
							f.headId = friend.head;
							f.member = friend.isMember();
							f.info = info;
							f.userFlag = friend.userFlag;
							f.female = !friend.isGG();
							if(!f.hasCardName())
								f.displayName = showNick ? f.nick : (f.hasRemarkName() ? f.getRemarkName() : f.nick);
						}
					}
					// 如果存在这个群的资料窗口,则刷新数据
					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<Integer> i = main.getShellRegistry().getSendClusterIMWindowModelIterator();
					while(i.hasNext()) {
						Cluster model = ModelRegistry.getCluster(i.next());
						if(model == null)
							continue;
					    if(model.parentClusterId == c.clusterId)
					        main.getShellRegistry().getSendClusterIMWindow(model).refreshClusterInfo();
					}
					// 得到在线成员
					main.getClient().getClusterOnlineMember(packet.clusterId);
					// 重画
					main.getBlindHelper().refreshGroup(c.group);
				}
			}					
		});
	}

	/**
	 * 处理被系统踢出事件
	 */
	private void processKickedOutBySystem() {
		main.getDisplay().asyncExec(new Runnable() {
			public void run() {
			    main.getClient().getUser().setStatus(QQ.QQ_STATUS_OFFLINE);
				main.logout();
				MessageDialog.openWarning(main.getShell(), message_box_common_warning_title, 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.getBlindHelper().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_STATUS_OFFLINE);
				main.getUIHelper().stopStatusAnimation();
				main.getUIHelper().setTrayIconByStatus();
				main.logout();
				MessageDialog.openError(main.getShell(), message_box_login_fail_title, 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_STATUS_OFFLINE);
					main.getUIHelper().stopStatusAnimation();
					main.getUIHelper().setTrayIconByStatus();
					main.logout();
					MessageDialog.openError(main.getShell(), message_box_login_fail_title, message_box_login_timeout);
			    } else {
			    	// 奇数次:随机使用服务器
			    	// 偶数次:随机使用服务器,强制使用TCP登录
				    boolean forceTcp = retryCount % 2 == 0;
				    QQUser me = main.getClient().getUser();
				    byte status = me.getStatus();
				    me.setStatus(QQ.QQ_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
	 */
	private void processAddFriendSuccess(QQEvent e) {
		final AddFriendExReplyPacket packet = (AddFriendExReplyPacket)e.getSource();
		main.getDisplay().asyncExec(new Runnable() {
			public void run() {
				main.getBlindHelper().addFriend(packet.friendQQ);
			}					
		});
	}
	
	/**
	 * 处理删除好友成功事件
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processDeleteFriendSuccess(QQEvent e) {
		// 得到被删除的QQ号
		final DeleteFriendPacket packet = (DeleteFriendPacket)e.getSource();
		
		// 更新服务器端好友列表
		// 这个功能不再使用,因为LumaQQ会允许不自动更新分组信息,所以,这里搞成自动的会带来问题
		//main.getClient().removeFriendFromList(packet.getTo());
		
		// 从model中删除
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				// 得到好友删除后的去向,可能是拖到陌生人或者黑名单里面了,也可能就是直接删了,那样就是null
				Group g = main.removeDeleteToMap(packet.getTo());
				User f = ModelRegistry.getUser(packet.getTo());
				if(f != null && !f.group.isBlackList())
					main.getBlindHelper().simpleMove(f, f.group, g);
			}					
		});
	}

	/**
	 * 处理登陆密码错误事件
	 * @param e 
	 */
	private void processLoginFail(final QQEvent e) {
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				main.restartLogin(e);
			}				
		});		
	}

	/**
	 * 处理收到消息事件
	 * 
	 * @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 processReceiveSystemNotification(QQEvent e) {
		final SystemNotificationPacket packet = (SystemNotificationPacket)e.getSource();
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				main.getMessageHelper().putSystemNotificationAndUpdateAnimate(packet);
			}				
		});
	}

    /**
     * 处理好友状态改变事件
     * 
     * @param e	
     * 			QQEvent
     */
    private void processFriendChangeStatus(QQEvent e) {
        final FriendChangeStatusPacket packet = (FriendChangeStatusPacket) e.getSource();
        final User f = ModelRegistry.getUser(packet.friendQQ);
        if(f != null) {
            main.getDisplay().syncExec(new Runnable() {
                public void run() {
                    // 状态确实改变时才需要以下操作
                	if(packet.userFlag != 0)
                		f.userFlag = packet.userFlag;
                    if(f.status.toQQConstant() != packet.status) {
                    	f.status = Status.valueOf(packet.status);
                    	main.getBlindHelper().refreshGroup(f.group);
                    	
                    	// 检查最近联系人中是否有这个好友,如果有,更新状态
                    	main.getBlindHelper().synchronizedLatestStatus(f, true);
                    	
                    	// 如果需要,显示上线提示
                        if(f.isOnline() && main.getOptionHelper().isShowOnlineTip())
                            main.getTipHelper().getOnlineTipShell().addFriendModel(f);
                    }
                }
            });
        }
    }

	/**
	 * 处理状态改变失败事件
	 */
	private void processChangeStatusFail() {
		main.getDisplay().syncExec(new Runnable() {
			public void run() {
				MessageDialog.openWarning(main.getShell(), message_box_common_fail_title, error_change_status_fail);
			}				
		});
	}

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

	/**
	 * 处理得到在线好友列表的事件,判断好友的状态是否改变了,如果改变了,就刷新view
	 * 对于会员,我们把文字颜色设成红色
	 * 
	 * @param e
	 * 		QQEvent
	 */
	private void processGetFriendOnlineSuccess(QQEvent e) {
		// 得到包
		GetOnlineOpReplyPacket packet = (GetOnlineOpReplyPacket)e.getSource();
		// 循环检查各个好友的状态,如果改变了就设置
		for(FriendOnlineEntry entry : packet.onlineFriends) {
			// 搜索出这个好友的model
			final User f = ModelRegistry.getUser(entry.status.qqNum);
			if(f != null) {
				// 得到状态,判断是否会员
				tempHash.put(f, f);		
				// 如果状态改变了,更新view
				if(f.status.toQQConstant() != entry.status.status) {
					f.ip = entry.status.ip;
					f.port = entry.status.port;
					f.userFlag = entry.userFlag;
					f.status = Status.valueOf(entry.status.status);
					main.getBlindHelper().synchronizedLatestStatus(f, false);
					if(!main.getTipHelper().isFirstTime() && f.isOnline() && main.getOptionHelper().isShowOnlineTip()) {
						main.getDisplay().syncExec(new Runnable() {
							public void run() {
								main.getTipHelper().getOnlineTipShell().addFriendModel(f);					
							}
						});
					}
				}

⌨️ 快捷键说明

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