메신저봇 실습 후 만들어 본 텍스트변환봇, 숫자 게임봇

소개

Android Emulator 를 이용, 스터디장 현우님이 주신 예제를 통해 에뮤레이터에 익숙해진 후
gemini 를 이용해 간단한 "텍스트 변환봇" 과 "숫자 게임봇"을 만들었어요.

진행 방법

  1. 예제를 통해 Emulater 익숙해지기

    실습을 위해 스터디장님이 공유해주신 실습코드를 그대로 사용했어요. 이 중에서 외부 API 연동없이 자바스크립트로만 구현이 가능한 01_에코봇, 02_시간인사봇, 03_계산기봇을 테스트했습니다.

    한국어 앱의 스크린 샷

    검은 색 화면에서 메시지 앱의 스크린 샷

    에뮤레이터가 복사붙여넣기, 한글입력, 영어입력, 엔터 등의 입력방식등이 달랐어요. 스터디장님 말씀대로 한 3번 정도 테스트겸 해보니 쓰던것만 써서 금새 익숙해 질 수 있었어요.



  2. 텍스트 변환봇과 숫자 게임봇 만들어보기

    외부 API 연동이나 데이터 저장없이 자바스크립트만의 기능으로 구현할 수 있는 봇 아이디어 중에

    두가지를 Gemini 에게 코드를 부탁해서 만들었어요.

    전화에 문자 메시지 앱의 스크린 샷

텍스트봇 코드

// 04_text_transformer_bot.js
var bot = BotManager.getCurrentBot();

bot.on("message", function(msg) {
    var content = msg.content.trim(); // 메시지 앞뒤 공백 제거

    // "대문자" 명령 처리
    if (content.startsWith("대문자 ")) {
        var textToTransform = content.substring(4).trim(); // "대문자 " 이후 텍스트 추출 및 앞뒤 공백 제거
        if (textToTransform.length > 0) {
            var transformedText = textToTransform.toUpperCase();
            msg.reply("대문자 변환 결과: " + transformedText);
        } else {
            msg.reply("변환할 텍스트를 '대문자 [텍스트]' 형식으로 입력해주세요.");
        }
    }
    // "소문자" 명령 처리
    else if (content.startsWith("소문자 ")) {
        var textToTransform = content.substring(4).trim();
        if (textToTransform.length > 0) {
            var transformedText = textToTransform.toLowerCase();
            msg.reply("소문자 변환 결과: " + transformedText);
        } else {
            msg.reply("변환할 텍스트를 '소문자 [텍스트]' 형식으로 입력해주세요.");
        }
    }
    // "뒤집기" 명령 처리
    else if (content.startsWith("뒤집기 ")) {
        var textToTransform = content.substring(4).trim();
        if (textToTransform.length > 0) {
            // 문자열을 배열로 분리 -> 배열을 뒤집기 -> 다시 문자열로 합치기
            var transformedText = textToTransform.split('').reverse().join('');
            msg.reply("텍스트 뒤집기 결과: " + transformedText);
        } else {
            msg.reply("변환할 텍스트를 '뒤집기 [텍스트]' 형식으로 입력해주세요.");
        }
    }
    // "공백제거" 명령 처리
    else if (content.startsWith("공백제거 ")) {
        var textToTransform = content.substring(5).trim(); // "공백제거 " 이후 텍스트 추출
        if (textToTransform.length > 0) {
            // 모든 공백 문자(스페이스, 탭, 줄바꿈 등)를 제거
            var transformedText = textToTransform.replace(/\s/g, '');
            msg.reply("공백 제거 결과: " + transformedText);
        } else {
            msg.reply("변환할 텍스트를 '공백제거 [텍스트]' 형식으로 입력해주세요.");
        }
    }
    // 아무 명령어도 해당하지 않을 경우
    else if (content.length > 0) { // 비어있지 않은 메시지에만 응답 (선택 사항)
        // msg.reply("텍스트 변환 봇입니다. '대문자', '소문자', '뒤집기', '공백제거' 중 하나의 명령어를 사용해주세요.");
        // 불필요한 응답을 줄이기 위해 주석 처리하거나, 필요에 따라 추가하세요.
    }
});

숫자 게임 봇 코드

// 05_number_guessing_game_with_chances_bot.js
var bot = BotManager.getCurrentBot();

// 봇의 게임 상태를 저장할 객체를 bot 객체에 추가합니다.
// 이 방식은 봇 프로세스가 재시작되지 않는 한 상태를 유지합니다.
// 만약 봇이 메시지마다 완전히 새로 초기화된다면 이 방식은 작동하지 않을 수 있습니다.
// (일반적인 메신저 봇 플랫폼에서는 이 방식이 잘 작동하는 경우가 많습니다.)
if (!bot.gameState) {
    bot.gameState = {
        secretNumber: 0,
        remainingChances: 0,
        gameInProgress: false
    };
}

bot.on("message", function(msg) {
    var content = msg.content.trim();
    var state = bot.gameState; // 현재 게임 상태를 편리하게 참조

    // 1. 게임 시작 명령어 처리
    if (content === "숫자게임 시작") {
        // 게임 초기화
        state.secretNumber = Math.floor(Math.random() * 100) + 1; // 1부터 100 사이의 무작위 숫자
        state.remainingChances = 5; // 기회 5번
        state.gameInProgress = true; // 게임 시작 상태로 변경

        msg.reply("제가 1부터 100 사이의 숫자를 생각했습니다. 기회는 " + state.remainingChances + "번입니다. 맞춰보세요!");
        // 테스트용으로 정답을 알려주는 줄은 실제 게임에서는 주석 처리하거나 삭제해야 합니다.
        // msg.reply("테스트용: 정답은 " + state.secretNumber + "입니다.");
        return; // 다른 로직 실행 방지
    }

    // 2. 게임이 진행 중일 때만 숫자 추측 처리
    if (state.gameInProgress) {
        var userGuess = parseInt(content); // 사용자의 메시지를 숫자로 변환

        // 사용자가 유효한 숫자를 입력했는지 확인
        if (!isNaN(userGuess) && userGuess >= 1 && userGuess <= 100) {
            state.remainingChances--; // 기회 1회 감소

            if (userGuess < state.secretNumber) {
                msg.reply("더 높게! (남은 기회: " + state.remainingChances + "번)");
            } else if (userGuess > state.secretNumber) {
                msg.reply("더 낮게! (남은 기회: " + state.remainingChances + "번)");
            } else { // 정답을 맞췄을 경우
                msg.reply("정답입니다! 제가 생각한 숫자는 " + state.secretNumber + "였습니다. 축하합니다!");
                state.gameInProgress = false; // 게임 종료
                state.secretNumber = 0; // 정답 초기화
            }

            // 기회가 모두 소진되었는데 정답을 못 맞췄을 경우
            if (state.remainingChances <= 0 && state.gameInProgress) { // 아직 게임 진행 중이라면 (정답을 못 맞췄다면)
                msg.reply("아쉽지만 기회를 모두 소진했습니다! 정답은 " + state.secretNumber + "였습니다. 다시 시작하려면 '숫자게임 시작'이라고 입력해주세요.");
                state.gameInProgress = false; // 게임 종료
                state.secretNumber = 0; // 정답 초기화
            }
        } else {
            // 게임 중인데 숫자가 아닌 다른 메시지를 보냈을 경우
            msg.reply("게임이 진행 중입니다. 1부터 100 사이의 유효한 숫자를 입력해주세요. (남은 기회: " + state.remainingChances + "번)");
        }
    }
    // 3. 게임이 진행 중이 아닐 때 숫자가 아닌 다른 메시지 처리
    else if (content.length > 0) { // 비어있지 않은 메시지에만 반응
        // 게임 시작 명령어가 아니거나, 게임이 진행 중이 아닐 때의 일반적인 안내
        // msg.reply("숫자 맞히기 게임을 시작하려면 '숫자게임 시작'이라고 입력해주세요.");
    }
});

5
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요