Compare commits

..

9 Commits

Author SHA1 Message Date
99c9cd5ee2
Доработка уведомлений о конфликтах MR
All checks were successful
continuous-integration/drone/push Build is passing
2023-01-30 12:33:39 +03:00
157ff0b4f0
Merge branch 'master' into develop
# Conflicts:
#	README.md
2023-01-30 10:48:08 +03:00
c13fe02b2d
Обновил README.md 2023-01-28 13:52:27 +03:00
6a1a69fa01
Обновил README.md 2023-01-28 13:51:51 +03:00
28661d5a19
Обновил README.md 2023-01-28 13:49:46 +03:00
68fd0c496b
Обновил README.md 2023-01-28 13:42:36 +03:00
Struchkov Mark
c798343973
Merge pull request #27 from uPagge/develop
Develop
2022-12-09 11:02:44 +03:00
Struchkov Mark
e8ef39cdb7
Merge pull request #26 from uPagge/develop
Develop
2022-12-04 13:24:05 +03:00
Struchkov Mark
6d6d48bf1a
Merge pull request #25 from uPagge/develop
Develop
2022-12-03 13:09:05 +03:00
13 changed files with 272 additions and 48 deletions

135
README.md
View File

@ -1,30 +1,57 @@
# Уведомления GitLab в Telegram # Уведомления GitLab в Telegram
Это приложение позволит вам получать уведомления о событиях из GitLab. Этот проект позволяет оперативно получать и настраивать персональные уведомления о событиях из GitLab.
> Статья-документация: https://struchkov.dev/blog/gitlab-telegram-bot/ > Статья о проекте: https://struchkov.dev/blog/gitlab-telegram-bot/
> > Канал в Telegram, в который публикуется информация о разработке: https://t.me/gitlab_notification
> Исходный код: https://github.com/uPagge/gitlab-notification
## Возможности бота > ⚠️На данный момент вся разработка ведется в моем Gitea: https://git.struchkov.dev/Telegram-Bots/gitlab-notification
1. Уведомление о новых MergeRequest > GitHub остается для удобства пользователей проекта, чтобы иметь возможность давать обратную связь по багам и
2. Уведомление о возникновении конфликта в MergeRequest > предложениям.
3. Уведомление о добавлении вас в новый проект
4. Уведомление о смене статуса вашего MergeRequest > ⚠️Идет активная подготовка к выпуску версии 2.0.0, в котором будут исправлены все существующие баги, а также добавлена
5. Уведомление о комментариях, в которых вас упоминают в формате @nickname > поддержка уведомлений Issue.
6. Уведомит о новой задаче в вашем MR. > На данный момент лучше использовать тег develop, вместо latest.
7. Уведомит о закрытии вашей задачи в чужом MR
8. Уведомление о Pipeline ## Основные возможности
1. Уведомление о новых Merge Request.
2. Уведомление о возникновении конфликта в MergeRequest.
3. Уведомление о появлении нового проекта.
4. Уведомление о смене статуса вашего MergeRequest.
5. Уведомление о комментариях, в которых вас упоминают в формате @nickname.
6. Уведомит о новом комментарии-треде в вашем MR.
7. Уведомит о закрытии вашего треда в чужом MR.
8. Уведомление о результате сборки.
## Как запустить ## Как запустить
1. Для начала нужно создать бота, который будет посылать вам уведомления в телеграмм. Делается это в [специальном боте](https://t.me/botfather) 1. Для начала нужно создать бота, который будет посылать вам уведомления. Делается это
2. После создания вы получите токен, сохраните его. Пример: 34534050345:FlfrleflerferfRE-ergerFLREF9ERF-NGjM в [специальном боте](https://t.me/botfather)
3. Теперь необходимо получить персональный токен в вашем gitlab. Достаточно токена на чтение. Сохраните его 2. После создания вы получите токен, сохраните его. Пример: `34534050345:FlfrleflerferfRE-ergerFLREF9ERF-NGjM`
4. Создайте базу данных gitlab_bot. **Обязательно именно такое название** 3. Теперь необходимо получить персональный токен в вашем gitlab. Достаточно токена на чтение.
4. Можно приступать к запуску 4. Можно приступать к запуску используя один из способов ниже.
### Переменные среды
* `TELEGRAM_BOT_TOKEN` -- токен, который вы получили при создание бота.
* `TELEGRAM_BOT_USERNAME` -- название, которое вы дали боту. Пример my_gitlab_bot.
* `GITLAB_PERSONAL_TOKEN` -- ваш персональный токен из GitLab.
* `TELEGRAM_PERSON_ID` -- ваш id в телеграм, можно узнать у [этого бота](https://t.me/myidbot)
* `GITLAB_URL` -- можно указать https://gitlab.com или url на ваш локальный/корпоративный GitLab строго в таком
формате http://localhost:7990.
* `DATASOURCE_URL` -- ссылка на базу данных Postgres, в следующем формате: jdbc:postgresql://localhost:5432/gitlab_bot
* `DATASOURCE_USERNAME` -- пользовать базы данных
* `DATASOURCE_PASSWORD` -- пароль пользователя базы данных
### Запуск
Есть несколько способов запуска. Для удобства я собрал проект в Docker образ, а также подготовил Docker Compose.
#### Docker
Подойдет, если вы не хотите поднимать отдельный контейнер с базой данных
### Пример запуска
``` ```
sudo docker run --name gitlab-notify \ sudo docker run --name gitlab-notify \
--env TELEGRAM_BOT_TOKEN=value \ --env TELEGRAM_BOT_TOKEN=value \
@ -38,15 +65,65 @@ sudo docker run --name gitlab-notify \
--network="host" upagge/gitlab-telegram-notify:latest --network="host" upagge/gitlab-telegram-notify:latest
``` ```
#### Переменные #### Docker Compose
* `TELEGRAM_BOT_TOKEN` -- токен, который вы получили при создание бота. Самый простой способ запуска.
* `TELEGRAM_BOT_USERNAME` -- название, которое вы дали боту. Пример my_gitlab_bot
* `GITLAB_PERSONAL_TOKEN` -- токен, который вы получили в GitLab
* `TELEGRAM_PERSON_ID` -- ваш id в телеграм, можно узнать у [этого бота](https://t.me/myidbot)
* `GITLAB_URL` -- можно указать https://gitlab.com или url на ваш локальный GitLab строго в таком формате http://localhost:7990
* `DATASOURCE_URL` -- ссылка на базу данных Postgres, в следующем формате: jdbc:postgresql://localhost:5432/gitlab_bot
* `DATASOURCE_USERNAME` -- пользовать бд
* `DATASOURCE_PASSWORD` -- пароль от бд
После этого необходимо отправить боту сообщение, чтобы пройти первичную настройку. docker-compose.yml
```yaml
version: '3.8'
services:
gitlab-bot-database:
image: postgres:15.1-alpine
restart: always
hostname: gitlab-bot-database
container_name: gitlab-bot-database
networks:
gitlab-bot:
environment:
POSTGRES_DB: "gitlab_bot"
POSTGRES_USER: "postgres"
POSTGRES_PASSWORD: ${DATASOURCE_PASSWORD}
volumes:
- gitlab-bot-database:/var/lib/postgresql/data/
gitlab-bot:
image: upagge/gitlab-telegram-notify:latest
hostname: gitlab-bot
container_name: gitlab-bot
privileged: true
networks:
gitlab-bot:
depends_on:
- gitlab-bot-database
environment:
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
TELEGRAM_BOT_USERNAME: ${TELEGRAM_BOT_USERNAME}
GITLAB_PERSONAL_TOKEN: ${GITLAB_PERSONAL_TOKEN}
TELEGRAM_PERSON_ID: ${TELEGRAM_PERSON_ID}
GITLAB_URL: ${GITLAB_URL}
DATASOURCE_URL: "jdbc:postgresql://gitlab-bot-database:5432/gitlab_bot"
DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
volumes:
gitlab-bot-database:
networks:
gitlab-bot:
```
.env
```
TELEGRAM_BOT_TOKEN=
TELEGRAM_BOT_USERNAME=
GITLAB_PERSONAL_TOKEN=
TELEGRAM_PERSON_ID=
GITLAB_URL=
DATASOURCE_USERNAME=
DATASOURCE_PASSWORD=
```
После запуска необходимо отправить боту сообщение, чтобы пройти первичную настройку.

View File

@ -0,0 +1,30 @@
package dev.struchkov.bot.gitlab.context.domain.notify.mergerequest;
import lombok.Builder;
import lombok.Getter;
@Getter
public class ConflictResolveMrNotify extends MrNotify {
public static final String TYPE = "ConflictResolveMrNotify";
private final String sourceBranch;
@Builder
private ConflictResolveMrNotify(
Long mrId,
String name,
String url,
String projectKey,
String sourceBranch
) {
super(mrId, projectKey, name, url);
this.sourceBranch = sourceBranch;
}
@Override
public String getType() {
return TYPE;
}
}

View File

@ -28,6 +28,8 @@ public interface MergeRequestRepository {
Set<Long> findAllIds(); Set<Long> findAllIds();
void disableNotify(Long mrId); void notification(boolean enable, Long mrId);
void notificationByProjectId(boolean enable, Set<Long> projectIds);
} }

View File

@ -38,6 +38,8 @@ public interface MergeRequestsService {
Set<Long> getAllIds(); Set<Long> getAllIds();
void disableNotify(@NonNull Long mrId); void notification(boolean enable, @NonNull Long mrId);
void notificationByProjectId(boolean enable, @NonNull Set<Long> projectIds);
} }

View File

@ -16,6 +16,7 @@ public class Icons {
public static final String TASK = "\uD83D\uDCBC"; public static final String TASK = "\uD83D\uDCBC";
public static final String ARROW = ""; public static final String ARROW = "";
public static final String DANGEROUS = "⚠️"; public static final String DANGEROUS = "⚠️";
public static final String GREEN_CIRCLE = "\uD83D\uDFE2";
public static final String PEN = "✏️"; public static final String PEN = "✏️";
public static final String ASSIGNEE = "\uD83C\uDFA9"; public static final String ASSIGNEE = "\uD83C\uDFA9";
public static final String BUILD = "⚙️"; public static final String BUILD = "⚙️";

View File

@ -12,6 +12,7 @@ import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequestForDiscussion;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictMrNotify; import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictMrNotify;
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictResolveMrNotify;
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForAssignee; import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForAssignee;
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForReview; import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForReview;
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.StatusMrNotify; import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.StatusMrNotify;
@ -179,7 +180,8 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
if (isChangedMr) { if (isChangedMr) {
notifyAboutStatus(oldMergeRequest, mergeRequest, project); notifyAboutStatus(oldMergeRequest, mergeRequest, project);
notifyAboutConflict(oldMergeRequest, mergeRequest, project); notifyAboutNewConflict(oldMergeRequest, mergeRequest, project);
notifyAboutResolveConflict(oldMergeRequest, mergeRequest, project);
notifyAboutUpdate(oldMergeRequest, mergeRequest, project); notifyAboutUpdate(oldMergeRequest, mergeRequest, project);
} }
@ -195,14 +197,15 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
} }
//TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление //TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление
private void notifyAssignee(AssigneeChanged assigneeChanged, MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { private void notifyAssignee(AssigneeChanged assigneeChanged, MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
switch (assigneeChanged) { switch (assigneeChanged) {
case BECOME -> case BECOME ->
sendNotifyNewAssignee(mergeRequest, project.getName(), Optional.ofNullable(oldMergeRequest.getAssignee()).map(Person::getName).orElse(null)); sendNotifyNewAssignee(mergeRequest, project.getName(), Optional.ofNullable(oldMergeRequest.getAssignee()).map(Person::getName).orElse(null));
} }
} }
//TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление ревьювера //TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление ревьювера
private void notifyReviewer(ReviewerChanged reviewerChanged, MergeRequest mergeRequest, Project project) { private void notifyReviewer(ReviewerChanged reviewerChanged, MergeRequest mergeRequest, Project project) {
switch (reviewerChanged) { switch (reviewerChanged) {
case BECOME -> sendNotifyNewMrReview(mergeRequest, project.getName()); case BECOME -> sendNotifyNewMrReview(mergeRequest, project.getName());
@ -268,8 +271,14 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
@Override @Override
@Transactional @Transactional
public void disableNotify(@NonNull Long mrId) { public void notification(boolean enable, @NonNull Long mrId) {
repository.disableNotify(mrId); repository.notification(enable, mrId);
}
@Override
@Transactional
public void notificationByProjectId(boolean enable, @NonNull Set<Long> projectIds) {
repository.notificationByProjectId(enable, projectIds);
} }
private void notifyAboutUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { private void notifyAboutUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
@ -317,7 +326,7 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
} }
} }
protected void notifyAboutConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) { protected void notifyAboutNewConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
final Long gitlabUserId = personInformation.getId(); final Long gitlabUserId = personInformation.getId();
if ( if (
!oldMergeRequest.isConflict() // У старого MR не было конфликта !oldMergeRequest.isConflict() // У старого MR не было конфликта
@ -336,6 +345,25 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
} }
} }
private void notifyAboutResolveConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
final Long gitlabUserId = personInformation.getId();
if (
oldMergeRequest.isConflict() // У старого MR был конфликт
&& !mergeRequest.isConflict() // А у нового нет
&& gitlabUserId.equals(oldMergeRequest.getAuthor().getId()) // и MR создан пользователем бота
) {
notifyService.send(
ConflictResolveMrNotify.builder()
.mrId(oldMergeRequest.getId())
.sourceBranch(oldMergeRequest.getSourceBranch())
.name(mergeRequest.getTitle())
.url(mergeRequest.getWebUrl())
.projectKey(project.getName())
.build()
);
}
}
protected void notifyAboutStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) { protected void notifyAboutStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) {
final MergeRequestState oldStatus = oldMergeRequest.getState(); final MergeRequestState oldStatus = oldMergeRequest.getState();
final MergeRequestState newStatus = newMergeRequest.getState(); final MergeRequestState newStatus = newMergeRequest.getState();

View File

@ -3,6 +3,7 @@ package dev.struchkov.bot.gitlab.core.service.parser;
import dev.struchkov.bot.gitlab.context.domain.ExistContainer; import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
import dev.struchkov.bot.gitlab.context.domain.entity.Person; import dev.struchkov.bot.gitlab.context.domain.entity.Person;
import dev.struchkov.bot.gitlab.context.domain.entity.Project; import dev.struchkov.bot.gitlab.context.domain.entity.Project;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
import dev.struchkov.bot.gitlab.context.service.PersonService; import dev.struchkov.bot.gitlab.context.service.PersonService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty; import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty;
@ -39,8 +40,8 @@ public class ProjectParser {
public static final String OWNER = "&owned=true"; public static final String OWNER = "&owned=true";
public static final String PRIVATE = "&visibility=private"; public static final String PRIVATE = "&visibility=private";
public static final String PUBLIC_OWNER = "&visibility=public&owned=true";
private final MergeRequestsService mergeRequestsService;
private final ProjectService projectService; private final ProjectService projectService;
private final PersonService personService; private final PersonService personService;
@ -99,8 +100,10 @@ public class ProjectParser {
final Project newProject = conversionService.convert(projectJson, Project.class); final Project newProject = conversionService.convert(projectJson, Project.class);
projectService.create(newProject); projectService.create(newProject);
} else { } else {
projectService.notification(true, singleton(projectJson.getId())); final Set<Long> projectId = singleton(projectJson.getId());
projectService.processing(true, singleton(projectJson.getId())); projectService.notification(true, projectId);
projectService.processing(true, projectId);
mergeRequestsService.notificationByProjectId(true, projectId);
} }
} }

View File

@ -71,8 +71,13 @@ public class MergeRequestRepositoryImpl implements MergeRequestRepository {
} }
@Override @Override
public void disableNotify(Long mrId) { public void notification(boolean enable, Long mrId) {
jpaRepository.disableNotify(mrId); jpaRepository.disableNotify(enable, mrId);
}
@Override
public void notificationByProjectId(boolean enable, Set<Long> projectIds) {
jpaRepository.notificationByProjectId(enable, projectIds);
} }
} }

View File

@ -29,7 +29,11 @@ public interface MergeRequestJpaRepository extends JpaRepositoryImplementation<M
Set<Long> findAllIds(); Set<Long> findAllIds();
@Modifying @Modifying
@Query("UPDATE MergeRequest mr SET mr.notification = false WHERE mr.id = :mrId") @Query("UPDATE MergeRequest mr SET mr.notification = :enable WHERE mr.id = :mrId")
void disableNotify(@Param("mrId") Long mrId); void disableNotify(@Param("enable") boolean enable, @Param("mrId") Long mrId);
@Modifying
@Query("UPDATE MergeRequest mr SET mr.notification = :enable WHERE mr.projectId in :projectIds")
void notificationByProjectId(@Param("enable") boolean enable, @Param("projectIds") Set<Long> projectIds);
} }

View File

@ -5,8 +5,15 @@ import dev.struchkov.bot.gitlab.context.utils.Icons;
import dev.struchkov.godfather.main.domain.BoxAnswer; import dev.struchkov.godfather.main.domain.BoxAnswer;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import static dev.struchkov.bot.gitlab.context.utils.Icons.link; import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_CONFIRMATION;
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_DISABLE_NOTIFY_MR_ID;
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_VALUE_FALSE;
import static dev.struchkov.bot.gitlab.telegram.utils.UnitName.DELETE_MESSAGE;
import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer; import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer;
import static dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton.simpleButton;
import static dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoardLine.simpleLine;
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.Strings.escapeMarkdown; import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
@Component @Component
@ -15,12 +22,24 @@ public class ConflictPrNotifyGenerator implements NotifyBoxAnswerGenerator<Confl
@Override @Override
public BoxAnswer generate(ConflictMrNotify notify) { public BoxAnswer generate(ConflictMrNotify notify) {
final StringBuilder builder = new StringBuilder(Icons.DANGEROUS).append(" *Attention! MergeRequest conflict | ").append(escapeMarkdown(notify.getProjectName())).append("*") final StringBuilder builder = new StringBuilder(Icons.DANGEROUS).append(" *Attention. MergeRequest conflict!*")
.append(Icons.HR) .append(Icons.HR)
.append(link(notify.getTitle(), notify.getUrl())); .append(escapeMarkdown(notify.getTitle()))
.append(Icons.HR)
.append(Icons.PROJECT).append(": ").append(escapeMarkdown(notify.getProjectName())).append("\n")
.append(Icons.TREE).append(": ").append(escapeMarkdown(notify.getSourceBranch()));
final String notifyMessage = builder.toString(); final String notifyMessage = builder.toString();
return boxAnswer(notifyMessage); return boxAnswer(
notifyMessage,
inlineKeyBoard(
simpleLine(
simpleButton(Icons.VIEW, DELETE_MESSAGE),
urlButton(Icons.LINK, notify.getUrl()),
simpleButton(Icons.DISABLE_NOTIFY, "[" + BUTTON_ARG_DISABLE_NOTIFY_MR_ID + ":" + notify.getMrId() + ";" + BUTTON_ARG_CONFIRMATION + ":" + BUTTON_VALUE_FALSE + "]")
)
)
);
} }
@Override @Override

View File

@ -0,0 +1,50 @@
package dev.struchkov.bot.gitlab.telegram.service.notify;
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictResolveMrNotify;
import dev.struchkov.bot.gitlab.context.utils.Icons;
import dev.struchkov.godfather.main.domain.BoxAnswer;
import org.springframework.stereotype.Component;
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_CONFIRMATION;
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_DISABLE_NOTIFY_MR_ID;
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_VALUE_FALSE;
import static dev.struchkov.bot.gitlab.telegram.utils.UnitName.DELETE_MESSAGE;
import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer;
import static dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton.simpleButton;
import static dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoardLine.simpleLine;
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.Strings.escapeMarkdown;
@Component
public class ConflictResolvePrNotifyGenerator implements NotifyBoxAnswerGenerator<ConflictResolveMrNotify> {
@Override
public BoxAnswer generate(ConflictResolveMrNotify notify) {
final StringBuilder builder = new StringBuilder(Icons.GREEN_CIRCLE).append(" *Merge request conflict resolved!*")
.append(Icons.HR)
.append(escapeMarkdown(notify.getTitle()))
.append(Icons.HR)
.append(Icons.PROJECT).append(": ").append(escapeMarkdown(notify.getProjectName())).append("\n")
.append(Icons.TREE).append(": ").append(escapeMarkdown(notify.getSourceBranch()));
final String notifyMessage = builder.toString();
return boxAnswer(
notifyMessage,
inlineKeyBoard(
simpleLine(
simpleButton(Icons.VIEW, DELETE_MESSAGE),
urlButton(Icons.LINK, notify.getUrl()),
simpleButton(Icons.DISABLE_NOTIFY, "[" + BUTTON_ARG_DISABLE_NOTIFY_MR_ID + ":" + notify.getMrId() + ";" + BUTTON_ARG_CONFIRMATION + ":" + BUTTON_VALUE_FALSE + "]")
)
)
);
}
@Override
public String getNotifyType() {
return ConflictResolveMrNotify.TYPE;
}
}

View File

@ -79,7 +79,7 @@ public class DisableNotifyMrUnit {
.orElseThrow(); .orElseThrow();
if (confirmation) { if (confirmation) {
mergeRequestsService.disableNotify(mrId); mergeRequestsService.notification(false, mrId);
scheduledExecutorService.schedule(() -> telegramSending.deleteMessage(mail.getPersonId(), clickButton.getMessageId()), 5, TimeUnit.SECONDS); scheduledExecutorService.schedule(() -> telegramSending.deleteMessage(mail.getPersonId(), clickButton.getMessageId()), 5, TimeUnit.SECONDS);
return replaceBoxAnswer(SUCCESSFULLY_DISABLED); return replaceBoxAnswer(SUCCESSFULLY_DISABLED);
} else { } else {

View File

@ -2,6 +2,7 @@ package dev.struchkov.bot.gitlab.telegram.unit.command;
import dev.struchkov.bot.gitlab.context.domain.PersonInformation; import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
import dev.struchkov.bot.gitlab.context.service.AppSettingService; import dev.struchkov.bot.gitlab.context.service.AppSettingService;
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
import dev.struchkov.bot.gitlab.context.service.ProjectService; import dev.struchkov.bot.gitlab.context.service.ProjectService;
import dev.struchkov.bot.gitlab.context.utils.Icons; import dev.struchkov.bot.gitlab.context.utils.Icons;
import dev.struchkov.bot.gitlab.telegram.utils.UnitName; import dev.struchkov.bot.gitlab.telegram.utils.UnitName;
@ -28,6 +29,7 @@ import static dev.struchkov.godfather.main.domain.BoxAnswer.replaceBoxAnswer;
public class EnableProjectNotify { public class EnableProjectNotify {
private final ProjectService projectService; private final ProjectService projectService;
private final MergeRequestsService mergeRequestsService;
private final AppSettingService settingService; private final AppSettingService settingService;
private final PersonInformation personInformation; private final PersonInformation personInformation;
@ -59,6 +61,7 @@ public class EnableProjectNotify {
final Set<Long> setProjectId = Set.of(projectId); final Set<Long> setProjectId = Set.of(projectId);
projectService.processing(true, setProjectId); projectService.processing(true, setProjectId);
projectService.notification(true, setProjectId); projectService.notification(true, setProjectId);
mergeRequestsService.notificationByProjectId(true, setProjectId);
return replaceBoxAnswer(mail.getId(), Icons.GOOD + " you will now receive notifications!"); return replaceBoxAnswer(mail.getId(), Icons.GOOD + " you will now receive notifications!");
} }
) )