📄 chatroom.cpp
字号:
// ChatRoom.cpp: implementation of the CChatRoom class.
//
//////////////////////////////////////////////////////////////////////
//Create By: Wen Yiku
//Create Date: 2005-6-29
#include "ChatRoom.h"
#include "GameMsg.h"
#include <time.h>
CChatRoom g_obj91Sdk;
uint32 OnEventNotifyCB( uint32 dwMsgID, uint32 wParam, uint32 lParam );
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CChatRoom::CChatRoom()
{
strcpy(m_strAccount ,"100215");
strcpy(m_strPasswd ,"1");
strcpy(m_strGameCode , "3");
m_dwGroupID = 0;
m_dwAttrib = 0;
strcpy(m_strValue , "");
strcpy(m_strGroupDomain ,"");
m_dwUin = 0;
strcpy(m_strMsg ,"");
m_curGroup = NULL;
Init();
}
CChatRoom::~CChatRoom()
{
DeInit();
}
void CChatRoom::Login()
{
#ifdef _DEBUG
char strTemp[256];
sprintf(strTemp,"Login Time :%u", ::timeGetTime());
::OutputDebugString(strTemp);
#endif
im_Login( m_strAccount, m_strGameCode, m_strPasswd, "", FALSE );
}
void CChatRoom::Logout()
{
im_Logout();
}
void CChatRoom::Init()
{
im_Init( OnEventNotifyCB );
}
void CChatRoom::Reset()
{
strcpy(m_strAccount ,"100215");
strcpy(m_strPasswd ,"1");
strcpy(m_strGameCode , "3");
m_dwGroupID = 0;
m_dwAttrib = 0;
strcpy(m_strValue , "");
strcpy(m_strGroupDomain ,"");
m_dwUin = 0;
strcpy(m_strMsg ,"");
m_curGroup = NULL;
Init();
}
uint32 OnEventNotifyCB( uint32 dwMsgID, uint32 wParam, uint32 lParam )
{
switch( dwMsgID )
{
case EV_QUITGROUP://当前用户被强制退出群(wParam = IGroupInfo*)
{
g_obj91Sdk.Reset();
::Post91UCmd(CMD_91U_KICKOUT);
}
break;
case EV_GROUPMEMBERENTRY://群成员进入(wParam = IGroupInfo*, lParam = IGroupMember*)
{
g_obj91Sdk.AddRoomMember((IGroupInfo*)wParam,(IGroupMember*)lParam);
::Post91UCmd(CMD_91U_MEMBERIN);
}
break;
case EV_GROUPMEMBERKICK:////群成员踢出(wParam = IGroupInfo*, lParam = IGroupMember*)
{
g_obj91Sdk.DelRoomMember((IGroupInfo*)wParam,(IGroupMember*)lParam);
::Post91UCmd(CMD_91U_MEMBERKICKOUT);
}
break;
case EV_GROUPMEMBERLEAVE://群成员退出(wParam = IGroupInfo*, lParam = IGroupMember*)
{
g_obj91Sdk.DelRoomMember((IGroupInfo*)wParam,(IGroupMember*)lParam);
::Post91UCmd(CMD_91U_MEMBEROUT);
}
break;
case EV_GROUPENTRYSELF://自己进入群(wParam = IGroupInfo*)
{
}
break;
case EV_RECVGROUPMSG://接收群消息(wParam = IMsgPacket*)
case EV_RECVGROUPA2AMSG://接收群私聊消息(wParam = IMsgBody*)
case EV_RECVGSYSMSG://接收系统消息消息(wParam = IMsgBody*)
{
IMsgPacket* pIMsgPacket = (IMsgPacket*)wParam;
UDATATYPE DataType;
pIMsgPacket->Get( "dwGroupID", &DataType );
uint32 dwGroupID = DataType.dwVal;
pIMsgPacket->Get( _T("dwFriendUin"), &DataType );
uint32 dwFrdUin = DataType.dwVal;
string strNick;
char strTemp[256];
sprintf(strTemp,"%lu",dwFrdUin);
strNick=strTemp;
IGroupInfo* pGroupInfo = im_GetGroupInfo( dwGroupID );
if( pGroupInfo )
{
IGroupMember* pGroupMember = pGroupInfo->MemberFind( dwFrdUin );
if( pGroupMember )
{
strNick = pGroupMember->GetString( _T("szNick"));
}
}
pIMsgPacket->Get(_T("dwWhen"), &DataType );
time_t long_time = DataType.dwVal;
struct tm *newtime;
newtime = localtime( &long_time );
TCHAR szTime[50];
memset( szTime, 0, sizeof( szTime ) );
_tcsftime( szTime, sizeof( szTime ), _T("%H:%M:%S"), newtime);
//nick+time
//std::string strText;
std::string strText;
sprintf( strTemp ,"%s (%s):\n",strNick,szTime);
strText=strTemp;
string strTxt;
strTxt += pIMsgPacket->GetText();
strText += strTxt.c_str();
// m_strMsg = strText; //wyk
// g_obj91Sdk.SetMsg((char*)strText.c_str());
// g_obj91Sdk->m_strMsg=strText;
//wyk pMy91uSdkTest->m_strMsg = strText;
//wyk pMy91uSdkTest->UpdateData( FALSE );
g_objGameMsg.AddMsg(strText.c_str());
//销毁
pIMsgPacket->Destroy();
}
break;
case EV_MODIFYGROUPREGINFO://修改群信息(wParam = IGroupInfo*, lParam = enum CHATRM_ATTR)
{
IGroupInfo* pGroupInfo = (IGroupInfo*)wParam;
if( pGroupInfo == NULL ) return 0;
uint32 dwType = lParam;
char strTemp[256];
switch( dwType )
{
case CHATRM_NAME:////名称
::Post91UCmd(CMD_91U_MODIFYROOMNAME);
sprintf(strTemp, "聊天室更名为[%s]", pGroupInfo->GetLong("szGroupName"));
break;
case CHATRM_BULLETIN://改公告
::Post91UCmd(CMD_91U_MODIFYROOMBULLETIN);
sprintf(strTemp ,"聊天室公告为[%s]", pGroupInfo->GetLong("szGroupBulletin"));
break;
case CHATRM_SYNOPSIS://群简介
::Post91UCmd(CMD_91U_MODIFYROOMSYNOPSIS);
sprintf(strTemp ,"聊天室简介为[%s]", pGroupInfo->GetLong("szGroupSynopsis"));
break;
default:
return 0;
}
MessageBox(NULL,strTemp,"test",MB_OK );
}
break;
case EV_SEARCHGROUP://查找群(wParam = GroupSummary[],lParam=个数)
{
int iCount = lParam;
CGroupSummary* pGroupSummary = (CGroupSummary*)wParam;
g_obj91Sdk.SetRoomListInfo(pGroupSummary,iCount);
::Post91UCmd(CMD_91U_SEARCHROOMBACK);
}
break;
case EV_LOGIN://用户是否登录成功 (wParam:0 成功 其他值:不成功)
switch( wParam )
{
case EVENTMSG_LOGINSUCCESS:
#ifdef _DEBUG
char strTemp[256];
sprintf(strTemp,"Login Suc Time :%u", ::timeGetTime());
::OutputDebugString(strTemp);
MessageBox(NULL,"登陆成功!","test",MB_OK );
#endif
::Post91UCmd(CMD_91U_LOGIN);
g_obj91Sdk.GetRoomList();
break;
case EVENTMSG_EXIST_UIN://Uin在别处登录了
::Post91UCmd(CMD_91U_EXIST_UIN);
// MessageBox(NULL,"Uin在别处登录了!","test",MB_OK );
break;
case EVENTMSG_LOGINFAILURE://登录失败
::Post91UCmd(CMD_91U_LOGINFAILED);
MessageBox(NULL,"登录失败!","test",MB_OK );
break;
case EVENTMSG_STATUS_CHANGED://在线状态改变了
::Post91UCmd(CMD_91U_STATUSCHANGED);
MessageBox(NULL,"在线状态改变了!","test",MB_OK );
break;
case EVENTMSG_ABNORMAL_OFFLINE://不正常掉线了
::Post91UCmd(CMD_91U_OFFLINEERROR);
MessageBox(NULL,"不正常掉线了!","test",MB_OK );
break;
case EVENTMSG_OFFLINE://正常下线了
::Post91UCmd(CMD_91U_OFFLINE);
MessageBox(NULL,"正常下线!","test",MB_OK );
break;
}
break;
case EV_STATUS_CHANGE://用户状态的变化通知 例如:网络通,未收到KEEPLIVE等。WParam表示当前的状态。如果属于掉线等情况,客户需要重新调用登录接口。该状态另行定义。
break;
case EV_GETGROUPINFO://从服务端取群信息(wParam = IGroupInfo*)
{
IGroupInfo* pGroupInfo = (IGroupInfo*)wParam;
if (pGroupInfo != NULL)
{
g_obj91Sdk.SetCurRoomInfo(pGroupInfo);
::Post91UCmd(CMD_91U_GETROOMINFOBACK);
}
else
return 0;
}
break;
case EV_SERVERREPLY://成员进入群是否成功
{
CGroupServerReply* pGroupServerReply = (CGroupServerReply*)lParam;
if( pGroupServerReply->wAttr != 2 ) return 0;//不是聊天室
if( wParam == TRUE )
{
g_obj91Sdk.m_dwGroupID = pGroupServerReply->dwGroupID;
g_obj91Sdk.GetRoomInfo();
::Post91UCmd(CMD_91U_ENTERROOMOK);
MessageBox(NULL,"进入群成功!","test",MB_OK );
return 0;
}
switch( pGroupServerReply->dwResult )
{
case 0x0021:
::Post91UCmd(CMD_91U_ROOMOUTAMOUNT);
MessageBox(NULL,"超出群允许的最大成员数!","test",MB_OK );
break;
case 0x0022:
::Post91UCmd(CMD_91U_HASENTERED);
MessageBox(NULL,"该成员已经在群的列表之中","test",MB_OK );
break;
case 0x0023:
::Post91UCmd(CMD_91U_NOTALLOW);
MessageBox(NULL,"不允许添加群管理员到群中","test",MB_OK );
break;
case 0x0024:
::Post91UCmd(CMD_91U_ENTEROUTTIME);
MessageBox(NULL,"网络超时","test",MB_OK );
break;
case 0x0020:
default:
::Post91UCmd(CMD_91U_ENTERFAILED);
MessageBox(NULL,"进入群失败","test",MB_OK );
break;
}
}
break;
case EV_GROUPMEMBERSTATUSMODIFY://成员状态改变(wParam = IGroupInfo*, lParam = IGroupMember*)
{
IGroupMember* pGroupMember = (IGroupMember*)lParam;
if( pGroupMember == NULL ) return 0;
if( pGroupMember->GetLong( "dwStatus") == STATUS_OFFLINE )
{
char str[256];
sprintf(str, "[%s]掉线了", pGroupMember->GetString( "szNick") );
MessageBox(NULL,str,"test",MB_OK );
::Post91UCmd(CMD_91U_MEMBEROFFLINE);
}
else{
char str[256];
sprintf(str, "[%s]在线了", pGroupMember->GetString( "szNick") );
MessageBox(NULL,str,"test",MB_OK );
::Post91UCmd(CMD_91U_MEMBERONLINE);
}
}
break;
case EV_CHANGEGROUPMANAGER://改变群管理员(wParam = IGroupInfo*)
{
IGroupInfo* pGroupInfo = (IGroupInfo*)wParam;
if( pGroupInfo == NULL ) return 0;
CGroupServerReply* pGroupServerReply = (CGroupServerReply*)lParam;
if( pGroupServerReply == NULL ) return 0;
g_obj91Sdk.SetCurRoomInfo(pGroupInfo);
char str[256];
uint32 dwManager = pGroupInfo->GetLong("dwCreator");
IGroupMember* pSrcMember = pGroupInfo->MemberFind( pGroupServerReply->dwUin );
IGroupMember* pDstMember = pGroupInfo->MemberFind( pGroupServerReply->dwDstUin );
::Post91UCmd(CMD_91U_CHANGEGROUPMANAGER);
char strSrc[256], strDst[256];
switch( pGroupServerReply->dwResult )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -