Response::ResponseCode Server_ProtocolHandler::processSessionCommandContainer(const CommandContainer &cont, ResponseContainer &rc)
{
	Response::ResponseCode finalResponseCode = Response::RespOk;
	for (int i = cont.session_command_size() - 1; i >= 0; --i) {
		Response::ResponseCode resp = Response::RespInvalidCommand;
		const SessionCommand &sc = cont.session_command(i);
		const int num = getPbExtension(sc);
		if (num != SessionCommand::PING) { // don't log ping commands
			if (num == SessionCommand::LOGIN) { // log login commands, but hide passwords
				SessionCommand debugSc(sc);
				debugSc.MutableExtension(Command_Login::ext)->clear_password();
				logDebugMessage(QString::fromStdString(debugSc.ShortDebugString()));
			} else
				logDebugMessage(QString::fromStdString(sc.ShortDebugString()));
		}
		switch ((SessionCommand::SessionCommandType) num) {
			case SessionCommand::PING: resp = cmdPing(sc.GetExtension(Command_Ping::ext), rc); break;
			case SessionCommand::LOGIN: resp = cmdLogin(sc.GetExtension(Command_Login::ext), rc); break;
			case SessionCommand::MESSAGE: resp = cmdMessage(sc.GetExtension(Command_Message::ext), rc); break;
			case SessionCommand::GET_GAMES_OF_USER: resp = cmdGetGamesOfUser(sc.GetExtension(Command_GetGamesOfUser::ext), rc); break;
			case SessionCommand::GET_USER_INFO: resp = cmdGetUserInfo(sc.GetExtension(Command_GetUserInfo::ext), rc); break;
			case SessionCommand::LIST_ROOMS: resp = cmdListRooms(sc.GetExtension(Command_ListRooms::ext), rc); break;
			case SessionCommand::JOIN_ROOM: resp = cmdJoinRoom(sc.GetExtension(Command_JoinRoom::ext), rc); break;
			case SessionCommand::LIST_USERS: resp = cmdListUsers(sc.GetExtension(Command_ListUsers::ext), rc); break;
			default: resp = processExtendedSessionCommand(num, sc, rc);
		}
		if (resp != Response::RespOk)
			finalResponseCode = resp;
	}
	return finalResponseCode;
}
Esempio n. 2
0
/**
 * 创建赛局
 * @param fd
 * @return 
 */
int cmdGameCreate(int fd) {
    PkgInfo inputPkg;
    PkgInfo outputPkg;
    
    if(loginId == 0){
        cmdLogin(fd);
    }
    
    CHashGameData gameData;
    gameData.id = loginId;
    gameData.playA = loginId;

    outputPkg.id = 2;//cmd创建战局
    memcpy(&outputPkg.data, (char *) &gameData, sizeof (gameData));

    send(fd, (char *) &outputPkg, sizeof (outputPkg), 0);
    //recv
    char buf[MAXBUF + 1];
    recv(fd, buf, MAXBUF, 0);
    memcpy(&inputPkg, buf, sizeof (inputPkg));
    if(inputPkg.id == 14){
        struct MsgInfo msg;
        memset(&msg,0,sizeof(msg));
        memcpy(&msg, inputPkg.data, sizeof(msg));
        printf(" [server]:%s\n",msg.message);
    }
    
    currentGameId=loginId;
    loopWaitJoin(fd);
    cmdGamePlayHandA(fd);
}
Esempio n. 3
0
/*
   handle_message - 处理每个 socket 上的消息收发
 */
int handle_message(int new_fd) {
    char buf[MAXBUF + 1];
    int len;
    
//    while(1){
        /* 开始处理每个新连接上的数据收发 */
        bzero(buf, MAXBUF + 1);
        /* 接收客户端的消息 */
        len = recv(new_fd, buf, MAXBUF, 0);
        buf[len] = 0;
        if (len > 0) {
            printf("%d接收消息成功,共%d个字节的数据\n", new_fd, len);

            CHashUserData userData;
            PkgInfo inputPkg;
            PkgInfo outputPkg;
            memcpy(&inputPkg, buf, sizeof (inputPkg));
            
            printf("-------%d----------\n",new_fd);
            //cmdTest
            if (inputPkg.id == 1) {
                cmdLogin(inputPkg, outputPkg);
            } else if(inputPkg.id == 6){
                cmdUserQuery(inputPkg,outputPkg);
            } else if (inputPkg.id == 15) {
                cmdTest(inputPkg, outputPkg);
            } else if (inputPkg.id == 13) {
                cmdLogout(inputPkg, outputPkg);
            } else if (inputPkg.id == 5) {
                cmdGameQuery(inputPkg, outputPkg);
            } else if (inputPkg.id == 12) {
                cmdQueryUserList(inputPkg, outputPkg);
            } else if(inputPkg.id == 2){
                cmdGameCreate(inputPkg, outputPkg);
            }else if(inputPkg.id == 11){
                cmdQueryGameList(inputPkg,outputPkg);
            }else if(inputPkg.id == 3){
                cmdGameJoin(inputPkg,outputPkg);
            }else if(inputPkg.id == 4){
                cmdGamePlayHand(inputPkg,outputPkg);
            }else {
                printf("cmd unknow\n");
            }

            if (send(new_fd, (char *) &outputPkg, sizeof (outputPkg), 0) == -1) {
                fprintf(stderr, "Write Error:%s\n", strerror(errno));
                //exit(1);
            }

        } else {
            if (len < 0){
                printf("消息接收失败!错误代码是%d,错误信息是'%s',len:%d\n",errno, strerror(errno),len);
            }
        }
//    }
    //close(new_fd);
    /* 处理每个新连接上的数据收发结束 */
    return len;
}
Esempio n. 4
0
/**
 * 加和赛局
 * @param fd
 * @return 
 */
int cmdGameJoin(int fd) {
    PkgInfo inputPkg;
    PkgInfo outputPkg;
    
    if(loginId == 0){
        cmdLogin(fd);
    }

    cmdQueryGameList(fd);//查询在线游戏列表
    printf("  please input join gameid :");
    scanf("%d", &joinGameId);//输入加入游戏id

    CHashGameData game,gameData;
    game.id = joinGameId;
    game.playB=loginId;
    
//    int ret = cmdGameQuery(fd,joinGameId,gameData);
//    if(ret< 0){
//        printf(" can not find game:%d\n",joinGameId);
//        cmdGameJoin(fd);
//        return 0;
//    }

    outputPkg.id = 3;//cmd加入战局
    memcpy(&outputPkg.data, (char *) &game, sizeof (game));

    send(fd, (char *) &outputPkg, sizeof (outputPkg), 0);
    
    //recv
    char buf[MAXBUF + 1];
    recv(fd, buf, MAXBUF, 0);
    memcpy(&inputPkg, buf, sizeof (inputPkg));
    if(inputPkg.id == 14){
        struct MsgInfo msg;
        memset(&msg,0,sizeof(msg));
        memcpy(&msg, inputPkg.data, sizeof(msg));
        printf(" [server]:%s\n",msg.message);
        cmdGameJoin(fd);
    }else if(inputPkg.id == 3){
        struct MsgInfo msg;
        memset(&msg,0,sizeof(msg));
        memcpy(&msg, inputPkg.data, sizeof(msg));
        printf(" [server]:%s\n",msg.message);        
    }
    cmdGamePlayHandB(fd);
}
Esempio n. 5
0
int menuCmd(int sockfd) {
    char inputLine [80];
    int cmdId = 0;

    
    
    printf("please input number(show menu:0): ");
    
    scanf("%s", inputLine);
    cmdId = atoi(inputLine);
    if (cmdId == 0){
        cmdShowMenu();
    }if (cmdId == 1) {
        cmdLogin(sockfd);
    } else if (cmdId == 13) {
        cmdLogout(sockfd);
        return 1;
    } else if (cmdId == 12) {
        cmdQueryUserList(sockfd);
    } else if (cmdId == 2) {
        cmdGameCreate(sockfd);
    } else if (cmdId == 5) {
        //cmdGameQuery(sockfd);
    } else if (cmdId == 11) {
        cmdQueryGameList(sockfd);
    } else if (cmdId == 3) {
        cmdGameJoin(sockfd);
    } else if (cmdId == 41) {
        cmdGamePlayHandA(sockfd);
    } else if (cmdId == 42) {
        cmdGamePlayHandB(sockfd);
    } else {
        printf("please select number from menu,thanks\n");
    }
    return 0;

    //    cmdLogin(sockfd); //昵称登陆
    //    cmdLogout(sockfd); //退出登陆
    //    cmdQueryUserList(sockfd); //查询在线用户列表
    //    cmdGameCreate(sockfd); //创建战局
    //    cmdQueryGameList(sockfd); //查询战局
    //    cmdGameJoin(sockfd); //加入战局
    //    cmdGamePlayHandA(sockfd); //play a:出拳
    //    cmdGamePlayHandB(sockfd); //play b:出拳    
}
ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, CommandContainer *cont)
{
	lastCommandTime = QDateTime::currentDateTime();

	RoomCommand *roomCommand = qobject_cast<RoomCommand *>(command);
	if (roomCommand) {
		qDebug() << "received RoomCommand: roomId =" << roomCommand->getRoomId();
		if (authState == PasswordWrong)
			return RespLoginNeeded;
	
		Server_Room *room = rooms.value(roomCommand->getRoomId(), 0);
		if (!room)
			return RespNameNotFound;
		
		switch (command->getItemId()) {
			case ItemId_Command_LeaveRoom: return cmdLeaveRoom(static_cast<Command_LeaveRoom *>(command), cont, room);
			case ItemId_Command_RoomSay: return cmdRoomSay(static_cast<Command_RoomSay *>(command), cont, room);
			case ItemId_Command_CreateGame: return cmdCreateGame(static_cast<Command_CreateGame *>(command), cont, room);
			case ItemId_Command_JoinGame: return cmdJoinGame(static_cast<Command_JoinGame *>(command), cont, room);
			default: return RespInvalidCommand;
		}
	}
	GameCommand *gameCommand = qobject_cast<GameCommand *>(command);
	if (gameCommand) {
		qDebug() << "received GameCommand: game =" << gameCommand->getGameId();
		if (authState == PasswordWrong)
			return RespLoginNeeded;
	
		if (!games.contains(gameCommand->getGameId())) {
			qDebug() << "invalid game";
			return RespNameNotFound;
		}
		QPair<Server_Game *, Server_Player *> gamePair = games.value(gameCommand->getGameId());
		Server_Game *game = gamePair.first;
		Server_Player *player = gamePair.second;
		
		switch (command->getItemId()) {
			case ItemId_Command_DeckSelect: return cmdDeckSelect(static_cast<Command_DeckSelect *>(command), cont, game, player);
			case ItemId_Command_SetSideboardPlan: return cmdSetSideboardPlan(static_cast<Command_SetSideboardPlan *>(command), cont, game, player);
			case ItemId_Command_LeaveGame: return cmdLeaveGame(static_cast<Command_LeaveGame *>(command), cont, game, player);
			case ItemId_Command_ReadyStart: return cmdReadyStart(static_cast<Command_ReadyStart *>(command), cont, game, player);
			case ItemId_Command_Concede: return cmdConcede(static_cast<Command_Concede *>(command), cont, game, player);
			case ItemId_Command_Say: return cmdSay(static_cast<Command_Say *>(command), cont, game, player);
			case ItemId_Command_Shuffle: return cmdShuffle(static_cast<Command_Shuffle *>(command), cont, game, player);
			case ItemId_Command_Mulligan: return cmdMulligan(static_cast<Command_Mulligan *>(command), cont, game, player);
			case ItemId_Command_RollDie: return cmdRollDie(static_cast<Command_RollDie *>(command), cont, game, player);
			case ItemId_Command_DrawCards: return cmdDrawCards(static_cast<Command_DrawCards *>(command), cont, game, player);
			case ItemId_Command_MoveCard: return cmdMoveCard(static_cast<Command_MoveCard *>(command), cont, game, player);
			case ItemId_Command_FlipCard: return cmdFlipCard(static_cast<Command_FlipCard *>(command), cont, game, player);
			case ItemId_Command_AttachCard: return cmdAttachCard(static_cast<Command_AttachCard *>(command), cont, game, player);
			case ItemId_Command_CreateToken: return cmdCreateToken(static_cast<Command_CreateToken *>(command), cont, game, player);
			case ItemId_Command_CreateArrow: return cmdCreateArrow(static_cast<Command_CreateArrow *>(command), cont, game, player);
			case ItemId_Command_DeleteArrow: return cmdDeleteArrow(static_cast<Command_DeleteArrow *>(command), cont, game, player);
			case ItemId_Command_SetCardAttr: return cmdSetCardAttr(static_cast<Command_SetCardAttr *>(command), cont, game, player);
			case ItemId_Command_SetCardCounter: return cmdSetCardCounter(static_cast<Command_SetCardCounter *>(command), cont, game, player);
			case ItemId_Command_IncCardCounter: return cmdIncCardCounter(static_cast<Command_IncCardCounter *>(command), cont, game, player);
			case ItemId_Command_IncCounter: return cmdIncCounter(static_cast<Command_IncCounter *>(command), cont, game, player);
			case ItemId_Command_CreateCounter: return cmdCreateCounter(static_cast<Command_CreateCounter *>(command), cont, game, player);
			case ItemId_Command_SetCounter: return cmdSetCounter(static_cast<Command_SetCounter *>(command), cont, game, player);
			case ItemId_Command_DelCounter: return cmdDelCounter(static_cast<Command_DelCounter *>(command), cont, game, player);
			case ItemId_Command_NextTurn: return cmdNextTurn(static_cast<Command_NextTurn *>(command), cont, game, player);
			case ItemId_Command_SetActivePhase: return cmdSetActivePhase(static_cast<Command_SetActivePhase *>(command), cont, game, player);
			case ItemId_Command_DumpZone: return cmdDumpZone(static_cast<Command_DumpZone *>(command), cont, game, player);
			case ItemId_Command_StopDumpZone: return cmdStopDumpZone(static_cast<Command_StopDumpZone *>(command), cont, game, player);
			case ItemId_Command_RevealCards: return cmdRevealCards(static_cast<Command_RevealCards *>(command), cont, game, player);
			default: return RespInvalidCommand;
		}
	}
	AdminCommand *adminCommand = qobject_cast<AdminCommand *>(command);
	if (adminCommand) {
		qDebug() << "received AdminCommand";
		if (!(userInfo->getUserLevel() & ServerInfo_User::IsAdmin))
			return RespLoginNeeded;
		
		switch (command->getItemId()) {
			case ItemId_Command_UpdateServerMessage: return cmdUpdateServerMessage(static_cast<Command_UpdateServerMessage *>(command), cont);
			default: return RespInvalidCommand;
		}
	}
	qDebug() << "received generic Command";
	switch (command->getItemId()) {
		case ItemId_Command_Ping: return cmdPing(static_cast<Command_Ping *>(command), cont);
		case ItemId_Command_Login: return cmdLogin(static_cast<Command_Login *>(command), cont);
		case ItemId_Command_Message: return cmdMessage(static_cast<Command_Message *>(command), cont);
		case ItemId_Command_DeckList: return cmdDeckList(static_cast<Command_DeckList *>(command), cont);
		case ItemId_Command_DeckNewDir: return cmdDeckNewDir(static_cast<Command_DeckNewDir *>(command), cont);
		case ItemId_Command_DeckDelDir: return cmdDeckDelDir(static_cast<Command_DeckDelDir *>(command), cont);
		case ItemId_Command_DeckDel: return cmdDeckDel(static_cast<Command_DeckDel *>(command), cont);
		case ItemId_Command_DeckUpload: return cmdDeckUpload(static_cast<Command_DeckUpload *>(command), cont);
		case ItemId_Command_DeckDownload: return cmdDeckDownload(static_cast<Command_DeckDownload *>(command), cont);
		case ItemId_Command_GetUserInfo: return cmdGetUserInfo(static_cast<Command_GetUserInfo *>(command), cont);
		case ItemId_Command_ListRooms: return cmdListRooms(static_cast<Command_ListRooms *>(command), cont);
		case ItemId_Command_JoinRoom: return cmdJoinRoom(static_cast<Command_JoinRoom *>(command), cont);
		case ItemId_Command_ListUsers: return cmdListUsers(static_cast<Command_ListUsers *>(command), cont);
		default: return RespInvalidCommand;
	}
}