📄 qqeventprocessor.java
字号:
* 处理状态改变失败事件
*/
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 + -