📄 myqqpacket.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 + -