//---------------------------------------------------------------------------
//模块名称: 图形游戏聊天室 Server 扩展 DLL 部分之代码文件
//程序设计: 天云上人
//设计日期: 1.x版 2003年9月20日,
//pChat 2.x版 2004年4月12日,2004年9月24日修改了部分接口的参数
//pChat 2.5版 2005年9月份,修改了部分类为结构体。
//主要功能: 进行数据库操作与管理、定义所有的游戏功能
#include "math.h"
#include "DB.h"
//#include "afxsock.h"
//#define _DELETE(X) try{ if( (X) != NULL ) { delete (X); (X)=NULL; } } catch(...) {} //安全删除对象
#define _MAX_BUFFER_SIZE 8190 //最大的返回缓冲区大小
char *lpszDatebaseConnection = NULL; //兼容旧版本的DLL中的程序而保留,将来逐步取消
/*****************************************************************************
功能描述: 用户登录
参数说明: char *lpszUser 为用户的帐号,具体采用ID还是名字,由站长自己决定(默认程序采用ID方式)
char *lpszPasswd 为用户的密码
tagUserInfo *pUserInfo 为用户信息数据对象的指针
CVarInfo *pVarInfo 为参数设置数据的指针
返 回 值: -7受到IP限制,-6非会员(仅用于限制会员登录时),
-4内部错误,-3已经在线,-2人满,-1登录失败,0-nMaxUser登录成功
修改记录: 2004-02-15 增加对点穴的支持
2004-11-24 增加了会员掉线10分钟复上法力不丢失的支持
*****************************************************************************/
int OnUserLogin(char *lpszUser, char *lpszPasswd, tagUserInfo *pUserInfo, CVarInfo *pVarInfo)
{
BOOL bOK = TRUE;
int nItem = -4;
long nTimer = time(NULL); //当前的时间
unsigned long nUin = atol( lpszUser ); //转换为ID号
CString strCmd, strName;
CDBVariant NV;
CRecordset rs; rs.m_pDatabase = pVarInfo->m_db; //图形江湖数据连接
CDatabase db1;
CRecordset rs1; rs1.m_pDatabase = &db1; //验证帐号数据连接
DB_CONN = pVarInfo->m_szConnection; //为了兼容以前版本留下来的函数
try
{
if( strcmp( pVarInfo->m_szVariant[47], pUserInfo->m_szSocketIP ) == 0 && pVarInfo->m_nVariant[47] > nTimer )
return -7;
strcpy( pVarInfo->m_szVariant[47], pUserInfo->m_szSocketIP );
pVarInfo->m_nVariant[47] = nTimer + 5;
CheckParams( lpszUser ); //防止SQL注入
CheckParams( lpszPasswd ); //防止SQL注入 //db.OpenEx( pVarInfo->m_szConnection, CDatabase::noOdbcDialog ); //连接数据库
//判断是否被封了IP
strCmd.Format( "select * from %s where LOCATE(%s,'%s')=1 and %s<%ld and %s>%ld",
DB_TB_FENIP, DB_FD_FIP_IP, pUserInfo->m_szSocketIP, DB_FD_FIP_START, nTimer, DB_FD_FIP_END, nTimer );
rs.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd );
if( rs.IsEOF() )
{ //IP未被封
rs.Close();
if( pVarInfo->m_bVariant[0] )
{ //启用了IP限制, 2005-05-20
strCmd.Format( "select count(*) as c from pChat_User where nTag=%ld and sLoginIP='%s'", pVarInfo->m_nSiteTag, pUserInfo->m_szSocketIP );
rs.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd );
rs.GetFieldValue( "c", strName );
if( atol( strName ) >= pVarInfo->m_nVariant[0] )
{ //达到限制,查数据库,是否有不限
rs.Close();
strCmd.Format( "select nNumber from pChat_IPLimit where LOCATE(sIP,'%s')=1", pUserInfo->m_szSocketIP );
rs.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd );
if( rs.IsEOF() )
bOK = FALSE;
else
{
rs.GetFieldValue( "nNumber", strCmd );
if( atol( strName ) >= atol( strCmd ) )
bOK = FALSE;
}
}
rs.Close();
}
if( bOK )
{ //验证玩家帐号
db1.OpenEx( pVarInfo->m_szConnection1, CDatabase::noOdbcDialog );
#if DB_TYPE == 0 //MySQL 数据库
#if _ITYG_COM == 1
strCmd.Format( "select %s,%s,%s from %s where (%s=%lu or Account='%s') and (%s=password('%s') or %s=old_password('%s'))",
DB_FD_ID, DB_FD_NICK, DB_FD_GENDER, DB_TB_AUTH,
DB_FD_ID, nUin, lpszUser, DB_FD_PWD, lpszPasswd, DB_FD_PWD, lpszPasswd );
#else
strCmd.Format( "select %s,%s,%s from %s where %s=%lu and (%s=password('%s') or %s=old_password('%s'))",
DB_FD_ID, DB_FD_NICK, DB_FD_GENDER, DB_TB_AUTH, DB_FD_ID, nUin, DB_FD_PWD, lpszPasswd, DB_FD_PWD, lpszPasswd );
#endif
#else if DB_TYPE == 1 //SQL Server 或 Access 数据库,建议使用这些数据库的用户再自行修改一下程序,防止szSasswd = "afd' or ID=任何号 or passwd='" 这样的情况
strCmd.Format( "select "DB_FD_NICK","DB_FD_GENDER" from "DB_TB_AUTH" where "DB_FD_ID"=%lu and "DB_FD_PWD"='%s'",
nUin, strPasswd );
#endif
rs1.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd);
if( !rs1.IsEOF() )
{ //帐号验证成功
rs1.GetFieldValue( DB_FD_ID, strName ); nUin = atol( strName ); //ID号
rs1.GetFieldValue( DB_FD_NICK, strName ); //名字
rs1.GetFieldValue( DB_FD_GENDER, NV ); //性别
rs1.Close();
//查找玩家游戏数据
// strCmd.Format("select "DB_FD_NAME","DB_FD_SEX","DB_FD_LEVEL","DB_FD_PIC","DB_FD_MAP","DB_FD_GROUP" from "DB_TB_DATA" where "DB_FD_ID"=%lu", nUin );
strCmd.Format( "select * from %s where %s=%lu", DB_TB_DATA, DB_FD_ID, nUin );
rs.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd );
if( rs.IsEOF() )
{ //如果是没数据,则新建数据
CString str;
//防止重名
strName.Replace( "|", "|" ); strName.Replace( " ", "" ); strName.Replace( " ", "" );
if( CheckName( strName ) )
{ //名称合法
rs.Close();
str.Format("select "DB_FD_ID" from "DB_TB_DATA" where "DB_FD_NAME"='%s'", strName);
rs.Open( AFX_DB_USE_DEFAULT_TYPE, str );
if(!rs.IsEOF())
strName.Format( "无名%ld", nUin );
#if _ITYG_COM == 1 //判断文字江湖是否有同名
else
{
rs.Close();
str.Format("select uin from xajh_user where sName='%s' and uin<>%ld", strName, nUin );
rs.Open( AFX_DB_USE_DEFAULT_TYPE, str );
if( !rs.IsEOF() )
strName.Format( "无名%ld", nUin );
}
#endif
}
else
strName.Format( "无名%ld", nUin );
rs.Close();
switch( NV.m_chVal )
{
case 0: //随机
pUserInfo->m_bSex = ::GetTickCount() % 2 == 1 ? TRUE : FALSE;
break;
case 1: //男
pUserInfo->m_bSex = TRUE;
break;
case 2: //女
pUserInfo->m_bSex = FALSE;
break;
}
#if _ITYG_COM == 1 //插入记录
str.Format( "%s\\setup.ini", pVarInfo->m_szUserDirectory );
long nDays = ::GetPrivateProfileInt( "setup", "送会员天数", 0, str );
str.Format("Insert into "DB_TB_DATA"("DB_FD_ID","DB_FD_NAME","DB_FD_SEX","DB_FD_MEMBER","DB_FD_MEMBERTIME")values(%lu,'%s',%d,1,%ld)",
nUin, strName, pUserInfo->m_bSex, nTimer + 86400 * nDays );
#else
str.Format("Insert into "DB_TB_DATA"("DB_FD_ID","DB_FD_NAME","DB_FD_SEX")values(%lu,'%s',%d)",
nUin, strName, pUserInfo->m_bSex );
#endif
ExecSqlCmd( str, pVarInfo );
rs.Close();
rs.Open( AFX_DB_USE_DEFAULT_TYPE, strCmd );
}
if( !rs.IsEOF() )
{ //有数据
rs.GetFieldValue( DB_FD_TAG, NV ); //在线标记
if( NV.m_lVal < 1 || NV.m_lVal == pVarInfo->m_nSiteTag )
{ //小于1为未登录或一些特殊处理
BOOL bPowerMember = FALSE; //是否终身会员
if( NV.m_lVal == pVarInfo->m_nSiteTag )
{ //如果数据库标记为已经登录了本服务器,则让服务器处理重复上线
pUserInfo->m_bBoot = TRUE;
}
pUserInfo->m_nTag = NV.m_lVal;
rs.GetFieldValue( DB_FD_STATE, NV ); //状态
pUserInfo->m_nState = NV.m_lVal;
rs.GetFieldValue( DB_FD_NAME, strName ); //名字
rs.GetFieldValue( DB_FD_SEX, NV ); //性别
pUserInfo->m_bSex = NV.m_lVal;// > 0 ? TRUE : FALSE;
rs.GetFieldValue( DB_FD_MAP, NV ); //所在地图
pUserInfo->m_nMap = NV.m_lVal;
rs.GetFieldValue( DB_FD_MEMBERTIME, NV ); //会员到期时间
if( NV.m_lVal > 2100000000 )
{ //终身会员
bPowerMember = TRUE;
}
if( NV.m_lVal > nTimer )
{ //如果没到期
rs.GetFieldValue( DB_FD_MEMBER, NV ); //会员等级
pUserInfo->m_nMember = NV.m_lVal;
}
else
pUserInfo->m_nMember = 0;
rs.GetFieldValue( DB_FD_ADMIN, NV ); //管理等级
pUserInfo->m_nAdminLevel = NV.m_l
天云阁2D游戏VC++程序开源代码
需积分: 9 85 浏览量
2012-08-08
10:49:18
上传
评论
收藏 376KB ZIP 举报
wyf289283641
- 粉丝: 0
- 资源: 16