From 7f8461980e5a9c01cf826d89545923a2c1d64b97 Mon Sep 17 00:00:00 2001 From: Cho Sangwook <82208159+Sangwook02@users.noreply.github.com> Date: Tue, 27 Feb 2024 23:06:48 +0900 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=EC=9D=B4=EB=AF=B8=EC=A7=80=20?= =?UTF-8?q?=ED=83=9C=EA=B7=B8=EA=B0=80=20=EC=9E=90=EB=8F=99=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EB=90=98=EB=8A=94=20=EA=B2=83=EC=9D=84=20=EB=A7=89?= =?UTF-8?q?=EA=B3=A0=20=EC=A7=81=EC=A0=91=20=EB=B2=84=EC=A0=84=EC=9D=84=20?= =?UTF-8?q?=EC=A3=BC=EC=9E=85=20(#184)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * chore: latest가 생성되는 것을 막고 직접 버전을 주입 * chore: value 설정 제거 --- .github/workflows/production_build_deploy.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/production_build_deploy.yml b/.github/workflows/production_build_deploy.yml index 42e25ff59..b89c84e06 100644 --- a/.github/workflows/production_build_deploy.yml +++ b/.github/workflows/production_build_deploy.yml @@ -76,6 +76,8 @@ jobs: images: ${{ env.DOCKERHUB_IMAGE_FULL_NAME }} tags: | type=semver,pattern={{version}} + flavor: | + latest=false # 멀티 아키텍처 지원을 위한 QEMU 설정 - name: Set up QEMU From 3b49748196e329e4df3d45c1cbe5c7f5cc01047e Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn <91878695+uwoobeat@users.noreply.github.com> Date: Tue, 27 Feb 2024 23:14:05 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=EB=94=94=EC=8A=A4=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=AA=85=EB=A0=B9=EC=96=B4=20=EC=B1=84=EB=84=90?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=9E=98=EB=AA=BB=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=ED=95=9C=20=EC=BB=A4=EB=A7=A8=EB=93=9C=20=EC=82=AD=EC=A0=9C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20(#193)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 명령어 채널 ID 주입받도록 설정 * feat: 운영진 역할 이름 상수 추가 * feat: 명령어 채널에서 커맨드 아닌 텍스트 입력을 삭제 * feat: 디스코드 봇 상태 수정 --- .../discord/handler/NonCommandHandler.java | 37 +++++++++++++++++++ .../common/constant/DiscordConstant.java | 2 + .../gdsc/global/config/DiscordConfig.java | 2 +- .../discord/listener/NonCommandListener.java | 26 +++++++++++++ .../gdsc/global/property/DiscordProperty.java | 1 + src/main/resources/application-discord.yml | 1 + 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gdschongik/gdsc/domain/discord/handler/NonCommandHandler.java create mode 100644 src/main/java/com/gdschongik/gdsc/global/discord/listener/NonCommandListener.java diff --git a/src/main/java/com/gdschongik/gdsc/domain/discord/handler/NonCommandHandler.java b/src/main/java/com/gdschongik/gdsc/domain/discord/handler/NonCommandHandler.java new file mode 100644 index 000000000..cf9e882de --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/domain/discord/handler/NonCommandHandler.java @@ -0,0 +1,37 @@ +package com.gdschongik.gdsc.domain.discord.handler; + +import static com.gdschongik.gdsc.global.common.constant.DiscordConstant.*; + +import com.gdschongik.gdsc.global.util.DiscordUtil; +import java.util.Objects; +import lombok.RequiredArgsConstructor; +import net.dv8tion.jda.api.entities.Member; +import net.dv8tion.jda.api.entities.Role; +import net.dv8tion.jda.api.events.GenericEvent; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class NonCommandHandler implements DiscordEventHandler { + + private final DiscordUtil discordUtil; + + @Override + public void delegate(GenericEvent genericEvent) { + MessageReceivedEvent event = (MessageReceivedEvent) genericEvent; + Role adminRole = discordUtil.findRoleByName(ADMIN_ROLE_NAME); + + Member member = Objects.requireNonNull(event.getMember()); + + if (member.getUser().isBot()) { + return; + } + + if (member.getRoles().contains(adminRole)) { + return; + } + + event.getMessage().delete().queue(); + } +} diff --git a/src/main/java/com/gdschongik/gdsc/global/common/constant/DiscordConstant.java b/src/main/java/com/gdschongik/gdsc/global/common/constant/DiscordConstant.java index e33e4c6c4..64f467957 100644 --- a/src/main/java/com/gdschongik/gdsc/global/common/constant/DiscordConstant.java +++ b/src/main/java/com/gdschongik/gdsc/global/common/constant/DiscordConstant.java @@ -5,7 +5,9 @@ public class DiscordConstant { private DiscordConstant() {} // 공통 상수 + public static final String DISCORD_BOT_STATUS_CONTENT = "정상영업"; public static final String MEMBER_ROLE_NAME = "커뮤니티-멤버"; + public static final String ADMIN_ROLE_NAME = "운영진"; // 인증코드 발급 커맨드 public static final String COMMAND_NAME_ISSUING_CODE = "인증코드"; diff --git a/src/main/java/com/gdschongik/gdsc/global/config/DiscordConfig.java b/src/main/java/com/gdschongik/gdsc/global/config/DiscordConfig.java index 970b2bebc..dbfb90760 100644 --- a/src/main/java/com/gdschongik/gdsc/global/config/DiscordConfig.java +++ b/src/main/java/com/gdschongik/gdsc/global/config/DiscordConfig.java @@ -31,7 +31,7 @@ public class DiscordConfig { @ConditionalOnProperty(value = "discord.enabled", havingValue = "true", matchIfMissing = true) public JDA jda() { JDA jda = JDABuilder.createDefault(discordProperty.getToken()) - .setActivity(Activity.playing("테스트")) + .setActivity(Activity.playing(DISCORD_BOT_STATUS_CONTENT)) .enableIntents(GatewayIntent.GUILD_MESSAGES, GatewayIntent.MESSAGE_CONTENT, GatewayIntent.GUILD_MEMBERS) .setMemberCachePolicy(MemberCachePolicy.ALL) .build(); diff --git a/src/main/java/com/gdschongik/gdsc/global/discord/listener/NonCommandListener.java b/src/main/java/com/gdschongik/gdsc/global/discord/listener/NonCommandListener.java new file mode 100644 index 000000000..5fe745342 --- /dev/null +++ b/src/main/java/com/gdschongik/gdsc/global/discord/listener/NonCommandListener.java @@ -0,0 +1,26 @@ +package com.gdschongik.gdsc.global.discord.listener; + +import com.gdschongik.gdsc.domain.discord.handler.NonCommandHandler; +import com.gdschongik.gdsc.global.discord.Listener; +import com.gdschongik.gdsc.global.property.DiscordProperty; +import lombok.RequiredArgsConstructor; +import net.dv8tion.jda.api.events.message.MessageReceivedEvent; +import net.dv8tion.jda.api.hooks.ListenerAdapter; +import org.jetbrains.annotations.NotNull; + +@Listener +@RequiredArgsConstructor +public class NonCommandListener extends ListenerAdapter { + + private final DiscordProperty discordProperty; + private final NonCommandHandler nonCommandHandler; + + @Override + public void onMessageReceived(@NotNull MessageReceivedEvent event) { + String eventChannelId = event.getChannel().getId(); + + if (eventChannelId.equals(discordProperty.getCommandChannelId())) { + nonCommandHandler.delegate(event); + } + } +} diff --git a/src/main/java/com/gdschongik/gdsc/global/property/DiscordProperty.java b/src/main/java/com/gdschongik/gdsc/global/property/DiscordProperty.java index 56367fb22..860537b14 100644 --- a/src/main/java/com/gdschongik/gdsc/global/property/DiscordProperty.java +++ b/src/main/java/com/gdschongik/gdsc/global/property/DiscordProperty.java @@ -11,4 +11,5 @@ public class DiscordProperty { private final String token; private final String serverId; + private final String commandChannelId; } diff --git a/src/main/resources/application-discord.yml b/src/main/resources/application-discord.yml index fd6ab39f4..7acb534b9 100644 --- a/src/main/resources/application-discord.yml +++ b/src/main/resources/application-discord.yml @@ -1,3 +1,4 @@ discord: token: ${DISCORD_BOT_TOKEN:} server-id: ${DISCORD_SERVER_ID:} + command-channel-id: ${DISCORD_COMMAND_CHANNEL_ID:} From b4ed5b0f6e8065e5d20b534d3ad0ec93e35aa763 Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn <91878695+uwoobeat@users.noreply.github.com> Date: Tue, 27 Feb 2024 23:20:59 +0900 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=EC=86=8C=EC=85=9C=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=ED=9B=84=20=EB=A7=88=EC=A7=80=EB=A7=89=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=EA=B0=84=EC=9D=84=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=ED=95=98=EB=8F=84=EB=A1=9D?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20(#195)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: 마지막 로그인 시간을 업데이트하도록 변경 --- .../com/gdschongik/gdsc/domain/member/domain/Member.java | 6 ++++++ .../gdschongik/gdsc/global/security/CustomUserService.java | 1 + 2 files changed, 7 insertions(+) diff --git a/src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java b/src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java index aa579a899..6273b3793 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java +++ b/src/main/java/com/gdschongik/gdsc/domain/member/domain/Member.java @@ -246,4 +246,10 @@ public boolean isGrantAvailable() { return false; } } + + // 기타 로직 + + public void updateLastLoginAt() { + this.lastLoginAt = LocalDateTime.now(); + } } diff --git a/src/main/java/com/gdschongik/gdsc/global/security/CustomUserService.java b/src/main/java/com/gdschongik/gdsc/global/security/CustomUserService.java index affb8e41b..4ab53c807 100644 --- a/src/main/java/com/gdschongik/gdsc/global/security/CustomUserService.java +++ b/src/main/java/com/gdschongik/gdsc/global/security/CustomUserService.java @@ -19,6 +19,7 @@ public class CustomUserService extends DefaultOAuth2UserService { public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { OAuth2User oAuth2User = super.loadUser(userRequest); Member member = fetchOrCreate(oAuth2User); + member.updateLastLoginAt(); return new CustomOAuth2User(oAuth2User, member); } From 12dd01e69aa2f0682c57c4d330c80b3ac428a60f Mon Sep 17 00:00:00 2001 From: Jaehyun Ahn <91878695+uwoobeat@users.noreply.github.com> Date: Wed, 28 Feb 2024 00:06:26 +0900 Subject: [PATCH 4/4] =?UTF-8?q?feat:=20=EC=9E=AC=ED=95=99=EC=83=9D=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=EB=A9=94=EC=9D=BC=20=EB=AC=B8=EA=B5=AC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20CSS=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=EB=A7=81=20(#197)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit feat: 이메일 문구 수정 및 CSS 스타일링 --- .../UnivEmailVerificationLinkSendService.java | 18 ++++++++++++------ .../global/common/constant/EmailConstant.java | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationLinkSendService.java b/src/main/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationLinkSendService.java index 0de91e51b..d398625ef 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationLinkSendService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/email/application/UnivEmailVerificationLinkSendService.java @@ -34,11 +34,17 @@ public class UnivEmailVerificationLinkSendService { private final MemberUtil memberUtil; public static final Duration VERIFICATION_CODE_TIME_TO_LIVE = Duration.ofMinutes(10); - private static final String NOTIFICATION_MESSAGE = "
안녕하세요!
+GDSC Hongik 커뮤니티에 지원해주셔서 대단히 감사드립니다.
+아래의 버튼을 클릭하여 재학생 인증을 완료해주세요. 링크는 %d분 동안 유효합니다.
+ 재학생 인증하기 +감사합니다.
GDSC Hongik Team