diff --git a/src/main/java/cholog/discord/message/GithubPullRequestMergeSubscription.java b/src/main/java/cholog/discord/message/GithubPullRequestMergeSubscription.java index 3a6fe98..b1064f4 100644 --- a/src/main/java/cholog/discord/message/GithubPullRequestMergeSubscription.java +++ b/src/main/java/cholog/discord/message/GithubPullRequestMergeSubscription.java @@ -4,6 +4,7 @@ import cholog.github.PullRequest; import cholog.github.PullRequestMergeRequest; import cholog.github.PullRequestUrl; +import feign.FeignException; import net.dv8tion.jda.api.events.message.MessageReceivedEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,12 +13,15 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Objects; +import java.util.stream.Collectors; @Component public final class GithubPullRequestMergeSubscription implements MessageSubscription { private static final Logger log = LoggerFactory.getLogger(GithubPullRequestMergeSubscription.class); + public static final String DONE_EMOJI_ID = "1189497983142727770"; + private final MessagesProperties properties; private final GithubApi githubApi; @@ -83,23 +87,33 @@ public void onEvent(final MessageReceivedEvent event) { pullRequest.head().sha(), PullRequestMergeRequest.MergeMethod.SQUASH ); - final var mergeResult = githubApi.mergePullRequest( - pullRequestUrl.owner(), - pullRequestUrl.repository(), - pullRequestUrl.pullNumber(), - mergeRequest - ); - if (!mergeResult.merged()) { - fails.put(url, mergeResult.message()); + try { + final var mergeResult = githubApi.mergePullRequest( + pullRequestUrl.owner(), + pullRequestUrl.repository(), + pullRequestUrl.pullNumber(), + mergeRequest + ); + if (!mergeResult.merged()) { + fails.put(url, mergeResult.message()); + } + } catch (final FeignException e) { + switch (e.status()) { + case 403, 404, 409, 422 -> { + log.error("Failed to merge PR [url={}]", url, e); + fails.put(url, "PR 머지에 실패했습니다. 관리자에게 문의해주세요."); + } + case 405 -> fails.put(url, "이 PR은 머지할 수 없습니다. 머지가 가능한 상태인지 확인해주세요."); + } } } - final var doneEmoji = Objects.requireNonNull(message.getJDA().getEmojiById("1189497983142727770")); + final var doneEmoji = Objects.requireNonNull(message.getJDA().getEmojiById(DONE_EMOJI_ID)); message.addReaction(doneEmoji).queue(); if (!fails.isEmpty()) { final var failMessages = fails.entrySet().stream() .map(entry -> entry.getKey() + ": " + entry.getValue()) - .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append); + .collect(Collectors.joining()); message.reply(failMessages).queue(); } }