📄 chatdll.cpp
字号:
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 + -