6. Code Arena - asdfgl98/Project-CodeBuddy GitHub Wiki

๐Ÿ“ŒCode Arena

โœ… ๋ฐฉ ์ƒ์„ฑ ์‹œ ๋ฐฉ์žฅ ๊ถŒํ•œ ๋ถ€์—ฌ ๋ฐ ์‚ฌ์šฉ์ž ๋ชฉ๋ก ๊ฐฑ์‹ 

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ฐฉ์žฅ์ธ์ง€ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ์ƒ์„ฑ(room_host)
  • ๋ฐฉ์„ ์ž…์žฅํ•  ๋•Œ room_host์™€ ์ž…์žฅํ•˜๋Š” ์‚ฌ์šฉ์ž ์ด๋ฆ„์ด ๋™์ผํ•˜๋‹ค๋ฉด ๋ฐฉ์žฅ์œผ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ์— ์ž…์žฅ ์‹œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก ํƒญ์— ์ถ”๊ฐ€๋˜๊ณ  ๋ฐฉ์žฅ ์—ฌ๋ถ€์— ๋”ฐ๋ผ '๋ฐฉ์žฅ' ๋˜๋Š” '์ผ๋ฐ˜'์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
  • ๋ฐฉ์žฅ์€ ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•  ์ˆ˜์žˆ๋Š” Start ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋˜๊ณ , '์ผ๋ฐ˜'์€ ์ค€๋น„๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” Ready ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ปCodeDetail

๋ฐฉ ์ƒ์„ฑ์‹œ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์žฅ ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ (ํด๋ผ์ด์–ธํŠธ)


codeArenaList.js (line 65)

arenaSocket.emit("check_admin", { nickname: res.data });

// ๋ฐฉ ์ƒ์„ฑ์‹œ ๋ฐฉ์žฅ ๊ถŒํ•œ ๋ถ€์—ฌ
arenaSocket.on("admin_status", ({ isAdmin }) => {
  if (isAdmin) {
    arenaSocket["isAdmin"] = isAdmin;
    buttonDiv.style.display = "block";
    $startBtn.style.display = "block";
  }
});
๋ฐฉ ์ƒ์„ฑ์‹œ ์‹คํ–‰๋˜๋Š” ๋ฐฉ์žฅ ๊ถŒํ•œ ๋ถ€์—ฌ ์ฝ”๋“œ (์„œ๋ฒ„)


server.js (line 127)

 socket.on("check_admin", (nickname) => {
        let isAdmin = false;

        if (nickname.nickname == roomInfo.createdBy) {
          isAdmin = true;
          socket["isAdmin"] = true;
        } else {
          isAdmin = false;
        }
        socket.emit("admin_status", { isAdmin });
      });
์‚ฌ์šฉ์ž ์ž…์žฅ ์‹œ ์‚ฌ์šฉ์ž ๋ชฉ๋ก ํƒญ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜


codeArenaList.js (line 606)

const updateArenaNickname = (conn_user, room_host, room_number) => {
  const $c_a_p_user = document.querySelector(".c_a_p_user");
  conn_user.forEach((userInfo) => {
    const newUser = document.createElement("div");
    if (userInfo.ROOM_NUMBER == room_number) {
      if (room_host == userInfo.CONN_USER) {
        // ๋“ค์–ด์˜ค๋Š” ์‚ฌ๋žŒ์ด ๋ฐฉ์„ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ๋‹‰๋„ค์ž„๊ณผ ๊ฐ™๋‹ค๋ฉด? = ๋ฐฉ์žฅ์ผ ๋•Œ
        newUser.className = `c_a_p_u1`;
        newUser.innerHTML += `
        <div class="u_info">
        <div class="u_i_img">๋ฐฉ์žฅ</div>
        <div class="u_i_nick" data-user="${userInfo.CONN_USER}">${userInfo.CONN_USER}</div>
        </div>
        <div class="u_remain">
        <div div class="u_r_ques">
        <div class="u_r_circle ${userInfo.CONN_USER}" style="display:none;">ok</div>
        </div>
        </div>
        `;
        $c_a_p_user.append(newUser);
      } else {
        if (userInfo.USER_READY == "N") {
          // ์ค€๋น„ ์•ˆํ–ˆ์„ ๋•Œ
          // ๋“ค์–ด์˜ค๋Š” ์‚ฌ๋žŒ์ด ๋ฐฉ์„ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ๋‹‰๋„ค์ž„๊ณผ ๊ฐ™๋‹ค๋ฉด? = ์ผ๋ฐ˜์ผ ๋•Œ
          newUser.className = `c_a_p_u2`;
          newUser.innerHTML += `
          <div class="u_info">
          <div class="u_i_img">์ผ๋ฐ˜</div>
          <div class="u_i_nick normal_user" data-user="${userInfo.CONN_USER}">${userInfo.CONN_USER}</div>
          </div>
          <div class="u_remain">
          <div div class="u_r_ques">
          <div class="u_r_circle ${userInfo.CONN_USER}" style="display:none;">READY</div>
          </div>
          </div>
          `;
          $c_a_p_user.append(newUser);
        } else {
          // ๊ธฐ์กด์— ์ค€๋น„ํ–ˆ๋˜ ์‚ฌ๋žŒ
          // ๋“ค์–ด์˜ค๋Š” ์‚ฌ๋žŒ์ด ๋ฐฉ์„ ๋งŒ๋“  ์‚ฌ๋žŒ์˜ ๋‹‰๋„ค์ž„๊ณผ ๊ฐ™๋‹ค๋ฉด? = ์ผ๋ฐ˜์ผ ๋•Œ
          newUser.className = `c_a_p_u2`;
          newUser.innerHTML += `
          <div class="u_info">
          <div class="u_i_img">์ผ๋ฐ˜</div>
          <div class="u_i_nick normal_user" data-user="${userInfo.CONN_USER}">${userInfo.CONN_USER}</div>
          </div>
          <div class="u_remain">
          <div div class="u_r_ques">
          <div class="u_r_circle ${userInfo.CONN_USER}" style="display:block;">READY</div>
          </div>
          </div>
          `;
          $c_a_p_user.append(newUser);
        }
      }
    }
  });
};
์ž…์žฅํ•œ ์‚ฌ์šฉ์ž ๋ฐฉ์žฅ, ์ผ๋ฐ˜ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ด๋ฒคํŠธ ์‹คํ–‰(์„œ๋ฒ„)


server.js(line 390)

if (room_host != nickname) {
          ArenaNamespace.to(room_number).emit("enter_normal_user", {
            conn_user,
            room_host,
            room_number,
          });
          socket.emit("normal_user_ready");
        } else {
          ArenaNamespace.to(room_number).emit("enter_host_user", {
            conn_user,
            room_host,
            room_number,
          });
        }
์ž…์žฅํ•œ ์‚ฌ์šฉ์ž ๋ฐฉ์žฅ, ์ผ๋ฐ˜ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ด๋ฒคํŠธ ์‹คํ–‰(ํด๋ผ์ด์–ธํŠธ)


codeArenaList.js(line 570)

arenaSocket.on("enter_host_user", ({ conn_user, room_host, room_number }) => {
  const $c_a_p_user = document.querySelector(".c_a_p_user");
  const $divs = $c_a_p_user.querySelectorAll("div");
  $divs.forEach(($div) => {
    $div.remove();
  });
  // userList๋Š” ์ „์ฒด ์œ ์ €๊ฐ€ ์ž…์žฅํ•œ ๋ฐฉ๋ฒˆํ˜ธ์™€ ๋‹‰๋„ค์ž„์„ ๊ฐ์ฒด๋กœ ๋ฐฐ์—ด์— ๋„ฃ์€ ๊ฒƒ
  // room_number๋Š” ์ž…์žฅํ•˜๋Š” ๋ฐฉ์˜ ๋ฒˆํ˜ธ
  // room_host๋Š” ์ž…์žฅํ•˜๋Š” ๋ฐฉ์„ ๋งŒ๋“  ์ด
  updateArenaNickname(conn_user, room_host, room_number);
});

arenaSocket.on("enter_normal_user", ({ conn_user, room_host, room_number }) => {
  const $c_a_p_user = document.querySelector(".c_a_p_user");
  const $divs = $c_a_p_user.querySelectorAll("div");
  $divs.forEach(($div) => {
    $div.remove();
  });
  updateArenaNickname(conn_user, room_host, room_number);
});

arenaSocket.on("normal_user_ready", () => {
  buttonDiv.style.display = "block";
  $readyBtn.style.display = "block";
  $startBtn.style.display = "none";
});

๐Ÿ–ผ๏ธ Preview

๋ฐฉ ์ƒ์„ฑ ๋ฐ ์ž…์žฅ.gif

๋ฐฉ์ƒ์„ฑ ๋ฐ ์ž…์žฅ

โœ… ๊ฒŒ์ž„ Start ๊ธฐ๋Šฅ

  • ๋ฐฉ์žฅ์ด ๊ฒŒ์ž„์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฉ์— ์ž…์žฅํ•œ ์‚ฌ์šฉ์ž ์ค‘ ๋ฐฉ์žฅ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ Ready๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฉ์žฅ์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ์ž…์žฅํ•  ๋•Œ, Ready ๊ฐ’์ด 'N'์ธ ์ƒํƒœ๋กœ DB์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Ready๋ฅผ ํด๋ฆญํ•˜๋ฉด axios๋ฅผ ํ†ตํ•ด DB๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ Ready ๊ฐ’์ด 'Y'๋˜๋Š” 'N'์œผ๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋˜๊ณ ,
    ๋ชจ๋“  ์ธ์›์˜ Ready ๊ฐ’์ด 'Y'์ผ ๋•Œ ๋ฐฉ์žฅ์ด Start๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ฒŒ์ž„์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
  • axios๋ฅผ ํ†ตํ•ด Start / Ready ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, DB์— ์ ‘๊ทผํ•˜์—ฌ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ Ready ๊ฐ’์„ ์ˆ˜์ • ๋ฐ ์กฐํšŒ ํ•œ ํ›„, ๊ฐ’์— ๋”ฐ๋ฅธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ปCodeDetail

์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์ค€๋น„ ์™„๋ฃŒ/ ์ทจ์†Œ ๊ธฐ๋Šฅ


codeArenaList.js (line 330)

// ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์ค€๋น„ ์™„๋ฃŒ / ์ทจ์†Œ ๊ธฐ๋Šฅ

// ๋ ˆ๋”” ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
const ready = () => {
  arenaSocket.emit("click_ready_btn", { nickName: currentNickname });
};
// ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก
$readyBtn.addEventListener("click", ready);

// DB์— ์ ‘๊ทผํ•˜์—ฌ Ready ๊ฐ’ ๋ณ€๊ฒฝ
arenaSocket.on("my_ready", (data) => {
  axios.post("/codeArena/codeReady", { data }).then((res) => {
    let data = JSON.parse(res.data);
    arenaSocket.emit("update_ready", data[0]);
  });
});

// ์ค€๋น„ / ์ค€๋น„ ์ทจ์†Œ ๊ธฐ๋Šฅ
arenaSocket.on("ready_on", (data) => {
  let $normal_user = document.querySelectorAll(".normal_user"); // ๋“ค์–ด์˜จ ์ผ๋ฐ˜์œ ์ € ๋‹‰๋„ค์ž„ ํƒœ๊ทธ ์ „๋ถ€ ๊ฐ€์ ธ์˜ค๊ธฐ
  let click_nickname = data.nickName; // ํด๋ฆญํ•œ ์‚ฌ์šฉ์ž์˜ ๋‹‰๋„ค์ž„
  let roomNum = data.roomNum; // ํด๋ฆญํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์†ํ•ด์žˆ๋Š” ๋ฐฉ ๋ฒˆํ˜ธ
  let isReady = data.isReady;

  $normal_user.forEach((user_nick) => {
    // user_nick : ๊ฐ ์ผ๋ฐ˜์œ ์ €์˜ ๋‹‰๋„ค์ž„
    let foreach_nickname = user_nick.dataset.user;

    if (isReady == "Y") {
      // ์ค€๋น„X => ์ค€๋น„
      if (click_nickname == foreach_nickname) {
        // ํด๋ฆญํ•œ ์‚ฌ์šฉ์ž๋งŒ ํ™œ์„ฑํ™” ํ•˜๊ธฐ์œ„ํ•ด
        let ready_on = document.querySelector(`.${foreach_nickname}`);
        ready_on.style.display = "block"; // ์ค€๋น„ ํ‘œ์‹œ ํ™œ์„ฑํ™”
        arenaSocket.emit("ready_count_up"); // ํ˜„์žฌ ์ค€๋น„ํ•œ ์ธ์›์ˆ˜+ ์ฒดํฌ
      }
    } else {
      // ์ค€๋น„ => ์ค€๋น„X
      if (click_nickname == foreach_nickname) {
        // ํด๋ฆญํ•œ ์‚ฌ์šฉ์ž๋งŒ ํ™œ์„ฑํ™” ํ•˜๊ธฐ์œ„ํ•ด
        let ready_on = document.querySelector(`.${foreach_nickname}`);
        ready_on.style.display = "none"; // ์ค€๋น„ ํ‘œ์‹œ ๋น„ํ™œ์„ฑํ™”
        // ์—ฌ๊ธฐ์—๋‹ค๊ฐ€ DB USER_READY๋ฅผ N๋กœ ๋ณ€๊ฒฝ
        arenaSocket.emit("ready_count_down"); // ํ˜„์žฌ ์ค€๋น„ํ•œ ์ธ์›์ˆ˜- ์ฒดํฌ
      }
    }
  });
});
Ready๋ฅผ ํ•œ ์ธ์›์ˆ˜ ์นด์šดํŠธ


codeArenaList.js (line 379)

// Ready ํ•œ ์ธ์›์ˆ˜ ์นด์šดํŠธ
let ready_count;
let currentUsers;

arenaSocket.on("user_count", (user_count) => {
  currentUsers = user_count.user_count;
});

arenaSocket.on("ready_count", () => {
  axios
    .post("/codeArena/readyCount", { roomNum: arenaSocket.roomNum })
    .then((res) => {
      let arenaUsers = JSON.parse(res.data);
      ready_count = arenaUsers[0].COUNT;
    });
});

๋ฐฉ์žฅ Start ๋ฒ„ํŠผ ํด๋ฆญ ๋กœ์ง


codeArenaList.js (line 396)

// ๋ฐฉ์žฅ์ด start ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ
$startBtn.addEventListener("click", () => {
  
  if (arenaSocket.isAdmin) {
    currentUsers = parseInt(currentUsers);
    ready_count = parseInt(ready_count);
    if (currentUsers - 1 == ready_count) {
      arenaSocket.emit("click_start_btn");

      $startBtn.style.display = "none";
      buttonDiv.style.display = "none";
      TIMER();
      question_div.style.display = "block";
      question_div2.style.display = "block";
    }
    else { // ์‹œ์ž‘ ์กฐ๊ฑด ๋ฏธ์ถฉ์กฑ์ผ ๋•Œ ํด๋ฆญ ์‹œ start ๋นจ๊ฐ„์ƒ‰ => ํ•˜์–€์ƒ‰
      $startBtn.classList.add("clicked"); // clicked ํด๋ž˜์Šค ์ถ”๊ฐ€
      setTimeout(() => {
        $startBtn.classList.remove("clicked")
      }, 500)
    }
  }
  //code editor ๊ธฐ๋ณธ ๊ฐ’ ์ž…๋ ฅ
  js.setValue(`function codeBuddy(n){
      let result;
      result = ์ •๋‹ต์„์ž…๋ ฅํ•˜์„ธ์š”;
      return result;
  }`);
});

//๋ฐฉ์žฅ์ด Game ์‹œ์ž‘์‹œ ๋ชจ๋“ ์œ ์ € ready Y -> N ๋ณ€๊ฒฝ
arenaSocket.on('gameStart',(roomNum)=>{
  axios.post('/codeArena/gameStart', {roomNum})
})

// ๋ฐฉ์žฅ์ด Game ์‹œ์ž‘์‹œ ๋ชจ๋“ ์œ ์ € ready ํ‘œ์‹œ ํ•ด์ œ
arenaSocket.on("remove_ok", () => {
  let green_ok = document.querySelectorAll(".u_r_circle")
  green_ok.forEach((ok) => {
    ok.style.display = "none"
  })
})

๐Ÿ–ผ๏ธ Preview

Start Game.gif

Start

โœ… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด ์„ฑ๊ณต ์‹œ ์ƒํƒœ ๋ณ€ํ™”

  • ์ฃผ์–ด์ง„ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ณ , ์ฝ”๋“œ ์‹คํ–‰์„ ํด๋ฆญํ•˜๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ถœ๋ ฅ ๋ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์‹คํ–‰ ํด๋ฆญ ์‹œ, axios๋กœ '๋ฌธ์ œ ๋ฒˆํ˜ธ'์— ๋Œ€ํ•œ ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’(์ •๋‹ต)์„ DB์—์„œ ์‘๋‹ต ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  Code Editor์— ์ž‘์„ฑํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜(value) ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์ž…๋ ฅ ๊ฐ’์„ ๋Œ€์ž…ํ•ด ์‹คํ–‰์‹œํ‚จ ๊ฒฐ๊ณผ ๊ฐ’๊ณผ, ์ถœ๋ ฅ ๊ฐ’์„ ๊ฒ€์ฆํ•ด์„œ
  • ์ •๋‹ต ์œ ๋ฌด๋ฅผ ํŒ๋‹จํ•˜์—ฌ iframe์— ์ถœ๋ ฅํ•ด์ค๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ์ œ์ถœ ํด๋ฆญ ์‹œ, ์ฝ”๋“œ ์‹คํ–‰๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰์‹œ์ผœ ๊ฒ€์ฆ ํ›„, ์ •๋‹ต์ด๋ผ๋ฉด ok ์•„์ด์ฝ˜์ด ํ™œ์„ฑํ™” ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฉ ์ธ์›์ด ๋ชจ๋‘ ok ์•„์ด์ฝ˜์ด ํ™œ์„ฑํ™” ๋˜์—ˆ์„ ๋•Œ, ๊ฒŒ์ž„์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ปCodeDetail

์ฝ”๋“œ ์‹คํ–‰ ๋ฒ„ํŠผ ํด๋ฆญ์ด๋ฒคํŠธ


codeArena.js (line 751)

    // ์ฝ”๋“œ์‹คํ–‰ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
    codeStart.addEventListener('click', async(e)=>{
      e.preventDefault()
       // codeStart ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๋ฌธ์ œ๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š” ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’ database์—์„œ ๋ฐ˜ํ™˜
       const res = await axios.post('/codeArena/codeStart', {jsValue})
       .then(res=>{
         let data = JSON.parse(res.data)
         //์ž…๋ ฅ๊ฐ’
         let resultInput = data[0].RESULT_INPUT
         //์ถœ๋ ฅ๊ฐ’
         let resultOutput = data[0].RESULT_OUTPUT   

         // script ํƒœ๊ทธ ์ƒ์„ฑ
         const scriptElement = document.createElement("script");
         // ์ƒ์„ฑํ•œ script ํƒœ๊ทธ์•ˆ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’ ์ถ”๊ฐ€
         scriptElement.innerHTML = `var n = ${resultInput};
                                    var outPut = ${resultOutput};
                                    ${jsValue};
                                    try{
                                     console.log('์ฝ”๋“œ์‹คํ–‰์ค‘');
                                       if(typeof codeBuddy !== 'undefined'){
                                          if(codeBuddy(n) == outPut){
                                            let data = startResult = '์ž‘์„ฑํ•œ ํ•จ์ˆ˜์—' + n + '๋ฅผ ๋Œ€์ž…ํ•œ ๊ฒฐ๊ณผ๋Š” ' + codeBuddy(n) + '์ž…๋‹ˆ๋‹ค.'
                                            document.body.innerHTML = '์ •๋‹ต์ž…๋‹ˆ๋‹ค.<br>'+data                                           
                                            
                                          }
                                          else{                                            
                                            let data = startResult = '์ž‘์„ฑํ•œ ํ•จ์ˆ˜์—' + n + '๋ฅผ ๋Œ€์ž…ํ•œ ๊ฒฐ๊ณผ๋Š” ' + codeBuddy(n) + '์ž…๋‹ˆ๋‹ค.'
                                            document.body.innerHTML = 'ํ‹€๋ ธ์Šต๋‹ˆ๋‹ค.<br>'+data 
                                          
                                          }
                                        }
                                       else {
                                         throw new Error('codeBuddy ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.');
                                       }
                                     }
                                     catch(err){
                                       console.error('์—๋Ÿฌ๋ฐœ์ƒ',err);
                                       var body = document.body                      
                                       body.innerHTML = err
                                       body.style.color = 'red'
                                     }
                                     `
                                     
         
         // script๋ฅผ body ํƒœ๊ทธ ์•ˆ์— ์ถ”๊ฐ€(script๊ฐ€ ์ •์ƒ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ์œ„ํ•จ)
         outPut.contentWindow.document.body.appendChild(scriptElement);
         
         
       })

    })
  

์ฝ”๋“œ ์ œ์ถœ ๋ฒ„ํŠผ ํด๋ฆญ์ด๋ฒคํŠธ


codeArenaList.js (line 805)

    // ์ฝ”๋“œ์ œ์ถœ ๋ฒ„ํŠผ ํด๋ฆญ ์ด๋ฒคํŠธ
    codeSubmit.addEventListener('click', async(e)=>{
      e.preventDefault()
      // codeStart ์š”์ฒญ์„ ๋ณด๋‚ด์„œ ๋ฌธ์ œ๋ฒˆํ˜ธ์™€ ์ผ์น˜ํ•˜๋Š” ์ž…๋ ฅ๊ฐ’๊ณผ ์ถœ๋ ฅ๊ฐ’ database์—์„œ ๋ฐ˜ํ™˜
      const res = await axios.post('/codeArena/codeStart', {jsValue})
        .then(res=>{
          let data = JSON.parse(res.data)
          //์ž…๋ ฅ๊ฐ’
          let resultInput = data[0].RESULT_INPUT
          //์ถœ๋ ฅ๊ฐ’
          let resultOutput = data[0].RESULT_OUTPUT   

          // script ํƒœ๊ทธ ์ƒ์„ฑ
          const scriptElement = document.createElement("script");
          // ์ƒ์„ฑํ•œ script ํƒœ๊ทธ์•ˆ์— ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’ ์ถ”๊ฐ€
          scriptElement.innerHTML = `
                                     var n = ${resultInput};
                                     var outPut1 = ${resultOutput};
                                     var name = '${currentNickname}';
                                     var startResult;
                                     ${jsValue};
                                     try{
                                      if(typeof codeBuddy !== 'undefined'){
                                        if(codeBuddy(n) == outPut1){
                                          let data = startResult = '์ž‘์„ฑํ•œ ํ•จ์ˆ˜์—' + n + '๋ฅผ ๋Œ€์ž…ํ•œ ๊ฒฐ๊ณผ๋Š” ' + codeBuddy(n) + '์ž…๋‹ˆ๋‹ค.'
                                          let userS = document.querySelectorAll('.u_i_nick')
                                          userS.forEach((user)=>{
                                            if(name == user.dataset.user){                                              
                                              arenaSocket.emit('please', name)
                                              arenaSocket.emit('pleaesRoomNum')
                                            }
                                          })
                                          
                                        }
                                        else{                                            
                                          let data = startResult = '์ž‘์„ฑํ•œ ํ•จ์ˆ˜์—' + n + '๋ฅผ ๋Œ€์ž…ํ•œ ๊ฒฐ๊ณผ๋Š” ' + codeBuddy(n) + '์ž…๋‹ˆ๋‹ค.'
                                        }
                                      }
                                      else {
                                        throw new Error('codeBuddy ํ•จ์ˆ˜๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.');
                                      }
                                    }              
                                      catch(err){
                                        console.error('์—๋Ÿฌ๋ฐœ์ƒ',err);
                                    
                                      }
                                      `
                                      
          
          // script๋ฅผ body ํƒœ๊ทธ ์•ˆ์— ์ถ”๊ฐ€(script๊ฐ€ ์ •์ƒ์ž‘๋™ํ•˜๊ฒŒ ํ•˜๊ธฐ์œ„ํ•จ)
          document.body.appendChild(scriptElement);
          
          
        })
    })
๋ฌธ์ œ ์ •๋‹ต ์‹œ ์‹คํ–‰๋กœ์ง

codeArenaList.js (line 862)

// ์ •๋‹ต ์ œ์ถœํ•œ ์‚ฌ์šฉ์ž ok ์•„์ด์ฝ˜ ํ™œ์„ฑํ™”
arenaSocket.on('testSucess',(data)=>{
  let name = data
  let check = document.querySelector(`.${data}`)
  check.style.display = 'block'
  check.innerText = 'ok'

})

// ์ „์ฒด ์‚ฌ์šฉ์ž ๋ชจ๋‘ ์ •๋‹ต์‹œ ๊ฒŒ์ž„ ์ข…๋ฃŒ
arenaSocket.on('okRoomNum',(data)=>{
  let data1 = data.roomNum
  axios.post('/codeArena/testSucess',{roomNum:data1, name:currentNickname})
    .then(res=>{
      let data = JSON.parse(res.data)
      data = data.COUNT
      if(data == currentUsers){
        arenaSocket.emit('gameSet')
      }
    })
})

๐Ÿ–ผ๏ธ Preview

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด.gif

๋ฌธ์ œํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด ์ƒ์„ธ.gif

์•Œ๊ณ ๋ฆฌ์ฆ˜ํ’€์ด ์ƒ์„ธ

โš ๏ธ **GitHub.com Fallback** โš ๏ธ