package com.wyp.materialqqlite.qqclient.task; import java.util.ArrayList; import org.apache.http.client.HttpClient; import com.wyp.materialqqlite.Utils; import com.wyp.materialqqlite.qqclient.QQUtils; import com.wyp.materialqqlite.qqclient.protocol.QQProtocol; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyInfo; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.BuddyMessage; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.Content; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.ContentType; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GetC2CMsgSigResult; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GetGroupFaceSigResult; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GroupInfo; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.GroupMessage; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.QQCallBackMsg; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.QQMsgType; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.SendBuddyMsgResult; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.SendGroupMsgResult; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.SendSessMsgResult; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.SessMessage; import com.wyp.materialqqlite.qqclient.protocol.protocoldata.UploadCustomFaceResult; public class SendMsgTask extends HttpTask { public QQMsgType m_nMsgType; public Object m_objMsg; public int m_nGroupNum; public int m_nQQNum; public String m_strNickName; public String m_strGroupSig; private static int m_nMsgId = 1100001; private static String m_strGFaceKey; private static String m_strGFaceSig; public SendMsgTask(String strTaskName, HttpClient httpClient) { super(strTaskName, httpClient); // TODO Auto-generated constructor stub } public boolean addBuddyMsg(int nToUin, int nTime, String strMsg) { if (0 == nToUin || Utils.isEmptyStr(strMsg)) return false; BuddyMessage buddyMsg = new BuddyMessage(); m_nMsgId++; buddyMsg.m_nMsgId = m_nMsgId; buddyMsg.m_nTime = nTime; buddyMsg.m_nToUin = nToUin; QQUtils.createMsgContent(strMsg, buddyMsg.m_arrContent); m_objMsg = buddyMsg; if (m_QQUser != null) // 使用到未加锁的主线程数据,不要在主线程之外的线程调用此函数 { BuddyInfo buddyInfo = m_QQUser.m_BuddyList.getBuddy(nToUin); if (buddyInfo != null) m_nQQNum = buddyInfo.m_nQQNum; m_strNickName = m_QQUser.m_UserInfo.m_strNickName; } return true; } public boolean addGroupMsg(int nGroupId, int nTime, String strMsg) { if (0 == nGroupId || Utils.isEmptyStr(strMsg)) return false; GroupMessage groupMsg = new GroupMessage(); m_nMsgId++; groupMsg.m_nMsgId = m_nMsgId; groupMsg.m_nTime = nTime; groupMsg.m_nToUin = nGroupId; if (m_QQUser != null) groupMsg.m_nGroupCode = m_QQUser.m_GroupList.getGroupCodeById(nGroupId); QQUtils.createMsgContent(strMsg, groupMsg.m_arrContent); m_objMsg = groupMsg; if (m_QQUser != null) // 使用到未加锁的主线程数据,不要在主线程之外的线程调用此函数 { GroupInfo groupInfo = m_QQUser.m_GroupList.getGroupById(nGroupId); if (groupInfo != null) { m_nGroupNum = groupInfo.m_nGroupNumber; m_nQQNum = m_QQUser.m_nQQUin; BuddyInfo buddyInfo = groupInfo.getMemberByUin(m_QQUser.m_nQQUin); if (buddyInfo != null) { if (!Utils.isEmptyStr(buddyInfo.m_strGroupCard)) m_strNickName = buddyInfo.m_strGroupCard; else m_strNickName = buddyInfo.m_strNickName; } } } return true; } public boolean addSessMsg(int nGroupId, int nToUin, int nTime, String strMsg) { if (0 == nGroupId || 0 == nToUin || Utils.isEmptyStr(strMsg)) return false; SessMessage sessMsg = new SessMessage(); m_nMsgId++; sessMsg.m_nMsgId = m_nMsgId; sessMsg.m_nTime = nTime; sessMsg.m_nToUin = nToUin; sessMsg.m_nGroupId = nGroupId; QQUtils.createMsgContent(strMsg, sessMsg.m_arrContent); m_objMsg = sessMsg; if (m_QQUser != null) // 使用到未加锁的主线程数据,不要在主线程之外的线程调用此函数 { m_strNickName = m_QQUser.m_UserInfo.m_strNickName; BuddyInfo buddyInfo = m_QQUser.m_GroupList.getGroupMemberById(nGroupId, nToUin); if (buddyInfo != null) { m_nQQNum = buddyInfo.m_nQQNum; m_strGroupSig = buddyInfo.m_strGroupSig; } } return true; } // 上传自定义表情 private boolean uploadCustomFace(String strFileName, UploadCustomFaceResult result) { boolean bRet = QQProtocol.uploadCustomFace(m_httpClient, strFileName, m_QQUser.m_LoginResult2.m_strVfWebQq, result); if (!bRet || (result.m_nRetCode != 0 && result.m_nRetCode != 4)) return false; return true; } // 发送好友消息 private boolean sendBuddyMsg() { if (null == m_objMsg) return false; BuddyMessage msg = (BuddyMessage)m_objMsg; ArrayList<Content> arrContent = msg.m_arrContent; UploadCustomFaceResult uploadCFaceResult = new UploadCustomFaceResult(); SendBuddyMsgResult sendMsgResult = new SendBuddyMsgResult(); int nRetry = 3; // 重试次数 boolean bRet = false; for (int i = 0; i < arrContent.size(); i++) // 上传自定义表情 { Content content = arrContent.get(i); if (content != null && ContentType.CONTENT_TYPE_CUSTOM_FACE == content.m_nType) { for (int j = 0; j < nRetry; j++) { bRet = uploadCustomFace(content.m_CFaceInfo.m_strName, uploadCFaceResult); if (bRet) // 上传成功 break; } if (!bRet) return false; content.m_CFaceInfo.m_strRemoteFileName = uploadCFaceResult.m_strRemoteFileName; } } bRet = QQProtocol.sendBuddyMsg(m_httpClient, msg, QQProtocol.WEBQQ_CLIENT_ID, m_QQUser.m_LoginResult2.m_strPSessionId, sendMsgResult); if (!bRet || (sendMsgResult.m_nRetCode != 0)) return false; QQUtils.writeBuddyMsgLog(m_QQUser, m_nQQNum, m_strNickName, true, msg); return true; } // 发送群消息 private boolean sendGroupMsg() { if (null == m_objMsg) return false; GroupMessage msg = (GroupMessage)m_objMsg; ArrayList<Content> arrContent = msg.m_arrContent; UploadCustomFaceResult uploadCFaceResult = new UploadCustomFaceResult(); GetGroupFaceSigResult sigResult = new GetGroupFaceSigResult(); SendGroupMsgResult sendMsgResult = new SendGroupMsgResult(); boolean bHasCustomFace = false; int nRetry = 3; // 重试次数 boolean bRet = false; for (int i = 0; i < arrContent.size(); i++) // 上传自定义表情 { Content content = arrContent.get(i); if (content != null && ContentType.CONTENT_TYPE_CUSTOM_FACE == content.m_nType) { bHasCustomFace = true; for (int j = 0; j < nRetry; j++) { bRet = uploadCustomFace(content.m_CFaceInfo.m_strName, uploadCFaceResult); if (bRet) // 上传成功 break; } if (!bRet) return false; content.m_CFaceInfo.m_strRemoteFileName = uploadCFaceResult.m_strRemoteFileName; } } if (bHasCustomFace && (Utils.isEmptyStr(m_strGFaceKey) || Utils.isEmptyStr(m_strGFaceSig))) { bRet = QQProtocol.getGroupFaceSignal(m_httpClient, QQProtocol.WEBQQ_CLIENT_ID, m_QQUser.m_LoginResult2.m_strPSessionId, sigResult); if (!bRet || (sigResult.m_nRetCode != 0)) return false; m_strGFaceKey = sigResult.m_strGFaceKey; m_strGFaceSig = sigResult.m_strGFaceSig; } bRet = QQProtocol.sendGroupMsg(m_httpClient, msg, QQProtocol.WEBQQ_CLIENT_ID, m_QQUser.m_LoginResult2.m_strPSessionId, m_strGFaceKey, m_strGFaceSig, sendMsgResult); if (!bRet || (sendMsgResult.m_nRetCode != 0)) return false; QQUtils.writeGroupMsgLog(m_QQUser, m_nGroupNum, m_nQQNum, m_strNickName, msg); return true; } // 发送群成员消息 private boolean sendSessMsg() { if (null == m_objMsg) return false; SessMessage msg = (SessMessage)m_objMsg; SendSessMsgResult sendMsgResult = new SendSessMsgResult(); boolean bRet = false; if (Utils.isEmptyStr(m_strGroupSig)) { GetC2CMsgSigResult getC2CMsgSigResult = new GetC2CMsgSigResult(); bRet = QQProtocol.getC2CMsgSignal(m_httpClient, msg.m_nGroupId, msg.m_nToUin, QQProtocol.WEBQQ_CLIENT_ID, m_QQUser.m_LoginResult2.m_strPSessionId, getC2CMsgSigResult); if (!bRet || getC2CMsgSigResult.m_nRetCode != 0) { getC2CMsgSigResult = null; return false; } m_strGroupSig = getC2CMsgSigResult.m_strValue; getC2CMsgSigResult.m_nGroupId = msg.m_nGroupId; getC2CMsgSigResult.m_nQQUin = msg.m_nToUin; sendMessage(QQCallBackMsg.UPDATE_C2CMSGSIG, 0, 0, getC2CMsgSigResult); } bRet = QQProtocol.sendSessMsg(m_httpClient, msg, m_strGroupSig, QQProtocol.WEBQQ_CLIENT_ID, m_QQUser.m_LoginResult2.m_strPSessionId, sendMsgResult); if (!bRet || (sendMsgResult.m_nRetCode != 0)) return false; QQUtils.writeSessMsgLog(m_QQUser, m_nQQNum, m_strNickName, true, msg); return true; } @Override public void doTask() { if (null == m_httpClient || null == m_QQUser) { return; } try { if (QQMsgType.QQ_MSG_TYPE_BUDDY == m_nMsgType) { sendBuddyMsg(); } else if (QQMsgType.QQ_MSG_TYPE_GROUP == m_nMsgType) { sendGroupMsg(); } else if (QQMsgType.QQ_MSG_TYPE_SESS == m_nMsgType) { sendSessMsg(); } } catch (Exception e) { e.printStackTrace(); } finally { } } }