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

📄 chatroom.cpp

📁 网络游戏魔域源代码 测试可以完整变异
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -