📄 messagehelper.java
字号:
SendIMTabWindow window = shellRegistry.getSendIMTabWindow();
while(mq.hasMessage(f.qq)) {
ReceiveIMPacket p = (ReceiveIMPacket)mq.getMessage(f.qq);
window.putMessage(f, p);
}
window.putMessage(f, packet);
// 停止跳动和闪烁头像
blindHelper.getViewer(f).stopAnimation(f);
blindHelper.resetGroupImageEffect(f.group);
uiHelper.resetTrayImageEffect();
return;
}
// 修改好友的是否有消息属性,这个属性主要用于排序,也就是如果一个好友是隐身的
// 那么一般他在排在下面,需要翻页才能看到,很不方便,所以通过设置这个属性,
// 能够让好友有消息来时排到列表的最前面,方便用户选择查看消息
if(f.isOffline()) {
// 如果好友当前是离线状态,临时设置他的状态为在线
f.status = Status.ONLINE;
// 把好友加入到当前在线名单
main.getCurrentOnlines().add(f);
}
f.hasMessage = true;
f.headId = packet.normalHeader.senderHead;
blindHelper.refreshGroup(f.group);
// 从model得到好友的头像
Image head = HeadFactory.getOnlineHead(f);
// 检查这是否是第一个消息,如果是,则需要闪烁tray icon,同时还要
// 在tab上闪烁图标,还要在friend上跳动一个图标,如果不是,则
// 不需要闪动tray icon,但是其他两个还是要的。如果当前好友已经
// 有其他消息还没有读,则声音提示就免掉
if(!mq.hasNext())
uiHelper.startBlinkImage(HeadFactory.getOnlineSmallHead(f));
blindHelper.startBlinkGroupImage(f.group, head);
blindHelper.startBlinkText(f.group);
if(!blindHelper.hasAnimation(f)) {
blindHelper.startBounceImage(f);
main.getSounder().play(LumaQQ.MSG_SOUND);
}
// 推入队列
mq.putMessage(packet);
// 检查是否这个好友的消息窗口已经被打开,如果是,使下一条按钮使能
if(!useTabIM && shellRegistry.hasReceiveIMWindow(f)) {
ReceiveIMWindow rms = shellRegistry.getReceiveIMWindow(f);
rms.setNextButtonEnabled(true);
}
// 检查当前是否在离开状态,并且是否设置了自动回复,如果是,自动回复消息
if(client.getUser().getStatus() == QQ.QQ_STATUS_AWAY
&& packet.normalIM.replyType != QQ.QQ_IM_AUTO_REPLY
&& main.getConfigHelper().isAutoReply()) {
client.sendIM(packet.normalHeader.sender, Util.getBytes(main.getConfigHelper().getCurrentAutoReplyString()), QQ.QQ_IM_AUTO_REPLY);
}
// 检查是否设置了自动弹出消息且当前没有打开的查看消息窗口,则自动弹出
// 如果没有设置自动弹出,且目前主窗口处于最小化状态,显示消息提示
if((!shellRegistry.hasReceiveIMWindow(f) || useTabIM) && options.isAutoEject()) {
main.getShellLauncher().openNormalIMWindow(f);
}
}
/**
* 推入一条群消息并更新各种图标的闪烁状态,如果好友列表还没有全部得到,
* 则推入延迟队列
*
* @param packet
* 消息包对象
* @param resolved
* true表示其中的自定义表情都已经得到
*/
public void putClusterIM(ReceiveIMPacket packet) {
MessageQueue mq = main.getMessageQueue();
if(mq.isPostpone()) {
mq.postponeMessage(packet);
return;
}
ShellRegistry shellRegistry = main.getShellRegistry();
Sounder sounder = main.getSounder();
BlindHelper blindHelper = main.getBlindHelper();
OptionHelper options = main.getOptionHelper();
boolean useTabIM = main.getOptionHelper().isUseTabIMWindow();
// 得到群的内部ID
int clusterId = packet.header.sender;
if(packet.header.type == QQ.QQ_RECV_IM_TEMP_CLUSTER)
clusterId = packet.clusterIM.clusterId;
// 得到群的model。如果没有,则新建一个
Cluster c = null;
if(packet.header.type == QQ.QQ_RECV_IM_TEMP_CLUSTER)
c = main.getBlindHelper().addTempCluster(packet.clusterIM.type, clusterId, packet.clusterIM.externalId);
else
c = main.getBlindHelper().addCluster(clusterId, false);
if(c == null)
return;
// 如果群消息发送者是我自己,则不处理这条消息
if(main.getMyModel().qq == packet.clusterIM.sender) return;
// 得到消息设定,如果设置了阻止群消息,返回
if(c.messageSetting == BLOCK)
return;
// 如果这个消息是分片消息,如果这个消息已经完成,则继续处理,否则推入分片缓冲
if(!packet.clusterIM.faceResolved && isFragment(packet.clusterIM)) {
addFragment(packet.clusterIM);
if(isMessageComplete(packet.clusterIM.messageId)) {
packet.clusterIM = getIntegratedClusterIM(packet.clusterIM.messageId);
} else {
return;
}
}
// 检查消息里面是否有自定义表情,如果是,提交给自定义表情接收器,返回
if(!packet.clusterIM.faceResolved) {
if(packet.clusterIM.message == null)
packet.clusterIM.message = convertBytes(packet.clusterIM.messageBytes);
if(packet.clusterIM.message.indexOf(IRichContent.CUSTOM_FACE_TAG) != -1) {
main.getFaceReceiver().addClusterIM(packet);
return;
}
}
// 检查versionId,如果不符合,更新群信息
if(c.isClusterDirty(packet.clusterIM.versionId)) {
c.versionId = packet.clusterIM.versionId;
if(c.isPermanent()) {
main.getClient().getClusterInfo(clusterId);
main.getClient().getSubjectList(clusterId);
} else
main.getClient().getTempClusterInfo(c.clusterType.toQQConstant(), clusterId, c.parentClusterId);
}
// 保存到聊天记录
RecordEntry entry = new RecordEntry();
entry.type = IKeyConstants.CLUSTER;
entry.owner = clusterId;
entry.sender = packet.clusterIM.sender;
entry.senderParent = clusterId;
entry.receiver = main.getMyModel().qq;
entry.time = System.currentTimeMillis();
entry.message = packet.clusterIM.message;
main.getRecordManager().addRecord(entry);
// 如果这个群的聊天窗口当前处于打开状态,则把消息直接推入,但是也是有一个例外
// 就是用户设置了阻止该群的一切消息时。
// 如果这个群的聊天窗口没有打开,则要根据用户的设置来判断动作
if(!useTabIM && shellRegistry.hasSendClusterIMWindow(c)) {
if(c.messageSetting != BLOCK) {
// 得到发送消息窗口实例
SendClusterIMWindow scms = shellRegistry.getSendClusterIMWindow(c);
// 把这条消息推入窗口中
scms.appendMessage(c, packet.clusterIM, false);
// 如果窗口不是active的,闪烁图标并播放声音提醒用户
// 目前禁止声音提示,有些用户觉得群窗口打开时播放声音太烦
if(!scms.isActive()) {
scms.startBlinkImage();
//soundDaemon.play(LumaQQ.MSG_SOUND);
}
}
} else if(useTabIM && shellRegistry.isSendIMTabWindowOpened()) {
SendIMTabWindow window = shellRegistry.getSendIMTabWindow();
if(main.getOptionHelper().isAutoEject() || window.hasContainer(c)) {
window.putMessage(c, packet);
if(!window.isActive())
window.startBlinkImage();
}
} else {
if(c.messageSetting == ACCEPT) {
// 检查这是否是第一个消息,如果是,则需要闪烁tray icon,同时还要
// 在tab上闪烁图标,还要在群上跳动一个图标,如果不是,则
// 不需要闪动tray icon,但是其他两个还是要的。如果当前群有
// 消息未读,则不播放提示声音
if(!mq.hasNext()) {
if(c.isPermanent())
main.getUIHelper().startBlinkImage(res.getSmallClusterHead(c.headId));
else
main.getUIHelper().startBlinkImage(res.getImage(Resources.icoDialog));
}
if(!blindHelper.hasAnimation(c)) {
blindHelper.startBounceImage(c);
// 播放消息提示声音
sounder.play(LumaQQ.MSG_SOUND);
}
switch(c.clusterType) {
case NORMAL:
blindHelper.startBlinkGroupImage(c.group, res.getClusterHead(c.headId));
break;
case SUBJECT:
blindHelper.startBlinkGroupImage(c.group, res.getImage(Resources.icoDialog));
blindHelper.startBlinkText(c.getParentCluster().getSubjectDummy());
blindHelper.startBounceImage(c.getParentCluster());
break;
case DIALOG:
blindHelper.startBlinkGroupImage(c.group, res.getImage(Resources.icoDialog));
blindHelper.startBlinkText(c.getParentCluster());
break;
}
// 推入队列
mq.putMessage(packet);
} else if(c.messageSetting == EJECT) {
// 推入队列
mq.putMessage(packet);
// 弹出窗口
main.getShellLauncher().openClusterIMWindow(c);
// 播放消息提示声音
sounder.play(LumaQQ.MSG_SOUND);
} else if(c.messageSetting == COUNTER) {
// 推入队列
mq.putMessage(packet, false);
}
// 同步最近联系人列表
if(options.isEnableLatest())
blindHelper.updateLatest(c);
// 消息数增1,刷新界面显示
c.messageCount++;
main.getBlindHelper().refreshModel(c);
}
}
/**
* 推入一个系统消息并更新动画,这个比较简单,如果系统消息按钮没有闪烁就闪烁它
* 如果这是第一个消息,则tray icon也要闪烁,其他没什么要判断的了
*
* @param packet
* 系统通知包
*/
public void putSystemNotificationAndUpdateAnimate(SystemNotificationPacket packet) {
// 保存到聊天记录
String qq = String.valueOf(packet.from);
RecordEntry entry = new RecordEntry();
entry.type = IKeyConstants.SYSTEM;
entry.owner = 10000;
entry.sender = packet.from;
entry.senderParent = 0;
entry.receiver = main.getMyModel().qq;
entry.time = System.currentTimeMillis();
switch(packet.type) {
case QQ.QQ_SYS_BEING_ADDED:
entry.subType = IKeyConstants.SUB_BEING_ADDED;
case QQ.QQ_SYS_BEING_ADDED_EX:
entry.subType = IKeyConstants.SUB_BEING_ADDED_EX;
entry.message = NLS.bind(receive_system_message_addme, qq);
packet.message = entry.message;
break;
case QQ.QQ_SYS_ADD_FRIEND_REQUEST:
entry.subType = IKeyConstants.SUB_ADD_FRIEND_REQUEST;
case QQ.QQ_SYS_ADD_FRIEND_REQUEST_EX:
entry.subType = IKeyConstants.SUB_ADD_FRIEND_REQUEST_EX;
entry.message = NLS.bind(receive_system_message_request, qq, packet.message);
packet.message = entry.message;
break;
case QQ.QQ_SYS_ADD_FRIEND_APPROVED_AND_ADD:
entry.subType = IKeyConstants.SUB_ADD_FRIEND_APPROVED_AND_ADD;
entry.message = NLS.bind(receive_system_message_approved_and_add, qq);
packet.message = entry.message;
break;
case QQ.QQ_SYS_ADD_FRIEND_APPROVED:
entry.subType = IKeyConstants.SUB_ADD_FRIEND_APPROVED;
entry.message = NLS.bind(receive_system_message_approved, qq);
packet.message = entry.message;
break;
case QQ.QQ_SYS_ADD_FRIEND_REJECTED:
entry.subType = IKeyConstants.SUB_ADD_FRIEND_REJECTED;
entry.message = NLS.bind(receive_system_message_rejected, qq, packet.message);
packet.message = entry.message;
break;
default:
entry.subType = IKeyConstants.SUB_UNKNOWN;
entry.message = "";
packet.message = entry.message;
break;
}
// 保存记录
main.getRecordManager().addRecord(entry);
// 调整动画状态
if(!main.getMessageQueue().hasNext())
main.getUIHelper().startBlinkImage(res.getImage(Resources.icoSysMsg));
if(!main.getMessageQueue().hasSystemMessage())
main.getUIHelper().startBlinkSystemMessageIcon();
main.getMessageQueue().putSystemMessage(packet);
// 播放声音
main.getSounder().play(LumaQQ.SYS_MSG_SOUND);
log.debug("一个系统消息被推入队列");
}
/**
* 把对方的文件传输请求推入到发送消息窗口中
*
* @param packet
* ReceiveIMPacket对象
*/
public void putSendFileRequestIM(ReceiveIMPacket packet) {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -