Compare commits

...

2 Commits

Author SHA1 Message Date
dcdb1d1747
Небольшой рефакторинг
All checks were successful
continuous-integration/drone/push Build is passing
2023-02-26 22:21:38 +03:00
607e50cb12
Доработка документации 2023-02-26 22:20:48 +03:00
12 changed files with 150 additions and 13 deletions

View File

@ -100,5 +100,14 @@ public class Discussion {
return Optional.empty();
}
public Optional<Note> getLastNoteByUserId(Long personId) {
for (int i = notes.size() - 1; i >= 0; i--) {
final Note note = notes.get(i);
if (note.getAuthor().getId().equals(personId)) {
return Optional.of(note);
}
}
return Optional.empty();
}
}

View File

@ -321,6 +321,7 @@ public class DiscussionServiceImpl implements DiscussionService {
if (NOTIFY_WITH_CONTEXT.equals(discussionLevel)) {
final Optional<Note> prevLastNote = discussion.getPrevLastNote();
if (prevLastNote.isPresent()) {
final Note prevNote = prevLastNote.get();
notifyBuilder.previousMessage(prevNote.getBody());

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@ -24,7 +24,7 @@
Пока вы явно не нажмете :bell:, вы не будете получать никаких уведомлений. Более того, приложение даже не будет запрашивать MR и прочие сущности репозитория, не будет сохранять их в БД.
## Новый MR { id="new-mr" }
Это уведомление приходит, когда вас назначают ответственным и/или ревьювером.
Это уведомление приходит, когда вас назначают ответственным и/или ревьювером. При этом не важно когда это произошло: вас указали при создании MR, или потом заменили кого-то вами. Вы в любом случае получите уведомление.
<figure markdown>
![notify about new merge request](img/notify-new-mr.png){ loading=lazy width="500" }
@ -99,10 +99,108 @@
## Новый тред в MR
В GitLab можно создавать не просто комментарии, а треды. Если кто-то создаст такое обсуждение в вашем MR, то вы сразу об этом узнаете.
## Упоминание в треде
Допустим, кто-то упомянул вас в MR, нужен ваш совет. Автор этого MR не вы, ответственным назначали тоже не вас. Даже в этом случае вам придет уведомление, так вы не пропустите сообщения с вашим упоминанием.
Это уведомление поддерживает уровни конфиденциальности:
## Ответ в треде
Важно оставаться в теме обсуждения, поэтому при появлении новых ответов в дискуссия, в которых вы участвовали, вы получите уведомление.
1. `WITHOUT_NOTIFY` — уведомления по тредам не отправляются совсем.
2. `NOTIFY_WITHOUT_CONTEXT` — вы получаете уведомление о факте нового треда, но без текста сообщений и отправителей.
3. `NOTIFY_WITHOUT_CONTEXT` — самое подробное уведомление. Содержит текст сообщений и имена отправителей.
=== "NOTIFY_WITH_CONTEXT"
<figure markdown>
![notify about new thread in merge request](img/notify-new-thread.png){ loading=lazy width="500" }
</figure>
Уведомление содержит:
- Название MR
- Первое сообщение треда с автором треда
- Остальные сообщения треда, если таковые имеются.
=== "NOTIFY_WITHOUT_CONTEXT"
<figure markdown>
![notify about new thread in merge request](img/notify-new-thread-without-context.png){ loading=lazy width="500" }
</figure>
Уведомление содержит:
- Название MR
Доступные быстрые действия:
- Ответ в GitLab из Telegram.
- :eyes: — прочитано. Удаляет сообщение.
- :link: — ссылка на тред.
- :no_bell: — не получать уведомления по этому треду. Уведомления по другим тредам в это MR продолжат поступать.
## Новое сообщение в треде
Важно оставаться в теме обсуждения, поэтому при появлении новых ответов в тредах, в которых вы участвовали, вы получите уведомление.
Это уведомление поддерживает уровни конфиденциальности:
1. `WITHOUT_NOTIFY` — уведомления по тредам не отправляются совсем.
2. `NOTIFY_WITHOUT_CONTEXT` — вы получаете уведомление о факте нового треда, но без текста сообщений и отправителей.
3. `NOTIFY_WITHOUT_CONTEXT` — самое подробное уведомление. Содержит текст сообщений и имена отправителей.
=== "NOTIFY_WITH_CONTEXT"
<figure markdown>
![notify about new message in thread](img/notify-new-comment-in-thread.png){ loading=lazy width="500" }
</figure>
Уведомление содержит:
- Название MR
- Первое сообщение треда с автором треда
- Предпоследнее сообщение треда
- Новое сообщение треда
!!! tip ""
Такой объем информации должен помочь вам вспомнить/понять контекст обсуждения и ответить прямо из Telegram.
=== "NOTIFY_WITHOUT_CONTEXT"
<figure markdown>
![notify about new comment in thread without context](img/notify-new-comment-in-thread-without-context.png){ loading=lazy width="500" }
</figure>
Уведомление содержит:
- Название MR
Доступные быстрые действия:
- Ответ в GitLab из Telegram.
- :eyes: — прочитано. Удаляет сообщение.
- :link: — ссылка на тред.
- :no_bell: — не получать уведомления по этому треду. Уведомления по другим тредам в это MR продолжат поступать.
### Упоминание в треде
Допустим, кто-то упомянул вас в MR используя тегирование GitLab (@GitlabLogin). Автор этого MR не вы, ответственным назначали тоже не вас.
Если вы отслеживаете репозиторий этого MR, но не участвовали в дискуссии, то в этом случае вам придет уведомление. Так вы не пропустите сообщения с вашим упоминанием.
Формат и быстрые действия такие же, как у уведомления "Новое сообщение в треде".
## Уведомление о решенном треде
## Уведомление о пайплайне
Полезно сразу узнавать, что сборка закончилась успешно или упала.
<figure markdown>
![notify about new pipeline](img/notify-new-pipeline.png){ loading=lazy width="500" }
</figure>
Уведомление содержит:
- Предыдущий статус пайплайна и новый
-
Доступные быстрые действия:
- :eyes: — прочитано. Удаляет сообщение.
- :link: — ссылка на результат работы пайплайна.
Оно будет содержать начальное сообщение обсуждения, ваше последнее сообщение в нем, а также два последних комментария. Таким образом вы будете понимать о чем идет речь.

View File

@ -6,6 +6,14 @@
font-weight: 500;
}
.md-typeset h2 {
margin-top: 4rem;
}
.md-typeset h3 {
margin-top: 2.2rem;
}
@keyframes heart {
0%, 40%, 80%, 100% {
transform: scale(1);

View File

@ -5,6 +5,7 @@ import dev.struchkov.bot.gitlab.context.domain.notify.Notify;
import dev.struchkov.bot.gitlab.context.service.MessageSendService;
import dev.struchkov.bot.gitlab.telegram.service.notify.NotifyBoxAnswerGenerator;
import dev.struchkov.godfather.simple.domain.BoxAnswer;
import dev.struchkov.godfather.telegram.main.context.BoxAnswerPayload;
import dev.struchkov.godfather.telegram.simple.context.service.TelegramSending;
import lombok.NonNull;
import org.springframework.stereotype.Service;
@ -43,6 +44,7 @@ public class MessageSendTelegramService implements MessageSendService {
.map(generator -> {
final BoxAnswer answer = generator.generate(notify);
answer.setRecipientIfNull(personInformation.getTelegramId());
answer.setPayload(BoxAnswerPayload.DISABLE_WEB_PAGE_PREVIEW, true);
return answer;
})
.ifPresent(sending::send);

View File

@ -14,6 +14,7 @@ import static dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton.s
import static dev.struchkov.godfather.simple.domain.BoxAnswer.boxAnswer;
import static dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard.inlineKeyBoard;
import static dev.struchkov.godfather.telegram.domain.keyboard.button.UrlButton.urlButton;
import static dev.struchkov.haiti.utils.Checker.checkNotBlank;
import static dev.struchkov.haiti.utils.Checker.checkNotNull;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
@ -23,8 +24,15 @@ public class NewCommentNotifyGenerator implements NotifyBoxAnswerGenerator<NewCo
@Override
public BoxAnswer generate(NewCommentNotify notify) {
final StringBuilder builder = new StringBuilder(Icons.COMMENT).append(" *New answer in Thread*")
.append("\n-- -- -- merge request -- -- --\n")
final StringBuilder builder = new StringBuilder(Icons.COMMENT).append(" *New answer in Thread*");
if (checkNotBlank(notify.getDiscussionMessage()) || checkNotNull(notify.getPreviousMessage()) || checkNotNull(notify.getMessage())) {
builder.append("\n -- -- -- merge request name -- -- --\n");
} else {
builder.append(Icons.HR);
}
builder
.append(Icons.link(escapeMarkdown(notify.getMergeRequestName()), notify.getUrl()));
if (checkNotNull(notify.getDiscussionMessage())) {

View File

@ -17,6 +17,7 @@ import static dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton.s
import static dev.struchkov.godfather.simple.domain.BoxAnswer.boxAnswer;
import static dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard.inlineKeyBoard;
import static dev.struchkov.godfather.telegram.domain.keyboard.button.UrlButton.urlButton;
import static dev.struchkov.haiti.utils.Checker.checkNotBlank;
import static dev.struchkov.haiti.utils.Checker.checkNotEmpty;
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
@ -25,11 +26,21 @@ public class NewThreadNotifyGenerator implements NotifyBoxAnswerGenerator<Discus
@Override
public BoxAnswer generate(DiscussionNewNotify notify) {
final StringBuilder builder = new StringBuilder(Icons.THREAD).append(" *New Thread in your MR*")
.append("\n -- -- -- merge request -- -- --\n")
.append(Icons.link(escapeMarkdown(notify.getMergeRequestName()), notify.getUrl()))
.append("\n\n -- -- -- thread message -- -- --\n")
.append("*").append(notify.getAuthorName()).append("*: ").append(escapeMarkdown(notify.getMessageTask()));
final StringBuilder builder = new StringBuilder(Icons.THREAD).append(" *New Thread in your MR*");
if (checkNotBlank(notify.getMessageTask())) {
builder.append("\n -- -- -- merge request name -- -- --\n");
} else {
builder.append(Icons.HR);
}
builder
.append(Icons.link(escapeMarkdown(notify.getMergeRequestName()), notify.getUrl()));
if (checkNotBlank(notify.getMessageTask())) {
builder.append("\n\n -- -- -- thread first message -- -- --\n")
.append("*").append(notify.getAuthorName()).append("*: ").append(escapeMarkdown(notify.getMessageTask()));
}
final List<Pair<String, String>> notes = notify.getNotes();
if (checkNotEmpty(notes)) {