요구사항
사내 시스템에서 유저가 어떠한 서비스 예약을 하면 예약 시간 5분 전에 슬랙 메세지로 리마인드 하는 기능을 구현 요청
바로 메세지 발송하는 건 찾아보면 많은데 예약은 잘못 찾겠어서 참고용으로 남기려한당
pom.xml 에 Slack 라이브러리 추가
<!-- start:: slack api -->
<!-- https://mvnrepository.com/artifact/com.slack.api/slack-api-client -->
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>slack-api-client</artifactId>
<version>1.6.2</version>
</dependency>
슬랙 메세지 텍스트 세팅~, properties에 입력된 slack token 조회
슬렉 메세지에 이모지를 넣고 싶으면 :pray: 처럼 넣으면 된당
public final static int BEFORE_MINUTE = 5;
public final static String SCHEDULE_TEXT =
"예약시간 " + BEFORE_MINUTE + "분 전입니다.\n" +
"늦지 않게 방문해주세요. :pray:";
@Value("${slack.token}")
private String slackToken;
슬랙 예약 메세지 발송, 삭제 메서드
삭제는 메세지 발송 return인 ChatScheduleMessageResponse Class에서 받은 messageId, channel 을 parameter로 사용한다
public ChatScheduleMessageResponse scheduleMessage(LocalTime time){
LocalDateTime reserveTime = time.minusMinutes(BEFORE_MINUTE);
try {
String slackId = getSlackId();
return Slack.getInstance().methods(slackToken)
.chatScheduleMessage(r -> r.postAt((int) reserveTime.atZone(ZoneId.systemDefault()).toEpochSecond())
.text(SCHEDULE_TEXT)
.channel(slackId));
} catch (Exception e) {
return new ChatScheduleMessageResponse();
}
}
private String getSlackId() throws IOException, SlackApiException {
return Slack.getInstance().methods(slackToken)
.usersLookupByEmail(r -> r.email(이메일~~)
.getUser()
.getId();
}
public void deleteMessage(String channelId, String messageId){
try {
Slack.getInstance().methods(slackToken)
.chatDeleteScheduledMessage(r -> r.scheduledMessageId(messageId)
.channel(channelId));
} catch (Exception ignored) {
}
}