woowacourse-bot / discord-bot

우테코 프리코스 디스코드 채널 관리 봇 (JS)
MIT License
4 stars 4 forks source link

10/29 회의록 #17

Open Ryan-Dia opened 1 year ago

Ryan-Dia commented 1 year ago

일정

2023 10/29 19:00 커뮤니케이션 : 디코

📖 의논 사항

SWARVY commented 1 year ago

로직 분리 리팩터링 파트 분배를 정해야하지 않을까 생각합니다~

jinyoung234 commented 1 year ago

release note 적는거 좋다고 생각해요~

Ryan-Dia commented 1 year ago

https://github.com/CorwinDev/Discord-Bot/tree/main/src
네 여기 참고하면서 파일 구조 만들죵

Ryan-Dia commented 1 year ago

먼저 기존 채널의 권한을 변경하는 기능은 어떻게 분류할까요?

cobocho commented 1 year ago

채널 권한 변경 로직을 modifyChannelPermissions.js로 분리하는게 어떨까요?

SWARVY commented 1 year ago

파일 구조 참고해본 결과 handler쪽이 가까워보이네요

Ryan-Dia commented 1 year ago

그럼 handler - channel - channelPermissions.js 로 할까여?

jinyoung234 commented 1 year ago

그럼 handler - channel - channelPermissions.js 로 할까여?

그러면 channelPermissions내에 channelCreate랑 ready 핸들러 다 넣나요? 파일을 두개로 나누면 어떨까요?

Ryan-Dia commented 1 year ago

네 나누면 좋을 것 같아요

jinyoung234 commented 1 year ago

네 나누면 좋을 것 같아요

아니면 handler - channelPermissions - 파일 2개(ready.js, channelCreate.js) 어떠신가요?

Ryan-Dia commented 1 year ago

그것도 좋은 것 같습니다.

cobocho commented 1 year ago

그러면 handlers/channel/permissions 이렇게 가시나요?

SWARVY commented 1 year ago

그럼 만들어지는건 handler - channel - permissions - ready.js, channelCreate.js 이렇게 가는건가여

Ryan-Dia commented 1 year ago

ready는 너무 추상적이지 않나용?

jinyoung234 commented 1 year ago

그러면 handlers/channel/permissions 이렇게 가시나요?

레퍼런스 자료 처럼 clientReady.js는 어떠신가요?

SWARVY commented 1 year ago

레퍼런스 자료 처럼 clientReady.js는 어떠신가요?

readyPermissions / channelCreatePermissions 같은건 어떤가여

image

Ryan-Dia commented 1 year ago

굿 이게 제일 좋네용!

다음은 인터랙션은 어떻게 할까요?

jinyoung234 commented 1 year ago
image

이런식으로 접근해보면 좋을거 같아요

Ryan-Dia commented 1 year ago

좋습니다 이제 어떻게 옮길지 이야기해보져

jinyoung234 commented 1 year ago
  1. 핸들러 부분 분리

    // example
    module.exports = async (interaction) => {
    if (!interaction.isChatInputCommand()) return;
    if (interaction.commandName === 'developer') {
    await interaction.reply('https://github.com/woowacourse-bot/discord-bot');
    }
    };
  2. 핸들러함수 사용

    
    const interactionCreateHandler = require('./events/interactionCreate');
    // ... 다른 이벤트 핸들러들도 불러옵니다.

client.on('interactionCreate', interactionCreateHandler); // ... 다른 이벤트 핸들러들도 연결합니다.



제안드려봅니다
cobocho commented 1 year ago
// .../readyPermissions.js

export default (client) => {
  console.log(`Logged in as ${client.user.tag}!`);
  try {
    // '스스로 만들기' 카테고리의 ID를 확인합니다.
    const guild = client.guilds.cache.get(process.env.APP_ID); // 해당 서버의 ID를 넣어야 합니다.
    // ...

이걸 index.js에서 client.on('ready', readyPermissions); 이렇게 적는건가요?

jinyoung234 commented 1 year ago

이걸 index.js에서 client.on('ready', readyPermissions); 이렇게 적는건가요?

저대로 쓴다면 그렇게 될거같아요

Ryan-Dia commented 1 year ago
const readyPermissions = async (client) => {
  console.log(`Logged in as ${client.user.tag}!`);
  try {
    // '스스로 만들기' 카테고리의 ID를 확인합니다.
    const guild = client.guilds.cache.get(process.env.APP_ID); // 해당 서버의 ID를 넣어야 합니다.
    const category = guild.channels.cache.find((ch) => ch.name === '스스로 만들기');
    if (!category) {
      console.error("Category '스스로 만들기' not found.");
      return;
    }

    // '스스로 만들기' 카테고리에 속한 채널들을 가져옵니다.
    const channelsInCategory = guild.channels.cache.filter((ch) => ch.parentId === category.id);
    // refactor
    // 각 채널에 권한을 설정합니다.
    channelsInCategory.forEach(async (channel) => {
      try {
        // 채널을 만든 사용자의 정보를 가져옵니다.
        const logs = await guild.fetchAuditLogs({
          limit: 100,
          type: 10,
        });
        const channelLog = logs.entries.find((entry) => entry.target.id === channel.id);
        if (!channelLog) {
          // 해당 채널의 생성 로그 항목이 없는 경우
          return;
        }

        // 생성자 ID를 가져옵니다.
        const creatorId = channelLog.executor.id;
        const creator = await channel.guild.members.fetch(creatorId);

        // 생성자에게만 'MANAGE_CHANNELS' 권한 부여
        await channel.permissionOverwrites.edit(creator.id, {
          ManageChannels: true,
        });

        // @everyone에 대한 'MANAGE_CHANNELS' 권한 제거
        await channel.permissionOverwrites.edit(guild.roles.everyone, {
          ManageChannels: false,
        });
      } catch (error) {
        console.error(`Error setting permissions for channel ${channel.name}:`, error);
      }
    });
  } catch (error) {
    console.error('Error setting permissions for channels in category:', error);
  }
};

export default readyPermissions;