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

📄 chatdll.cpp

📁 聊天代码! 视频
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			strBody += str;
		}
	}
	if(strBody.Right(1) == ",")
		strBody.Delete( strBody.GetLength() - 1 );
	str = strBody + ");";
	ReadFromFile( GetINIKeyValue( "ChatServer.ini", "Server", "WWWDir", "" ) + "\\OnlineUsers.html", strBody );
	if( !strBody.IsEmpty() ){
		strBody.Replace("<%=RoomName%>", RoomInfo->strRoomName);
		strBody.Replace("<%=UserList%>", str);
	}
}
//---------------------------------------------------------------------------
//以上是内部调用的函数
//---------------------------------------------------------------------------
//以下是扩展DLL程序
//---------------------------------------------------------------------------
//功能描述: 用户登录
//参数说明:*Query	为浏览器URL的 ? 后面内容串
//			*Post	为浏览器表单提交的内容串
//			UserInfo[]	为聊天室所有人员的数据
//			nMaxUser	为聊天室最大的人数
//			RoomInfo	为聊天室信息
//返 回 值: -1 登录失败, 1 - (MaxUser-1) 登录成功, -2 内部错误, -3 等级不够, MaxUser 人满
int UserLogin(CString *Query, CString *Post, ChatUserInfoTag *UserInfo, int nMaxUser, ChatRoomInfoTag *RoomInfo)
{
	int nPos = 0;
	unsigned long nID;
	int nSex;
	CString strCmd, strPasswd;
	CDatabase db;
	CDBVariant NV;
	CRecordset rs(&db);
	try{
		if(db.OpenEx( strDatabase )){
			strCmd = *Post;
			strPasswd = Decode( GetValue( strCmd, "Pwd" ));
			nID = atol( Decode( GetValue( strCmd, "ID") ));
			strCmd.Format("select basic_tbl.nick, basic_tbl.pic, basic_tbl.gender, basic_tbl.province, basic_tbl.city, basic_tbl.jifen, ext_tbl.intro from basic_tbl,ext_tbl where basic_tbl.uin=%lu and basic_tbl.passwd=password('%s') and basic_tbl.uin=ext_tbl.uin", nID, strPasswd);
			rs.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd);
			if(!rs.IsEOF()){
				CString str, strID;
				str = RoomInfo->strAdminList;
				strID.Format("|%lu|", nID);
				rs.GetFieldValue("jifen", NV);	//积分
				long nCredit = NV.m_lVal;
				if( nCredit / 10000 < RoomInfo->nLevel && str.Find(strID) == -1 )
					nPos = -3;
				else{
					for( nPos = 0; nPos < nMaxUser; nPos ++ ){
						if(UserInfo[nPos].nID == nID)
							break;
					}
					if( nPos == nMaxUser ){	//没有登录过
						for( nPos = 0; nPos < nMaxUser; nPos ++ )
							if(UserInfo[nPos].nID == 0)	//空位置
								break;
					}
					if( nPos < nMaxUser ){
						UserInfo[nPos].bHidden = false;
						UserInfo[nPos].bSendLoginMsg = false;
						rs.GetFieldValue("pic", NV);	//头像
						UserInfo[nPos].nIcon = NV.m_chVal + 1;
//						rs.GetFieldValue("jifen", NV);	//积分
						UserInfo[nPos].nCredit = nCredit;
						UserInfo[nPos].nLoginTime = time(NULL);
						UserInfo[nPos].nEndTime = time(NULL) + 100;	//断开时间
						UserInfo[nPos].nID = nID;	//ID号
						nCredit = nCredit / 10000;	//等级
						if(nCredit > 15)	nCredit = 15;
						UserInfo[nPos].nLevel = nCredit;
						rs.GetFieldValue("gender", NV);	//性别
						nSex = NV.m_chVal;
						if( nSex > 2 )	nSex = 2;
						if( nSex < 0 )	nSex = 0;
						UserInfo[nPos].nSex = nSex;
						UserInfo[nPos].Socket = NULL;	//SOCKET
						//密码
						strcpy(UserInfo[nPos].strPasswd, strPasswd);
						//随机数
//						strcpy(UserInfo[nPos].strRnd, strPasswd);
						srand( (unsigned)time( NULL ) );
						sprintf(UserInfo[nPos].strRnd, "%lu", (rand() << 15) | (rand() & 0x7fff));
						//状态
						strcpy(UserInfo[nPos].strState, "0");
						//昵称
						rs.GetFieldValue("nick", strCmd);
						//判断是否有重名的玩家(其他无复名的数据库可以不用)
						UserInfo[nPos].strNick[0] = 0;
						int ndx;
						for(ndx = 0; ndx < nMaxUser; ndx ++)
							if( strcmp(UserInfo[ndx].strNick, strCmd) == 0 )
								break;
						strcpy(UserInfo[nPos].strNick, strCmd);
						if( ndx < nMaxUser )
							sprintf(UserInfo[nPos].strUserName, "%s(%d)", strCmd, nPos + 1);
						else
							strcpy(UserInfo[nPos].strUserName, strCmd);
						//来自
						rs.GetFieldValue("province", strCmd);
						strcpy(UserInfo[nPos].strFrom, strCmd);
						rs.GetFieldValue("city", strCmd);
						strcat(UserInfo[nPos].strFrom, strCmd);
						//介绍
						rs.GetFieldValue("intro", strCmd);
						if(strCmd.GetLength() > 250)
							strCmd = strCmd.Left(250);
						strcpy(UserInfo[nPos].strResume, strCmd);
						RoomInfo->nUserCount ++;
						strCmd.Format( "update basic_tbl set chat=%s where uin=%lu", UserInfo[nPos].strRnd, nID );
						db.ExecuteSQL( strCmd );
					}
				}
			}else
				nPos = -1;
			rs.Close();
			db.Close();
		}
	}catch(...){
		nPos = -2;
	}
	return nPos;
}
//---------------------------------------------------------------------------
//功能描述: 用户离线
//参数说明:nPos	玩家在数据中的位置
//			UserInfo[]	聊天室在线人员数据
//			nMaxUser	聊天室最大在线人数
//			RoomInfo	聊天室信息
//返 回 值: -1 失败, 1 成功, 0 内部错误
int UserLogout(int nPos, ChatUserInfoTag *UserInfo, int nMaxUser, ChatRoomInfoTag *RoomInfo)
{
	SavePoint(UserInfo[nPos], true);
	RoomInfo->nUserCount --;
	return 1;
}
//---------------------------------------------------------------------------
//功能描述: 处理用户的扩展XSP
//参数说明: bPost	为 true 时代表 POST 方法, 如果是 false 时代表 GET 方法
//			*Cmd	为 URL 中的文件名内容
//			*Query	为 URL 中的? 后面的内容
//			*Post	为 表单提交的内容
//			UserInfo[]	为聊天室中所有用户的信息
//			nMaxUser	为聊天室最大的人数
//			RoomInfo	聊天室信息
//返 回 值:除了 HTTP 头信息外的所有 HTML 内容
char* UserTransXsp(bool bPost, CString *Cmd, CString *Query, CString *Post, ChatUserInfoTag *UserInfo, int nMaxUser, ChatRoomInfoTag *RoomInfo)
{
	CString strBody;
//	strcpy(UserInfo[0].strUserName, "Hello");
//	strBody = UserInfo[0].strUserName;
//	MessageBox(NULL, strBody, "OK", 64);
	if( *Cmd == "onlineusers.xsp" ){	//在线用户列表
		OnlineUsers(UserInfo, nMaxUser, RoomInfo, strBody);
	}else
		strBody = "<html><body>Hello, CGI.</body></html>";
	return strBody.GetBuffer(0);
}
//---------------------------------------------------------------------------
//功能描述: 处理用户聊天室扩展
//参数说明: nPos	为发言用户在 UserInfo[] 中的成员号
//			*A		为聊天室命令
//			*B, *C	为命令参数
//			*D		为命令对象
//			*nSendType	为发送返回内容的类型,0为对自己(默认),1为两人,2为所有人,3为所有室
//			UserInfo[]	为聊天室人员的数据
//			nMaxUser	为聊天室的最大人数
//			*PowerAdminList	为聊天站高级管理员ID列表
//			RoomInfo	为本室的一些数据
//返 回 值:返回一个聊天脚本内容
char* ChatExt(int nPos, CString *A, CString *B, CString *C, CString *D, int *nSendType, ChatUserInfoTag *UserInfo, int nMaxUser, CString *PowerAdminList, ChatRoomInfoTag *RoomInfo)
{
	CString strResult;
	//用户查看状态
	if(*A == "zt" || *A == "state" || *A == "状态"){
		strResult = "<script>parent.wb1('" + GetState(UserInfo[nPos]) + "');</script>";
	}
	//设置状态
	else if(*A == "s" || *A == "set"){
		if(*B == "在线"){
			strcpy(UserInfo[nPos].strState, "0");
			*nSendType = 2;
			strResult.Format("<script>parent.SetUser('%s','0','%s')</script>", UserInfo[nPos].strUserName, Time(false));
		}
		else if(*B == "勿扰" || *B == "离线" || *B == "离开" || *B == "暂离"){
			strcpy(UserInfo[nPos].strState, *C);
			*nSendType = 2;
			strResult.Format("<script>parent.SetUser('%s','%s','%s')</script>", UserInfo[nPos].strUserName, *C, Time(false));
		}else if(*B == "显示头像"){
			UserInfo[nPos].bShowIcon = true;
			strResult = MakeSay("blue", "头像", UserInfo[nPos].strUserName, "", "", "成功地打开了头像显示。", "", "");
		}else if(*B == "关闭头像"){
			UserInfo[nPos].bShowIcon = false;
			strResult = MakeSay("blue", "头像", UserInfo[nPos].strUserName, "", "", "成功地关闭了头像显示。", "", "");
		}else{
			strResult = "头像显示:";
			if(UserInfo[nPos].bShowIcon)
				strResult += "打开";
			else
				strResult += "关闭";
			strResult += ",隐身状态:";
			if(UserInfo[nPos].bHidden)
				strResult += "隐身";
			else
				strResult += "现身";
			strResult = MakeSay("blue", "设置", UserInfo[nPos].strUserName, "", "", strResult, "", "");
		}
	}
	else if(*A == "点歌" || *A == "送礼"){
		if(*B == "")
			strResult = MakeSay("red", "提示", UserInfo[nPos].strUserName, "", "", "命令格式错,正确格式是:/点歌 {歌名} {留言} 或 /送礼 {礼名} {留言}", "", "");
		else
			strResult = MakeSay("red", "提示", UserInfo[nPos].strUserName, "", "", "该功能还未正常开放", "", "");//			p = GeLi(ID, *A, strB, strC, strD, Name, SendType);
	}
	else if(*A == "t" || *A == "特效" || *A == "effect"){
		if(*B == "" || *C == "")
			strResult = MakeSay( "red", "提示", UserInfo[nPos].strUserName, "", "", "命令格式错,正确格式是:/T {特效号} {内容}", "", "");
		else
			strResult = Effect(UserInfo[nPos].nID, UserInfo[nPos].strUserName, *B, *C, *D, nSendType, UserInfo[nPos].nLevel);
	}
	else if(*A == "save" || *A == "存点" || *A == "保存"){
		strResult = SavePoint(UserInfo[nPos], false);
	}
	//看IP
	else if(*A == "ip" || *A == "getip" || *A == "看ip"){
		int ndx = GetID(*D, UserInfo, nMaxUser);
		if(ndx < nMaxUser)
			strResult = MakeSay("Red", "看IP", UserInfo[nPos].strUserName, "", *D, GetIP(UserInfo[nPos], UserInfo[ndx]), "", "");
		else
			strResult = MakeSay("red", "提示", UserInfo[nPos].strUserName, "", *D, "%2不在线,无法取得IP地址", "", "");
	}
	//管理
	else if(*A == "mgr" || *A == "admin" || *A == "管理"){
		Manage( nPos, B, C, D, nSendType, UserInfo, nMaxUser, PowerAdminList, RoomInfo, strResult );
	}
	//包间
	else if(*A == "包间"){
		if( strlen(RoomInfo->strAdminList) < 3 ){
			HireRoom(UserInfo[nPos], RoomInfo, strResult, nSendType);
		}else
			strResult = MakeSay ("red", "提示", UserInfo[nPos].strUserName, "", "", "该室已经有管理员了,不能进行包间。", "", "");
	}
	else
		strResult = MakeSay( "red", "提示", UserInfo[nPos].strUserName, "", "", "未知的聊天室扩展命令", "", "");
	return strResult.GetBuffer(strResult.GetLength());
}
//---------------------------------------------------------------------------
//功能描述: 时间事件一(用于系统)
//参数说明: *nSendType	为返回值的发送类型, 0 为没有发送, 1 为发送给所有室
//			nIDEvent	事件号(值为: 6001, 6002)
char* OnTimer1(UINT nIDEvent, int *nSendType)
{
	CString strResult = "";
	if( nIDEvent == 6001 ){	//一个例子
//		strResult = MakeSay( "red", "时间", "", "", "", "当前时间为:" + Time(true), "", "");
//		*nSendType = 1;
	}
	else if(nIDEvent == 6002 ){
	}
	return strResult.GetBuffer(strResult.GetLength());
}
//---------------------------------------------------------------------------
//功能描述: 时间事件二(用于聊天室)
//参数说明: *nSendType	为返回值的发送类型, 0 为不发送, 1 为发送给本室所有人
//			nIDEvent	事件号(值为: 6003, 6004, 6005 )
//			UserInfo[]	为本室所有在线者的数据
//			nMaxUser	为本室的最大在线人数
//			RoomInfo	为本室的一些数据
char* OnTimer2(UINT nIDEvent, int *nSendType, ChatUserInfoTag *UserInfo, int nMaxUser, ChatRoomInfoTag *RoomInfo)
{
	CString strResult = "";
	if( nIDEvent == 6003 ){
		//自定义为生成统计数据文件
//		*nSendType = 0;
//		MakeInfoFile(UserInfo, nMaxUser, RoomInfo);
	}
	else if(nIDEvent == 6004 ){
	}
	else if(nIDEvent == 6005 ){
	}
	return strResult.GetBuffer(strResult.GetLength());
}

⌨️ 快捷键说明

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