학생회 일을 디스코드 봇으로 처리하기 with 스프링

우빈·2024년 1월 20일
9
post-thumbnail

2024학년도 학생회에 선발되었는데 내가 건 공약은 온라인 건의함 개발이었다.
마침 학생회 부회장님 공약도 온라인 건의함이셔서 같이 프로젝트하기로 했다.

대충 요렇게 생겨먹은 서비스인데, 그 주가 방학하기 전 주였다
그래서 방학 때 좀 자유롭게 살고싶어서 3일만에 개발 다했다

배포만하면되는데 서버가 학교에있어서 방학때 만지질 못함
3월되면 이거부터 배포해야댐

디자인 너무 이쁘다 내가 햇으면 삼류 디자인이었을텐데
부회장님이 기획이랑 명세서 디자인 다짜주셔서 편하게 개발할 수 있었음
만능이신 부회장님 무한 샤라웃 따봉 와바박 번갈아 드립니다

문제점

일단 서비스를 다만들었긴 했는데, 학생들이 건의를 할 때마다 저 사이트에
일일이 들어가서 건의사항을 확인해야했기 때문에 단점이 많았다
실시간으로 확인 불가능 + 들어가기 귀찮음 <- 이게 제일 컸음

그래서 봇같은거 하나 만들어서 학생이 건의넣을 때마다 자동으로
알람올 수 있게 해야겠다고 생각했다

제일 간단하고 빠르게 만들 수 있는 디스코드봇을 만들기로 결정함
여기서 서술하는건 스프링부트입니다 노드제이에스는 도움안될수도있음

디스코드 봇 세팅

https://discord.com/developers/applications

일단 이사이트 들어가서 로그인하고 오른쪽에 New Application 버튼누른다

그리고 봇 이름 입력하고 Create 누르면 봇이 만들어진다

대충 이런 화면이 뜨는데 왼쪽에 Bot 섹션 클릭하고

Reset Token 버튼누르면 토큰을 만들어준다 그럼 이제 거의 끝났다
만든 토큰은 복붙해놓거나 어디 저장해두자

그다음 OAuth2 섹션 -> URL Generator에 들어가서 가운데 Bot 체크

체크하면 밑에 뭐가 뜨는데 무슨 권한 줄건지 물어본다
난 그냥 나한테 메세지만 주면 돼서 Send Messages만 해놨다

그리고 스크롤하면 밑에 generatedURL이뜨는데 그거 카피한다음에
그걸로 서버 연결하면 된다

디스코드 들어가보면

잘 입양했다 이제 진짜 끝남

디스코드 봇 의존성 세팅

build.gradle 들어가서 디스코드 봇 개발을 도와줄 JDA를 설치하자

implementation 'net.dv8tion:JDA:5.0.0-beta.5'

코드 추가하고 코끼리 코 한바퀴 돌려주자 그럼 끝

디스코드 봇 개발

나는 게시글을 누가 올리면 메세지를 보내줘야했기 때문에
스프링의 PostService에서 세팅을 했다

Required생성자 어노테이션 빼고 직접 생성자를 만들어주고 코드를 넣었다

public PostService(PostRepository postRepository, UserFacade userFacade) {
        this.postRepository = postRepository;
        this.userFacade = userFacade;

        try {
            jda = JDABuilder.createDefault(BOT_TOKEN)
                    .enableIntents(GatewayIntent.GUILD_MESSAGES, GatewayIntent.DIRECT_MESSAGES)
                    .build();
            jda.awaitReady();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

솔직히 이게 객체지향적인지는 잘 모르겠는데
일단 돌아가면 되겠지 마인드로 개발해서 잘 모르겠다
global/config 이런 패키지에 분리해서 넣어놓으면 더 객체지향적일지도 모른다

스프링 알못이라 선넘은거면 죄송하다

이러고나서 같은 서비스에 메서드를 하나 만들어주자

private void sendMessage(String message, String channelId) {
        TextChannel channel = jda.getTextChannelById(channelId);
        if (channel != null) {
            channel.sendMessage(message).queue();
        }
    }

굳 이제 보내면됨

 public Long createPost(PostRequestDto dto) {
        User author = userFacade.getCurrentUser();

        postRepository.save(new Post(
                dto.getTitle(),
                dto.getContent(),
                dto.getPostType(),
                author));
		/** 디스코드봇 */
        sendMessage("히히", "1249047210572910");
		/** */
        return postRepository.count();
    }

채널 아이디라는게 필요한데, 디스코드에 들어가서 채널에 우클릭하면
채널 아이디 복사하기라는게 나온다

이걸로 채널 아이디를 얻을 수 있다
이러면 이제 누가 글을 쓰면 히히가 보내진다

완성되는걸 확인하고 난 좀 더 프롬프트를 예쁘게 꾸몄다

@Transactional
    public Long createPost(PostRequestDto dto) {
        User author = userFacade.getCurrentUser();

        postRepository.save(new Post(
                dto.getTitle(),
                dto.getContent(),
                dto.getPostType(),
                author));

        String channelId = "1198225882465189928";

        String postType = dto.getPostType().equals(PostType.SUGGESTION) ?
                "건의사항" : dto.getPostType().equals(PostType.PROJECT) ? "프로젝트 개발 요청" : "코드리뷰/멘토링";

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY년 MM월 DD일 HH시 mm분");
        String formattedDateTime = LocalDateTime.now().format(formatter);

        String message =
                "========================================================================\n" +
                "## \uD83D\uDD4A\uFE0F " + author.getName() + "님이 비둘기에 " + postType + "을 남겼어요!\n"
                + "### 제목 \n **" + dto.getTitle() + "**\n"
                + "### 내용 \n" + dto.getContent() + "\n"
                + "### 작성일 \n" + formattedDateTime + "\n"
                + "========================================================================";

        sendMessage(message, channelId);

        return postRepository.count();
    }

이건 진짜 객체지향적이지 않은것같다 사과한번 더하겠다
실행시키고 포스트맨에서 돌려봤다

잘된다

마무리

이제 사이트에 들어가지 않고도 내 폰으로 누가 글쓰면 건의사항 알림이 오기 때문에
귀찮게 확인 안하고 한 단계 더 날먹할 수 있게 되어서 기쁘다

추가적으로 답변도 저기서 할 수 있도록 해봐야겠다

부산소마고 학생회 화이팅 ~~

profile
프론트엔드 공부중

0개의 댓글