⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myqqpacket.h

📁 如果应用程序在共享 DLL 中使用 MFC
💻 H
字号:
#include "../MicroQQ/qqlib/QQDefine.h"

CNoOpenQQGui *m_lpNoOpenQQGui;

static void CQQClient_GetLevel(CQQClientBase *This){
	CQQPacketBase *lpPacket=(*m_lpQQPlugin->lpNewQQPacket)();
	lpPacket->Write_Byte(0x02);
	lpPacket->Write_DWord(This->m_QQ);
	CQQPacketBase *lpPushPacket=(*m_lpQQPlugin->lpNewQQPacket)();
	lpPushPacket->MakeCmdPacket(This,QQ_CMD_FRIEND_LEVEL_OP,lpPacket->GetBuffer(),lpPacket->Size());
	This->PushPacket(lpPushPacket);
	lpPacket->Delete();
}

static void UpdateQQLevelText(CQQClientBase *This){
	char buf[128];
	ltoa(This->m_lpClientDataEx->m_Level,buf,10);
	m_lpNoOpenQQGui->m_QQListView.SetColLevel(This->m_QQ,buf);
	sprintf(buf,"%d天",This->m_lpClientDataEx->m_Level_OnLineDay);
	m_lpNoOpenQQGui->m_QQListView.SetColOnline(This->m_QQ,buf);
	sprintf(buf,"%d天",This->m_lpClientDataEx->m_Level_NextLevelDay);
	m_lpNoOpenQQGui->m_QQListView.SetColSpace(This->m_QQ,buf);
}

static void CQQClient_OnGetLevel(CQQClientBase *This,CQQPacketBase *lpRecvPacket){
	CQQPacketBase *lpPacket=(*m_lpQQPlugin->lpNewQQPacket)();
	if(lpPacket->Decrypt(lpRecvPacket,This->m_KeyData)){
		if(lpPacket->Read_Byte()==0x02){
			if(lpPacket->Read_DWord()==This->m_QQ){
				lpPacket->Read_Word();//可能是在线时间吧
				This->m_lpClientDataEx->m_Level_OnLineDay=lpPacket->Read_Word();//在线天数
				This->m_lpClientDataEx->m_Level=lpPacket->Read_Word();//等级
				This->m_lpClientDataEx->m_Level_NextLevelDay=lpPacket->Read_Word();//升级剩余天数
				UpdateQQLevelText(This);
			}
		}
	}
	lpPacket->Delete();
}

static void CQQClient_OnEvent(CQQClientBase *This,DWORD Event,WPARAM wParam,LPARAM lParam){
	switch(Event){
		case QQ_CMD_LOGOUT:
			m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"[...]");
			break;
		case QQ_CMD_REQUEST_LOGIN_TOKEN:
			m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"登陆中...");
			break;
		case QQ_CMD_LOGIN:
			switch(wParam){
				case QQ_REPLY_OK:
					m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"登陆成功");
					m_lpNoOpenQQGui->OnTimer();
					CQQClient_GetLevel(This);
					break;
				case QQ_REPLY_LOGIN_PASSWORD_ERROR:
					{
						This->Logout();
						LPSTR lpText=(LPSTR)lParam;
						if(strstr(lpText,"密码")){
							m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"密码错误");
						}else if(strstr(lpText,"高峰")){
							m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"上线高峰");
						}else{
							m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"其它错误");
						}
					}
					break;
			}
			break;
	}
}

static BOOL (*m_lpOldOnRecvCmd)(CQQClientBase *This,TQQPacketRecvHead *lpRecvHead,CQQPacketBase *lpRecvPacket)=NULL;

static BOOL CQQClient_OnRecvCmd(CQQClientBase *This,TQQPacketRecvHead *lpRecvHead,CQQPacketBase *lpRecvPacket){
	switch(lpRecvHead->m_Cmd){
		case QQ_CMD_FRIEND_LEVEL_OP:CQQClient_OnGetLevel(This,lpRecvPacket);break;
		case QQ_CMD_CHANGE_STATUS:
			{
				char buf[32];
				strcpy(buf,This->m_Status==QQ_STATUS_ONLINE?"[在线]":
						(This->m_Status==QQ_STATUS_AWAY?"[离开]":"[隐身]") );
				if(This->m_UseTM)strcat(buf,"TM");
				m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,buf);
			}
			//break;//主程序需要此消息,所以不退出
		default:
			return (*m_lpOldOnRecvCmd)(This,lpRecvHead,lpRecvPacket);
	}
	return TRUE;
}

#include <time.h>
static void CQQClient_OnRecvIM2(CQQClientBase *This,CQQPacketBase *lpRecvPacket,TRecvIMHead *lpRecvIMHead){
	switch(lpRecvIMHead->m_Result){
		case 0x61://2005 B3
			lpRecvIMHead->m_Result=lpRecvPacket->Read_Word();
			lpRecvPacket->Skip(5);//2005 B3 未知
			if(lpRecvIMHead->m_Result!=QQ_RECV_IM_STRANGER &&
				lpRecvIMHead->m_Result!= QQ_RECV_IM_FRIEND)break;//普通消息
		case QQ_RECV_IM_STRANGER:
		case QQ_RECV_IM_FRIEND://普通消息
			{
				WORD sender_ver=lpRecvPacket->Read_Word();
				DWORD sender_uid=lpRecvPacket->Read_DWord();
				DWORD receiver_uid=lpRecvPacket->Read_DWord();
				lpRecvPacket->Skip(QQ_KEY_LENGTH);//session_md5
				WORD normal_im_type=lpRecvPacket->Read_Word();
				switch(normal_im_type){
					case QQ_IM_TYPE_TEXT:
					{
						WORD id=lpRecvPacket->Read_Word();
						time_t tm=lpRecvPacket->Read_DWord();
						lpRecvPacket->Read_Byte();//未知
						BYTE icon=lpRecvPacket->Read_Byte();
						lpRecvPacket->Read_DWord();//字体属性
						lpRecvPacket->Read_DWord();//分片
						BYTE replyType=lpRecvPacket->Read_Byte();//自动回复
						if(replyType==QQ_IM_AUTO_REPLY)break;
						if(This->m_lpClientDataEx->m_RetMsg[0]){
							CQQPacketBase *lpPacket=This->GetSendIMMsgPacket(sender_uid,This->m_lpClientDataEx->m_RetMsg,"宋体",rand()/*0x0000FF*/,0x9,QQ_IM_AUTO_REPLY);
							This->PushPacket(lpPacket);
						}
						char buf[1024];
						if(This->m_lpClientDataEx->m_OtherQQ>10000){
							_snprintf(buf,sizeof(buf),
								"%s\r\n"
								"-----------------------------------------\r\n"
								"发送者:%d       转发者:%d",
								lpRecvPacket->GetCurrentBuffer(),
								sender_uid,This->m_QQ);
							CQQPacketBase *lpPacket=This->GetSendIMMsgPacket(This->m_lpClientDataEx->m_OtherQQ,buf,"宋体",0xDC7C44,0x9,QQ_IM_AUTO_REPLY);
							This->PushPacket(lpPacket);
						}
					}
					break;
				}
			}
			break;
		case QQ_RECV_IM_SYS_MESSAGE:
			if(lpRecvPacket->Read_Byte()==QQ_RECV_IM_KICK_OUT){//我被踢出
				if(lpRecvPacket->Read_Byte()==0x33){
					if(This->m_lpClientDataEx->m_AutoOff){
						This->Logout();
						m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"别处上线");
					}else{
						m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"抢线中...");
					}
				}else{
					m_lpNoOpenQQGui->m_QQListView.SetColStatus(This->m_QQ,"未知/重登陆中..");
					This->m_KeepAliveFail=10;
				}
			}
			break;
	}
}

void AttachQQClient(CQQClientBase *lpClient){
	lpClient->ReAllocDataEx(sizeof(TQQClientDataEx));
	memset(lpClient->m_lpClientDataEx,0,sizeof(TQQClientDataEx));
	if(m_lpOldOnRecvCmd==0)m_lpOldOnRecvCmd=lpClient->m_lpOnRecvCmd;
	lpClient->m_lpOnRecvCmd=CQQClient_OnRecvCmd;
	lpClient->m_lpOnRecvIM2=CQQClient_OnRecvIM2;
	lpClient->m_lpOnEvent=CQQClient_OnEvent;

	CQQClient_OnEvent(lpClient,QQ_CMD_LOGOUT,0,0);
}


void CQQConfig_OnLoadAddQQClient(CQQConfigBase *This,IXMLDOMElement *lpElement){
	CQQClientBase *lpQQClient=(*m_lpQQPlugin->lpNewQQClient)(m_lpNoOpenQQGui->m_lpQQGuiWnd);
	(*This->m_lpOnLoadQQClient)(lpQQClient,lpElement);
	m_lpNoOpenQQGui->m_QQListView.AddQQ(lpQQClient);
	AttachQQClient(lpQQClient);
	CKVariant Var;
						lpElement->getAttribute(L"自动登陆",Var);
	lpQQClient->m_lpClientDataEx->m_AutoLogin=(long)Var;
						lpElement->getAttribute(L"自动下线",Var);
	lpQQClient->m_lpClientDataEx->m_AutoOff=(long)Var;
						lpElement->getAttribute(L"转发QQ",Var);
	lpQQClient->m_lpClientDataEx->m_OtherQQ=(long)Var;
						lpElement->getAttribute(L"保存消息",Var);
	lpQQClient->m_lpClientDataEx->m_SaveMsg=(long)Var;
						lpElement->getAttribute(L"等级",Var);
	lpQQClient->m_lpClientDataEx->m_Level=(WORD)(long)Var;
						lpElement->getAttribute(L"在线天数",Var);
	lpQQClient->m_lpClientDataEx->m_Level_OnLineDay=(WORD)(long)Var;
						lpElement->getAttribute(L"升级天数",Var);
	lpQQClient->m_lpClientDataEx->m_Level_NextLevelDay=(WORD)(long)Var;
						lpElement->getAttribute(L"自动回复",Var);
	#define RETMSGLEN	(sizeof(lpQQClient->m_lpClientDataEx->m_RetMsg))
	char RetMsg[RETMSGLEN];
	KenComStr::BSTRToAnsi(Var,RetMsg,RETMSGLEN);
	for(int i=0,j=0;RetMsg[i] && j<(RETMSGLEN-1);i++){
		if(RetMsg[i]==0x0A)
			lpQQClient->m_lpClientDataEx->m_RetMsg[j++]=0x0D;
		lpQQClient->m_lpClientDataEx->m_RetMsg[j++]=RetMsg[i];
	}
	lpQQClient->m_lpClientDataEx->m_RetMsg[j]=0;
	if(lpQQClient->m_lpClientDataEx->m_AutoLogin)lpQQClient->Login();
	if(lpQQClient->m_lpClientDataEx->m_Level_NextLevelDay)
		UpdateQQLevelText(lpQQClient);
}

void (*m_lpOldOnSaveQQClient)(CQQClientBase *lpQQClientBase,IXMLDOMElement *lpElement)=0;

void CQQConfig_OnSaveQQClient(CQQClientBase *lpQQClientBase,IXMLDOMElement *lpElement){
	(*m_lpOldOnSaveQQClient)(lpQQClientBase,lpElement);
	::tagVARIANT Var;						V_VT(&Var)=VT_I4;
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_AutoLogin;
						lpElement->setAttribute(L"自动登陆",Var);
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_AutoOff;
						lpElement->setAttribute(L"自动下线",Var);
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_OtherQQ;
						lpElement->setAttribute(L"转发QQ",Var);
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_SaveMsg;
						lpElement->setAttribute(L"保存消息",Var);
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_Level;
						lpElement->setAttribute(L"等级",Var);
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_Level_OnLineDay;
						lpElement->setAttribute(L"在线天数",Var);
	V_I4(&Var)=lpQQClientBase->m_lpClientDataEx->m_Level_NextLevelDay;
						lpElement->setAttribute(L"升级天数",Var);
						lpElement->setAttribute(L"自动回复",CKVariant(lpQQClientBase->m_lpClientDataEx->m_RetMsg));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -