습득 내용 & 해결 기록 일지

지갑주소 추가 디스코드 봇 & 지갑주소 구글 스프레드시트 자동

박변만 2023. 5. 4. 11:22
728x90
반응형

디스코드 봇을 만들어 /명령어 [지갑주소]를 입력하면 해당 지갑주소를 구글 스프레드시트에 자동으로 추가하는 기능을 구현해야했음.

필요 api : Google API, Discord API

 

전체 코드 

const { Client, Intents, Collection } = require('discord.js');
const { token, spreadsheetId, serverId } = require('./walletConfig.json');
const client = new Client({ intents: [Intents.FLAGS.GUILDS, Intents.FLAGS.GUILD_MESSAGES, Intents.FLAGS.GUILD_MEMBERS] });
const { google } = require('googleapis');
const auth = new google.auth.GoogleAuth({
  keyFile: './credentials.json', // 다운로드 받은 인증 정보 경로
  scopes: ['https://www.googleapis.com/auth/spreadsheets'],
});

const commandData = {
  name: 'addwallet',
  description: 'Enter your klaytn wallet address',
  options: [{
    name: 'wallet_address',
    type: 'STRING',
    description: 'Enter your Klaytn wallet address',
    required: true,
  }],
  async execute(interaction) {
    const { value } = interaction.options.get('wallet_address');
    const username = interaction.user.username + '#' + interaction.user.discriminator;

    if(username == '' || !value || !/^(0x)?[0-9a-fA-F]{40}$/i.test(value)) {
      return await interaction.reply('Invalid Klaytn wallet address!');
    } else {
      const sheets = google.sheets({ version: 'v4', auth });
  
      const readResponse = await sheets.spreadsheets.values.get({
        spreadsheetId,
        range: 'ID&Wallet!A:A',
      });
      const idData = readResponse.data.values.flat();
      if(idData.indexOf(username) == -1) {
        const writeResponse = await sheets.spreadsheets.values.append({
          spreadsheetId,
          range: 'ID&Wallet!A:B',
          valueInputOption: 'USER_ENTERED',
          insertDataOption: 'INSERT_ROWS',
          resource: {
            values: [[username, value]],
          },
        });
        console.log(`${writeResponse.data.updates.updatedRows} 개의 행이 업데이트되었습니다.`);
      } else {
        const index = idData.indexOf(username) + 1;
        const writeResponse = await sheets.spreadsheets.values.update({
          spreadsheetId,
          range: `ID&Wallet!A${index}:B${index}`,
          valueInputOption: 'USER_ENTERED',
          resource: {
            values: [[username, value]],
          },
        });
        console.log(`${writeResponse.data.updatedRows} 개의 행이 업데이트되었습니다.`);
      }
      return await interaction.reply('Add Wallet Success!');
    }
  }
}

client.commands = new Collection();
let data = [];

client.commands.set(commandData.name, commandData)
data.push({
  name: commandData.name,
  description: commandData.description,
  options: commandData.options
});

client.once('ready', async () => {
  console.log(`Logged in as ${client.user.tag}!`);
  await client.guilds.cache.get(serverId)?.commands.set(data)
});

client.on('interactionCreate', async interaction => {
  if (!interaction.isCommand()) return;
  if (!client.commands.has(interaction.commandName)) return
  const command = client.commands.get(interaction.commandName);
  try {
    await command.execute(interaction);
  } catch (error) {
    console.log(error)
  }
})

client.login(`${token}`);

 

기능 : 명령어를 입력해 지갑 주소를 입력하면 구글 스프레드 시트에 자동으로 ID와 지갑 주소 등록

지갑주소 유효성 검증, 이미 스프레드 시트에 있으면 지갑 주소 수정 

상세 코드 분석 나중에 정리 !

반응형

'습득 내용 & 해결 기록 일지' 카테고리의 다른 글

slither - 솔리디티 분석 프레임워크  (0) 2023.05.24
vue i18n 다국어 설정  (0) 2023.05.24
rust 시작하기  (0) 2023.05.18
redis 도입  (0) 2023.04.26
react coreui pagination & Search Filter  (0) 2023.04.25