📄 qqeventprocessor.java
字号:
}
}
// 比较上一次的在线好友列表,如果有些好友不在这一次中,则肯定是下线或者隐身了,改变他们的状态
// 当前这个操作必须在得到所有online好友时进行,方法是判断包的position字段
if(packet.finished) {
for(final User f : main.getCurrentOnlines()) {
if(!tempHash.containsKey(f)) {
f.status = Status.OFFLINE;
main.getBlindHelper().synchronizedLatestStatus(f, false);
}
}
main.getCurrentOnlines().clear();
main.getCurrentOnlines().addAll(tempHash.values());
tempHash.clear();
main.getTipHelper().setFirstTime(false);
main.getDisplay().syncExec(new Runnable() {
public void run() {
main.getBlindHelper().refreshAll();
}
});
// 对打开的每一个群信息窗口,请求得到在线成员列表
// 对于打开的每一个多人对话信息窗口,刷新成员的在线状态,因为多人对话的成员按理来说都是
// 我的好友,所以,得到好友在线信息后就可以刷新他们了
Iterator<Integer> i = main.getShellRegistry().getSendClusterIMWindowModelIterator();
while(i.hasNext()) {
final Cluster model = ModelRegistry.getCluster(i.next());
if(model == null)
continue;
if(model.clusterType == ClusterType.NORMAL)
main.getClient().getClusterMemberInfo(model.clusterId, model.getMemberQQList());
else if(model.parentClusterId == 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()) {
main.getMessageQueue().setPostpone(true);
retryCount = 0;
final boolean autoDownloadGroup = main.getOptionHelper().isAutoDownloadGroup();
final boolean autoDownloadFriendRemark = main.getOptionHelper().isAutoDownloadFriendRemark();
final boolean userEmpty = ModelRegistry.getUserCount() == 0;
IExecutor executor = new BackgroundJobExecutor(main);
if(!autoDownloadGroup) {
main.getMessageQueue().setPostpone(false);
main.getMessageHelper().processPostponedIM();
if(userEmpty) {
executor.addJob(new GetFriendListJob());
executor.addJob(new DownloadGroupJob());
}
executor.addJob(new GetUserPropertyJob());
executor.addJob(new DownloadSignatureJob());
executor.addJob(new GetFriendLevelJob());
IJob job = new GetCustomHeadInfoJob();
job.setSuccessLink(new DownloadCustomHeadJob());
executor.addJob(job);
}
if(autoDownloadFriendRemark || autoDownloadGroup) {
// 下载好友分组
if(userEmpty)
executor.addJob(new GetFriendListJob());
if(userEmpty || autoDownloadGroup)
executor.addJob(new DownloadGroupJob());
// 下载好友属性,个性签名,备注,等级
executor.addJob(new GetUserPropertyJob());
executor.addJob(new DownloadSignatureJob());
executor.addJob(new GetFriendLevelJob());
if(autoDownloadFriendRemark)
executor.addJob(new DownloadFriendRemarkJob());
IJob job = new GetCustomHeadInfoJob();
job.setSuccessLink(new DownloadCustomHeadJob());
executor.addJob(job);
// 第一次同步之后,设置不再自动同步
main.getOptionHelper().setAutoDownloadGroup(false);
main.getOptionHelper().setAutoDownloadFriendRemark(false);
}
// 启动任务
if(executor.getAllJobCount() > 0)
executor.execute();
// 请求在线好友列表
main.getClient().getFriendOnline();
// 设置界面状态
main.getDisplay().syncExec(new Runnable() {
public void run() {
main.getUIHelper().stopStatusAnimation();
main.getUIHelper().setTrayIconByStatus();
if(!autoDownloadFriendRemark && !autoDownloadGroup && !userEmpty) {
main.stopWaitingPanelAnimation();
main.switchPanel(MainShell.PANEL_MAIN);
}
if(main.getOptionHelper().isShowLastLoginTip())
main.getShellLauncher().openLastLoginTipWindow(main);
}
});
// 检查更新
if(main.getOptionHelper().isAutoCheckUpdate())
new CheckUpdateThread(main).start();
}
}
/**
* @param e
*/
private void processClusterGetTempClusterInfoSuccess(QQEvent e) {
final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
main.getDisplay().syncExec(new Runnable() {
public void run() {
// 搜索这个群
Cluster c = ModelRegistry.getCluster(packet.clusterId);
// 群存在操作才有意义
if(c != null) {
c.creator = packet.info.creator;
c.authType = packet.info.authType;
c.category = packet.info.category;
c.oldCategory = packet.info.oldCategory;
c.description = packet.info.description;
c.notice = packet.info.notice;
c.versionId = packet.info.versionId;
c.externalId = packet.info.externalId;
c.clusterType = ClusterType.valueOfTemp(packet.type);
c.name = packet.info.name;
// 同步成员列表
synchronizeMember(c, packet.members, true, c.parentClusterId);
// 如果存在这个群的资料窗口,则刷新数据
if(main.getShellRegistry().hasClusterInfoWindow(c)) {
ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
cis.setClusterModel(c);
}
// 如果存在这个群的信息窗口,则刷新数据
if(!main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().hasSendClusterIMWindow(c))
main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
// 如果标签页窗口是打开的
if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
sitw.refreshTab(c);
}
// 刷新群组
main.getBlindHelper().refreshGroup(main.getBlindHelper().getClusterGroup());
}
}
});
}
/**
* 初始发送群消息失败事件
*
* @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_REPLY_TEMP_CLUSTER_REMOVED:
case QQ.QQ_REPLY_NOT_CLUSTER_MEMBER:
case QQ.QQ_REPLY_NOT_TEMP_CLUSTER_MEMBER:
main.getBlindHelper().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_REPLY_TEMP_CLUSTER_REMOVED:
case QQ.QQ_REPLY_NOT_CLUSTER_MEMBER:
case QQ.QQ_REPLY_NOT_TEMP_CLUSTER_MEMBER:
main.getBlindHelper().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() {
Cluster c = ModelRegistry.getCluster(packet.clusterId);
if(c == null)
return;
// 重设组内成员状态
c.resetMemberStatus();
for(Integer qq : packet.onlineMembers) {
User u = c.getMember(qq);
if(u != null)
u.status = Status.ONLINE;
}
// 如果存在这个群的信息窗口,则刷新数据
if(!main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().hasSendClusterIMWindow(c))
main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
// 如果标签页窗口是打开的
if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
sitw.refreshTab(c);
}
// 重画
main.getBlindHelper().refreshGroup(c.group);
}
});
}
/**
* <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() {
// 搜索这个群
Cluster c = ModelRegistry.getCluster(packet.clusterId);
// 群存在操作才有意义
if(c != null) {
if(packet.externalId == 0) {
main.getBlindHelper().removeCluster(packet.clusterId);
return;
}
c.creator = packet.info.creator;
c.authType = packet.info.authType;
c.category = packet.info.category;
c.oldCategory = packet.info.oldCategory;
c.description = packet.info.description;
c.notice = packet.info.notice;
c.versionId = packet.info.versionId;
c.externalId = packet.externalId;
c.clusterType = ClusterType.NORMAL;
c.name = packet.info.name;
// 同步成员列表
synchronizeMember(c, packet.members, false, 0);
// 如果存在这个群的资料窗口,则刷新数据
if(main.getShellRegistry().hasClusterInfoWindow(c)) {
ClusterInfoWindow cis = main.getShellRegistry().getClusterInfoWindow(c);
cis.setClusterModel(c);
}
// 如果存在这个群的信息窗口,则刷新数据
if(!main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().hasSendClusterIMWindow(c))
main.getShellRegistry().getSendClusterIMWindow(c).refreshClusterInfo();
// 如果标签页窗口是打开的
if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
sitw.refreshTab(c);
}
// 刷新群组
main.getBlindHelper().refreshGroup(c.group);
// 同步最近联系人组
main.getBlindHelper().synchronizeLatest(c);
// 请求得到成员信息
main.getClient().getClusterMemberInfo(packet.clusterId, packet.members);
}
}
});
}
/**
* 处理得到用户信息成功事件
*
* @param e
* QQEvent
*/
private void processGetUserInfoSuccess(QQEvent e) {
Display display = main.getDisplay();
User myModel = main.getMyModel();
ShellRegistry shellRegistry = main.getShellRegistry();
final ContactInfo info = ((GetUserInfoReplyPacket)e.getSource()).contactInfo;
int qqNum = info.qq;
if(qqNum == 0) {
log.error("得到用户信息,但是解析QQ号失败,该信息被抛弃");
return;
}
// 找到用户的model
User user = ModelRegistry.getUser(qqNum);
if(user == null) {
user = new User();
user.qq = qqNum;
}
user.info = info;
user.nick = info.nick;
user.headId = info.head;
// 似乎userFlag是分成两个部分的,而GetUserInfo只得到低16位的部分
// 也许低16位是用来表示用户的固有属性,而高16位是用来表示用户的动态属性
// 所以这里做了一些处理。不过上述理论纯属猜测
user.userFlag &= 0xFFFF0000;
user.userFlag |= (info.userFlag & 0x0000FFFF);
user.female = info.gender.equals(gender_mm);
if(main.getOptionHelper().isShowNick())
user.displayName = user.nick;
else
user.displayName = user.hasRemarkName() ? user.getRemarkName() : user.nick;
// 这里还要检查一下被得到信息的用户是不是自己
if(qqNum == myModel.qq) {
myModel.info = info;
myModel.headId = info.head;
myModel.nick = info.nick;
myModel.displayName = myModel.nick;
myModel.userFlag = info.userFlag;
myModel.female = info.gender.equals(gender_mm);
main.getClient().getUser().setContactInfo(info);
}
final User finalUser = user;
if(shellRegistry.hasUserInfoWindow(user)) {
// 在最后,我们根据用户的查看资料窗口是否打开来决定是否进行更新操作
display.syncExec(new Runnable() {
public void run() {
UserInfoWindow uis = main.getShellRegistry().getUserInfoWindow(finalUser);
if(uis != null)
uis.setFriendModel(finalUser);
SendIMWindow siw = main.getShellRegistry().getSendIMWindow(finalUser);
if(siw != null)
siw.refresh(finalUser);
if(main.getOptionHelper().isUseTabIMWindow() && main.getShellRegistry().isSendIMTabWindowOpened()) {
SendIMTabWindow sitw = main.getShellRegistry().getSendIMTabWindow();
sitw.refreshTab(finalUser);
}
}
});
}
if(shellRegistry.hasTempSessionIMWindow(user)) {
display.syncExec(new Runnable() {
public void run() {
TempSessionIMWindow win = main.getShellRegistry().getTempSessionIMWindow(finalUser);
if(win != null)
win.refresh(finalUser);
}
});
}
// 刷新
if(finalUser.group != null) {
display.syncExec(new Runnable() {
public void run() {
main.getBlindHelper().refreshGroup(finalUser.group);
main.getBlindHelper().synchronizeLatest(finalUser);
}
});
}
}
/**
* 同步成员列表
*/
private void synchronizeMember(Cluster c, List<Member> newMembers, boolean tempCluster, int parentClusterId) {
// 去掉重复的成员
c.clearAdmins();
c.clearStockholders();
List<User> existMembers = new ArrayList<User>();
List<Member> newMembersBak = new ArrayList<Member>(newMembers);
for(Iterator<Member> i = newMembersBak.iterator(); i.hasNext(); ) {
Member member = i.next();
User u = c.removeMember(member.qq);
if(u != null) {
u.organizationId = member.organization;
existMembers.add(u);
i.remove();
if(member.isAdmin())
c.addAdmin(member.qq);
else if(member.isStockholder())
c.addStockholder(member.qq);
}
}
// Map中剩下的成员为需要删除掉的成员
c.removeAllMembers();
// 恢复重复的成员
for(User member: existMembers)
c.addMember(member);
// 添加新成员
Cluster parent = null;
if(tempCluster && parentClusterId != 0) {
parent = ModelRegistry.getCluster(parentClusterId);
if(c.group == null)
parent.addSubCluster(c);
}
for(Member member : newMembersBak) {
// 找到这个成员的model,如果是固定群,先从好友里面找
// 如果是讨论组,从父群里面找,如果是多人对话,从好友里面找
int qq = member.qq;
User f = null;
if(qq == main.getMyModel().qq)
f = main.getMyModel();
else if(tempCluster) {
if(parentClusterId == 0)
f = ModelRegistry.getUser(qq);
else if(parent != null)
f = parent.getMember(qq);
} else
f = ModelRegistry.getUser(qq);
// 没找到就新建一个
if(f == null) {
f = new User();
f.qq = qq;
f.nick = String.valueOf(qq);
f.remark = main.getConfigHelper().getRemark(f.qq);
f.displayName = main.getOptionHelper().isShowNick() ? f.nick : ((f.remark == null) ? f.nick : f.remark.getName());
f.organizationId = member.organization;
} else {
try {
f = (User)f.clone();
f.organizationId = member.organization;
} catch(CloneNotSupportedException e) {
continue;
}
}
c.addMember(f);
if(member.isAdmin())
c.addAdmin(member.qq);
else if(member.isStockholder())
c.addStockholder(member.qq);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -