Compare commits
2 Commits
80294316de
...
dcdb1d1747
Author | SHA1 | Date | |
---|---|---|---|
dcdb1d1747 | |||
607e50cb12 |
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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 |
BIN
documentation/ru/docs/features/img/notify-new-pipeline.png
Normal file
BIN
documentation/ru/docs/features/img/notify-new-pipeline.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 112 KiB |
Binary file not shown.
After Width: | Height: | Size: 101 KiB |
BIN
documentation/ru/docs/features/img/notify-new-thread.png
Normal file
BIN
documentation/ru/docs/features/img/notify-new-thread.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 185 KiB |
@ -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: — ссылка на результат работы пайплайна.
|
||||
|
||||
Оно будет содержать начальное сообщение обсуждения, ваше последнее сообщение в нем, а также два последних комментария. Таким образом вы будете понимать о чем идет речь.
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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())) {
|
||||
|
@ -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")
|
||||
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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user