Files
gitlab-notification/src/main/java/com/tsc/bitbucketbot/utils/Message.java

163 lines
7.4 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.tsc.bitbucketbot.utils;
import com.tsc.bitbucketbot.domain.PullRequestStatus;
import com.tsc.bitbucketbot.domain.entity.PullRequest;
import com.tsc.bitbucketbot.domain.util.ReviewerChange;
import lombok.NonNull;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static com.tsc.bitbucketbot.domain.util.ReviewerChange.Type.*;
/**
* Генерирует сообщения для отправки.
*
* @author upagge [07.02.2020]
*/
public class Message {
private static final UpdateDataComparator COMPARATOR = new UpdateDataComparator();
private static final Integer PR_COUNT = 4;
private Message() {
throw new IllegalStateException("Утилитарный класс");
}
@NonNull
public static String newPullRequest(PullRequest pullRequest) {
return Smile.FUN + " *Новый Pull Request*" + Smile.BREAK +
linkPr(pullRequest.getName(), pullRequest.getUrl()) +
Smile.HR +
Smile.AUTHOR + ": " + pullRequest.getAuthor().getLogin() +
Smile.TWO_BREAK;
}
@NonNull
public static String statusPullRequest(String name, String url, PullRequestStatus oldStatus, PullRequestStatus newStatus) {
return Smile.PEN + " *Изменился статус вашего ПР*" + Smile.HR +
linkPr(name, url) + Smile.BREAK +
oldStatus.name() + " -> " + newStatus.name() +
Smile.TWO_BREAK;
}
@NonNull
public static Optional<String> statusReviewers(PullRequest pullRequest, List<ReviewerChange> reviewerChanges) {
StringBuilder stringBuilder = new StringBuilder();
final Map<ReviewerChange.Type, List<ReviewerChange>> changes = reviewerChanges.stream()
.collect(Collectors.groupingBy(ReviewerChange::getType));
if (changes.containsKey(OLD)) {
stringBuilder.append(Smile.BREAK).append("Изменили свое решение:").append(Smile.BREAK);
changes.get(OLD).forEach(
change -> stringBuilder
.append(Smile.AUTHOR).append(change.getName()).append(": ")
.append(change.getOldStatus().getValue()).append(" -> ")
.append(change.getStatus().getValue())
.append(Smile.BREAK)
);
}
if (changes.containsKey(NEW)) {
stringBuilder.append(Smile.BREAK).append("Новые ревьюверы:").append(Smile.BREAK);
changes.get(NEW).forEach(
change -> stringBuilder
.append(change.getName()).append(" (").append(change.getStatus().getValue()).append(")")
.append(Smile.BREAK)
);
}
if (changes.containsKey(DELETED)) {
stringBuilder.append(Smile.BREAK).append("Не выдержали ревью:").append(Smile.BREAK)
.append(
changes.get(DELETED).stream()
.map(ReviewerChange::getName).collect(Collectors.joining(","))
);
}
final String createMessage = stringBuilder.toString();
if (!Smile.Constants.EMPTY.equalsIgnoreCase(createMessage)) {
return Optional.of(
Smile.PEN + " *Изменения ревьюверов вашего ПР*" +
Smile.HR +
linkPr(pullRequest.getName(), pullRequest.getUrl()) + Smile.BREAK +
createMessage
);
}
return Optional.empty();
}
@NonNull
public static String updatePullRequest(String pullRequestName, String prUrl, String author) {
return Smile.UPDATE + " *Обновление Pull Request*" + Smile.BREAK +
linkPr(pullRequestName, prUrl) +
Smile.HR +
Smile.AUTHOR + ": " + author +
Smile.TWO_BREAK;
}
@NonNull
public static String goodMorningStatistic(List<PullRequest> pullRequests) {
StringBuilder message = new StringBuilder().append(Smile.SUN).append(" Доброе утро ").append(Smile.SUN).append(Smile.HR);
if (!pullRequests.isEmpty()) {
message.append("Сегодня тебя ждет проверка целых ").append(pullRequests.size()).append(" ПР!").append(Smile.TWO_BREAK)
.append("Топ старых ПР:").append(Smile.BREAK);
List<PullRequest> oldPr = pullRequests.stream()
.sorted(COMPARATOR)
.limit(PR_COUNT)
.collect(Collectors.toList());
oldPr.forEach(
pullRequest -> message.append(topPr(pullRequest))
);
Set<Long> oldPrIds = oldPr.stream().map(PullRequest::getId).collect(Collectors.toSet());
if (pullRequests.size() > PR_COUNT) {
message.append(Smile.BREAK).append("Свежие ПР:").append(Smile.BREAK);
pullRequests
.stream()
.filter(pullRequest -> !oldPrIds.contains(pullRequest.getId()))
.sorted(COMPARATOR.reversed())
.limit(PR_COUNT)
.forEach(
pullRequest -> message.append(topPr(pullRequest))
);
}
} else {
message.append("Ты либо самый лучший работник, либо тебе не доверяют проверку ПР ").append(Smile.MEGA_FUN).append(Smile.TWO_BREAK)
.append("Поздравляю, у тебя ни одного ПР на проверку!").append(Smile.BREAK);
}
if (dayX()) {
message.append(Smile.BREAK).append(Smile.FUN).append(" Кстати, поздравляю, сегодня день З").append(Smile.BREAK)
.append(Smile.DANGEROUS).append("И раз такое дело, то напоминаю, что в виду независящих от разработчика условий бот работает на платном VDS. Поэтому всячески приветствуются ")
.append(linkPr("донаты на оплату сервера", "%donat_link%")).append(Smile.BREAK);
}
message
.append(Smile.BREAK)
.append("Удачного дня ").append(Smile.FLOWER).append(Smile.TWO_BREAK);
return message.toString();
}
private static String topPr(PullRequest pullRequest) {
return Smile.statusPr(pullRequest.getUpdateDate()) + " " +
linkPr(pullRequest.getName(), pullRequest.getUrl()) +
Smile.BREAK;
}
private static boolean dayX() {
int dayOfMonth = LocalDate.now().getDayOfMonth();
return dayOfMonth == 20 || dayOfMonth == 5;
}
@NonNull
private static String linkPr(String name, String url) {
return "[" + name + "](" + url + ")";
}
@NonNull
public static String goodWeekEnd() {
return "Ну вот и все! Веселых выходных " + Smile.MIG + Smile.BREAK +
"До понедельника" + Smile.BUY + Smile.TWO_BREAK;
}
}