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();
}
이건 진짜 객체지향적이지 않은것같다 사과한번 더하겠다
실행시키고 포스트맨에서 돌려봤다
잘된다
이제 사이트에 들어가지 않고도 내 폰으로 누가 글쓰면 건의사항 알림이 오기 때문에
귀찮게 확인 안하고 한 단계 더 날먹할 수 있게 되어서 기쁘다
추가적으로 답변도 저기서 할 수 있도록 해봐야겠다
부산소마고 학생회 화이팅 ~~