📄 qqeventprocessor.java
字号:
*/
// 现在策略改成连接丢失后自动重连,上面一段代码注释掉不再使用
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 + -