📄 gobangdeal.cpp
字号:
/************************************************************************
函数功能:退出房间
************************************************************************/
void GobangDeal::ToExitRoom(TDBPEx *dbp,NODE_STRUCT recvnode){
char sqlbuf[1024]={0};
char *tempstr;
char *body;
CString tableid,tableseq,status;
CString nickname,picture,usertype;
CString userid,roomnum,userinfo="";
body = recvnode.body;
tempstr=split(body,SUBDIVISION);
userid = tempstr;
tempstr=split(body,SUBDIVISION);
roomnum = tempstr;
//更新用户的socket连接和用户状态
sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
connectport=%d where userid='%s'",recvnode.queuenum,recvnode.clientip,\
recvnode.clientport,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//从大厅信息表中删除用户信息
sprintf( sqlbuf, "delete from gobang_hallinfo where userid='%s'",userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//响应信息:(0:成功 1:失败)
sprintf( recvnode.body, "%s;", "0");
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
RadioRoomInfo(dbp,roomnum,"503");
}
/************************************************************************
函数功能:广播房间列表改变的信息
************************************************************************/
void GobangDeal::RadioRoomInfo(TDBPEx *dbp,CString roomnum,CString operateid){
char sqlbuf[1024]={0};
NODE_STRUCT recvnode;
short int queuenum;
ULONG connectport;
CString ipaddress,usernum;
CString userid,roominfo="";
memset(&recvnode,0,sizeof recvnode);
strcpy(recvnode.err_code,"000");
strcpy(recvnode.service_id,"001");
strcpy(recvnode.operate_id,operateid);
//更新房间在线用户数
if(strcmp(operateid,"502")==0){
sprintf( sqlbuf, "update Gobang_roominfo set usernum = usernum+1 where roomid='%s'",roomnum);
}
else if(strcmp(operateid,"503")==0){
sprintf( sqlbuf, "update Gobang_roominfo set usernum = usernum-1 where roomid='%s'",roomnum);
}
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//获取房间里的在线用户数
sprintf( sqlbuf, "select usernum from Gobang_roominfo where roomid = '%s'",roomnum);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,usernum);
sprintf( recvnode.body, "%s;%s;",roomnum, usernum);
}
else
{
sprintf( recvnode.body, "%s;%s;",roomnum, 0);
}
dbp->SQLFreeStmt();
//获取所有处在房间列表界面的用户
sprintf( sqlbuf, "select queuenum,ipaddress,connectport from Gobang_userinfo where status = '01'",roomnum);
dbp->SQLExecDirect(sqlbuf,FALSE);
while(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataSInt(1,queuenum);
dbp->SQLGetDataStr(2,ipaddress);
dbp->SQLGetDataUInt(3,connectport);
recvnode.queuenum=queuenum;
recvnode.clientport = connectport;
strcpy(recvnode.clientip,ipaddress);
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
dbp->SQLFreeStmt();
}
/************************************************************************
函数功能:用户坐下
************************************************************************/
void GobangDeal::UserSit(TDBPEx *dbp,NODE_STRUCT recvnode){
char sqlbuf[1024]={0};
char *tempstr;
char *body;
short queuenum;
ULONG connectport;
CString tableid,tableseq,status;
CString nickname,picture,usertype,ipaddress;
CString userid,roomnum,userinfo="";
CString integral,gamelevel,Allcount,wincount;
CString equalcount,failcount;
CString oppuserid,sex,age,gamemoney;
body = recvnode.body;
tempstr=split(body,SUBDIVISION);
userid = tempstr;
tempstr=split(body,SUBDIVISION);
roomnum = tempstr;
tempstr=split(body,SUBDIVISION);
tableid = tempstr;
tempstr=split(body,SUBDIVISION);
tableseq = tempstr;
//更新用户的socket连接
sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
connectport=%d where userid='%s'",recvnode.queuenum,recvnode.clientip,\
recvnode.clientport,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//判断是否有用户捷足先登了
sprintf( sqlbuf,
"select userid from Gobang_hallinfo where userid<>'%s' and tableseq = '%s' \
and tableid = '%s' and roomid = '%s'",userid,tableseq,tableid,roomnum
);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK) //已有用户先坐下
{
dbp->SQLGetDataStr(1,userid);
dbp->SQLFreeStmt();
//响应信息:是否坐下(0:成功 1:失败)
sprintf( recvnode.body, "%s;", "1");
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
//获取已经坐下的用户的信息
sprintf( sqlbuf,
"select a.status,b.nickname,b.sex,b.age,b.gamemoney,b.picture,b.usertype\
from Gobang_hallinfo a, User_info b where b.userid = a.userid and b.userid = '%s'"
,userid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,status);
dbp->SQLGetDataStr(2,nickname);
dbp->SQLGetDataStr(3,sex);
dbp->SQLGetDataStr(4,age);
dbp->SQLGetDataStr(5,gamemoney);
dbp->SQLGetDataStr(6,picture);
dbp->SQLGetDataStr(7,usertype);
userinfo = userid+";"+nickname+";"+picture+";"+sex+";"+age
+";"+gamemoney+";"+status+";"+usertype+";";
}
dbp->SQLFreeStmt();
userinfo = userid+";"+nickname+";"+picture+";"+usertype+";"+status+";"+tableid+";"+tableseq;
strcpy(recvnode.body,userinfo);
strcpy(recvnode.operate_id,"514");
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
else //还没人先坐下
{
dbp->SQLFreeStmt();
//更改用户信息表
sprintf( sqlbuf, "update gobang_userinfo set status ='03',tableid ='%s',tableseq='%s' \
where userid='%s'", tableid,tableseq,userid
);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//更改大厅信息表
sprintf( sqlbuf, "update Gobang_hallinfo set status ='01',tableid ='%s',tableseq='%s' \
where userid='%s'",tableid,tableseq,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//获取对手的信息
sprintf( sqlbuf,
"select a.userid,a.status,b.nickname,b.sex,b.age,b.gamemoney,b.picture,b.usertype\
from Gobang_hallinfo a, User_info b where b.userid = a.userid and a.status <> '00' and a.userid<>'%s' \
and roomid = '%s' and tableid='%s'",userid,roomnum,tableid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,oppuserid);
dbp->SQLGetDataStr(2,status);
dbp->SQLGetDataStr(3,nickname);
dbp->SQLGetDataStr(4,sex);
dbp->SQLGetDataStr(5,age);
dbp->SQLGetDataStr(6,gamemoney);
dbp->SQLGetDataStr(7,picture);
dbp->SQLGetDataStr(8,usertype);
userinfo = oppuserid+";"+nickname+";"+picture+";"+sex+";"+age
+";"+gamemoney+";"+status+";"+usertype+";";
dbp->SQLFreeStmt();
//获取对手的游戏统计
sprintf( sqlbuf,
"select a.integral,b.gamelevel,a.Allcount,a.wincount,a.equalcount,a.failcount,\
a.queuenum,a.connectport,a.ipaddress from gobang_userinfo a, gobang_level b where \
b.integral =(select max(c.integral) from gobang_level c \
where a.integral >= c.integral) and a.userid ='%s'",oppuserid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,integral);
dbp->SQLGetDataStr(2,gamelevel);
dbp->SQLGetDataStr(3,Allcount);
dbp->SQLGetDataStr(4,wincount);
dbp->SQLGetDataStr(5,equalcount);
dbp->SQLGetDataStr(6,failcount);
dbp->SQLGetDataSInt(7,queuenum);
dbp->SQLGetDataUInt(8,connectport);
dbp->SQLGetDataStr(9,ipaddress);
userinfo =userinfo+integral+"$"+gamelevel+"$"+Allcount+"$"+wincount+"$"+failcount+"$"+equalcount;
}
dbp->SQLFreeStmt();
//响应信息:是否成功(0:成功 1:失败)
sprintf( recvnode.body, "%s;%s;", "0", userinfo);
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
//将自己的信息传给对手
strcpy(recvnode.operate_id,"504");
recvnode.queuenum=queuenum;
recvnode.clientport = connectport;
strcpy(recvnode.clientip,ipaddress);
//获取用户的信息
sprintf( sqlbuf,
"select a.status,b.nickname,b.sex,b.age,b.gamemoney,b.picture,b.usertype \
from Gobang_hallinfo a, User_info b where b.userid = a.userid and b.userid = '%s'"
,userid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,status);
dbp->SQLGetDataStr(2,nickname);
dbp->SQLGetDataStr(3,sex);
dbp->SQLGetDataStr(4,age);
dbp->SQLGetDataStr(5,gamemoney);
dbp->SQLGetDataStr(6,picture);
dbp->SQLGetDataStr(7,usertype);
userinfo = userid+";"+nickname+";"+picture+";"+sex+";"+age
+";"+gamemoney+";"+status+";"+usertype+";";
}
dbp->SQLFreeStmt();
//获取用户的游戏统计
sprintf( sqlbuf,
"select a.integral,b.gamelevel,a.Allcount,a.wincount,a.equalcount,\
a.failcount,a.queuenum from gobang_userinfo a, gobang_level b \
where b.integral =(select max(c.integral) from gobang_level c \
where a.integral >= c.integral) and a.userid ='%s'",userid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,integral);
dbp->SQLGetDataStr(2,gamelevel);
dbp->SQLGetDataStr(3,Allcount);
dbp->SQLGetDataStr(4,wincount);
dbp->SQLGetDataStr(5,equalcount);
dbp->SQLGetDataStr(6,failcount);
dbp->SQLGetDataSInt(7,queuenum);
userinfo =userinfo+integral+"$"+gamelevel+"$"+Allcount+"$"+wincount+"$"+failcount+"$"+equalcount;
}
dbp->SQLFreeStmt();
//响应信息:是否成功(0:成功 1:失败)
sprintf( recvnode.body, "%s", userinfo);
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
else{
sprintf( recvnode.body, "%s;", "0");
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
//给其他同房间用户发送信息
strcpy(recvnode.operate_id,"514");
//获取用户的信息
sprintf( sqlbuf,
"select a.status,b.nickname,b.sex,b.age,b.gamemoney,b.picture,b.usertype\
from Gobang_hallinfo a, User_info b where b.userid = a.userid and b.userid = '%s'"
,userid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,status);
dbp->SQLGetDataStr(2,nickname);
dbp->SQLGetDataStr(3,sex);
dbp->SQLGetDataStr(4,age);
dbp->SQLGetDataStr(5,gamemoney);
dbp->SQLGetDataStr(6,picture);
dbp->SQLGetDataStr(7,usertype);
userinfo = userid+";"+nickname+";"+picture+";"+sex+";"+age
+";"+gamemoney+";"+status+";"+usertype+";";
}
dbp->SQLFreeStmt();
userinfo = userid+";"+nickname+";"+picture+";"+usertype+";"+status+";"+tableid+";"+tableseq;
//获取所有在房间里的用户
strcpy(recvnode.body,userinfo);
sprintf( sqlbuf, "select queuenum,ipaddress,connectport from Gobang_userinfo where roomid = '%s' \
and tableid <> '%s'",roomnum,tableid);
dbp->SQLExecDirect(sqlbuf,FALSE);
while(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataSInt(1,queuenum);
dbp->SQLGetDataStr(2,ipaddress);
dbp->SQLGetDataUInt(3,connectport);
recvnode.queuenum=queuenum;
recvnode.clientport = connectport;
strcpy(recvnode.clientip,ipaddress);
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
dbp->SQLFreeStmt();
}
}
/************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -