策略枚举:
/**
* webhook策略枚举
* Date : 2023/8/17 22:33
*
* @author xiaobai.jzm
*/
public enum WebHookTypeEnum {
GENERAL("general", "普通的"),
FEI_SHU("open.feishu.cn", "飞书消息"),
WE_CHAT("qyapi.weixin.qq.com", "企业微信消息");
private String hookUri;
private String desc;
public static WebHookTypeEnum getStrategy(String url) {
for (WebHookTypeEnum webHooksTypeEnum : WebHookTypeEnum.values()) {
if (url.contains(webHooksTypeEnum.hookUri)) {
return webHooksTypeEnum;
}
}
//默认策略
return GENERAL;
}
WebHookTypeEnum(String strategy, String desc) {
this.hookUri = strategy;
this.desc = desc;
}
public String getDesc() {
return desc;
}
public String getHookUri() {
return hookUri;
}
}
请求参数策略接口:
/**
* webhooks 请求参数策略
*
* Date : 2023/8/18 10:45
* @author xiaobai.jzm
*/
public interface WebHookStrategy {
/**
* 获取webhook请求参数对象
*
* @return
*/
Object getRequestParameters(WebHookSendParamsModel webHookSendParamsModel);
/**
* 获取webhook类型
*
* @return
*/
WebHookTypeEnum getWebHookType();
}
请求参数策略接口具体实现:
/**
* 飞书群机器人消息请求参数策略
* Date : 2023/8/18 11:09
*
* @author xiaobai.jzm
*/
@Slf4j
@Service
public class FeiShuWebHookStrategy implements WebHookStrategy {
@Override
public Object getRequestParameters(WebHookSendParamsModel webHookSendParamsModel) {
String title = "";
List<FeiShuRichTextFormatModel> modelList = new ArrayList<>();
if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.PUSH)) {
title = "推送提醒";
PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
modelList.add(getPushParams(pushEventsData));
} else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.TAG_PUSH)) {
title = "标签推送提醒";
PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
modelList.add(getTagPushParams(pushEventsData));
} else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.NOTE)) {
title = "评论提醒";
//旧版评论
if (webHookSendParamsModel.getObject() instanceof NoteWebHookDataDTO) {
NoteWebHookDataDTO noteWebHookDataDTO = (NoteWebHookDataDTO) webHookSendParamsModel.getObject();
modelList.add(getNoteParams(noteWebHookDataDTO));
}
//新版评论
else if (webHookSendParamsModel.getObject() instanceof CodeupCommentHookData) {
CodeupCommentHookData noteWebHookDataDTO = (CodeupCommentHookData) webHookSendParamsModel.getObject();
modelList.add(getNoteParams(noteWebHookDataDTO));
}
} else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.MERGE_REQUEST)) {
title = "合并请求提醒";
//新版CR
if (webHookSendParamsModel.getObject() instanceof CodeReviewHookData) {
CodeReviewHookData codeReviewHookData = (CodeReviewHookData) webHookSendParamsModel.getObject();
modelList.add(getMergeRequestParams(codeReviewHookData));
}
//旧版CR
else if (webHookSendParamsModel.getObject() instanceof MergeRequestWebHookDataDTO) {
MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO = (MergeRequestWebHookDataDTO) webHookSendParamsModel.getObject();
modelList.add(getMergeRequestParams(mergeRequestWebHookDataDTO));
}
}
if (modelList.size() > 0) {
//主体消息
return FeiShuRobotMsgUtil.getFeiShuRichTextFormatParams(
title, modelList, webHookSendParamsModel.getWebHooks().getSecretToken());
}
log.warn("Abnormal assembly of FeiShu parameters :{}", JSON.toString(webHookSendParamsModel));
//兜底方案, 如果以上策略都不符合,直接返回原对象
return webHookSendParamsModel.getObject();
}
/**
* 获取推送请求参数
* @param pushEventsData
* @return
*/
private FeiShuRichTextFormatModel getPushParams(PushEventsData pushEventsData) {
//链接
List<FeiShuButtonModel> hrefList = new ArrayList<>();
for (PushDataCommit pushDataCommit : pushEventsData.getCommits()) {
//描述内容取标题 以/n为结束符进行截取
String message = pushDataCommit.getMessage();
//与钉钉消息的commitId格式保持一致 取前面8位
String commitId = pushDataCommit.getId().substring(0, 8);
//commit 列表
hrefList.add(FeiShuButtonModel.builder()
.name(commitId)
.url(pushDataCommit.getUrl())
.description(message.contains(Constants.RETURN) ?
message.substring(0, message.indexOf(Constants.RETURN)) : message)
.build());
}
//兼容合并推送场景
String ref = pushEventsData.getRef();
ref = ref.contains(Constants.PATH_SEPARATOR)
? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1)
: ref;
FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(pushEventsData.getUserName())
.content(String.format(" pushed to branch %s", ref))
.contentLast(String.format(" at repository %s", pushEventsData.getRepository().getName()))
.hrefList(hrefList)
.build();
return fuContentModel;
}
/**
* 获取标签推送请求参数
*
* @param pushEventsData
* @return
*/
private FeiShuRichTextFormatModel getTagPushParams(PushEventsData pushEventsData) {
String repoName = pushEventsData.getRepository().getName();
//获取tag name
String ref = pushEventsData.getRef();
ref = ref.contains(Constants.PATH_SEPARATOR)
? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1)
: ref;
FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(pushEventsData.getUserName())
.content(String.format(" pushed tag %s at repository ", ref))
.hrefContent(repoName).hrefUrl(pushEventsData.getRepository().getUrl())
.build();
return fuContentModel;
}
/**
* 获取新版CR请求参数
*
* @param codeReviewHookData
* @return
*/
public FeiShuRichTextFormatModel getMergeRequestParams(CodeReviewHookData codeReviewHookData) {
CodeReviewWebHookAttributes objectAttributes = codeReviewHookData.getObjectAttributes();
String userName = codeReviewHookData.getUser().getName();
String repoName = codeReviewHookData.getRepository().getName();
//链接
List<FeiShuButtonModel> hrefList = new ArrayList<>();
hrefList.add(FeiShuButtonModel.builder()
.name(objectAttributes.getTitle())
.url(objectAttributes.getUrl())
.build());
List<String> descLines = new ArrayList<>();
descLines.add(String.format("Status:%s", objectAttributes.getState()));
descLines.add(String.format("Repository:%s", repoName));
FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(String.format("%s %s the merge request", userName, objectAttributes.getAction()))
.content(String.format(" from branch %s ", objectAttributes.getSourceBranch()))
.contentLast(String.format("to %s", objectAttributes.getTargetBranch()))
.hrefList(hrefList)
.contentLines(descLines)
.build();
return fuContentModel;
}
/**
* 获取旧版CR请求参数
*
* @param mergeRequestWebHookDataDTO
* @return
*/
public FeiShuRichTextFormatModel getMergeRequestParams(MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO) {
MergeRequestWebHookAttributesDTO objectAttributes = mergeRequestWebHookDataDTO.getObjectAttributes();
String userName = mergeRequestWebHookDataDTO.getUser().getName();
String repoName = mergeRequestWebHookDataDTO.getRepository().getName();
//链接
List<FeiShuButtonModel> hrefList = new ArrayList<>();
hrefList.add(FeiShuButtonModel.builder()
.name(objectAttributes.getTitle())
.url(objectAttributes.getUrl())
.build());
List<String> descLines = new ArrayList<>();
descLines.add(String.format("Status:%s", objectAttributes.getState()));
descLines.add(String.format("Repository:%s", repoName));
FeiShuRichTextFormatModel fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(String.format("%s %s the merge request", userName, objectAttributes.getAction()))
.content(String.format(" from branch %s ", objectAttributes.getSourceBranch()))
.contentLast(String.format("to %s", objectAttributes.getTargetBranch()))
.hrefList(hrefList)
.contentLines(descLines)
.build();
return fuContentModel;
}
/**
* 获取旧版评论请求参数
*
* @param noteWebHookDataDTO
* @return
*/
private FeiShuRichTextFormatModel getNoteParams(NoteWebHookDataDTO noteWebHookDataDTO) {
FeiShuRichTextFormatModel fuContentModel = null;
//commit note
if (Objects.nonNull(noteWebHookDataDTO.getPushDataCommit())) {
//与钉钉消息的commitId格式保持一致 取前面8位
String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(noteWebHookDataDTO.getUser().getName())
.firstHrefContent("commented")
.firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
.content(" on commit ")
.contentLast(commitId)
.contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
.build();
} else if (Objects.nonNull(noteWebHookDataDTO.getMergeRequest())) {
//merge note
fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(noteWebHookDataDTO.getUser().getName())
.firstHrefContent("commented")
.firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
.content(String.format(" on merge request from branch %s to ", noteWebHookDataDTO.getMergeRequest().getSourceBranch()))
.contentLast(noteWebHookDataDTO.getMergeRequest().getTargetBranch())
.contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
.build();
}
return fuContentModel;
}
/**
* 获取新版评论请求参数
*
* @param noteWebHookDataDTO
* @return
*/
private FeiShuRichTextFormatModel getNoteParams(CodeupCommentHookData noteWebHookDataDTO) {
FeiShuRichTextFormatModel fuContentModel = null;
//commit note
if (Objects.nonNull(noteWebHookDataDTO.getCommit())) {
//与钉钉消息的commitId格式保持一致 取前面8位
String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(noteWebHookDataDTO.getUser().getName())
.firstHrefContent("commented")
.firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
.content(" on commit ")
.contentLast(commitId)
.contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
.build();
} else if (Objects.nonNull(noteWebHookDataDTO.getCodeReviewWebHookAttributes())) {
//merge note
fuContentModel = FeiShuRichTextFormatModel.builder()
.contentFirst(noteWebHookDataDTO.getUser().getName())
.firstHrefContent("commented")
.firstHrefUrl(noteWebHookDataDTO.getObjectAttributes().getUrl())
.content(String.format(" on merge request from branch %s to ", noteWebHookDataDTO.getCodeReviewWebHookAttributes().getSourceBranch()))
.contentLast(noteWebHookDataDTO.getCodeReviewWebHookAttributes().getTargetBranch())
.contentLines(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
.build();
}
return fuContentModel;
}
@Override
public WebHookTypeEnum getWebHookType() {
return WebHookTypeEnum.FEI_SHU;
}
}
具策略实现类注册器:
/**
* webhooks 请求参数策略注册器 Date : 2023/8/18 12:24
*
* @author xiaobai.jzm
*/
@Component
@Lazy
public class WebHookStrategyFactory {
/** WebHook发送策略映射表 */
private static Map<WebHookTypeEnum, WebHookStrategy> WEBHOOKS_STRATEGY_CACHE;
/**
* 根据WebHook的URL获取相应的处理策略类
* @param url webHook的回调URL
* @return WebHookStrategy
*/
public static WebHookStrategy getStrategy(@NonNull String url) {
return getCache().get(WebHookTypeEnum.getStrategy(url));
}
private static Map<WebHookTypeEnum, WebHookStrategy> getCache() {
if (CollectionUtils.isEmpty(WEBHOOKS_STRATEGY_CACHE)) {
initCache();
}
return WEBHOOKS_STRATEGY_CACHE;
}
/**
* 初始化WEBHOOKS_STRATEGY_CACHE
*/
private static synchronized void initCache() {
if (!CollectionUtils.isEmpty(WEBHOOKS_STRATEGY_CACHE)) {
return;
}
final String[] beanNamesForType = SpringBeanUtils.getApplicationContext().getBeanNamesForType(WebHookStrategy.class);
//防止bean未实例化完成就有请求进来
if (null == beanNamesForType || beanNamesForType.length == 0) {
return;
}
WEBHOOKS_STRATEGY_CACHE = new HashMap<>();
Arrays.stream(beanNamesForType).forEach(beanName -> {
WebHookStrategy webhooksStrategy = (WebHookStrategy) SpringBeanUtils.getApplicationContext().getBean(beanName);
WEBHOOKS_STRATEGY_CACHE.put(webhooksStrategy.getWebHookType(), webhooksStrategy);
});
}
}
接入微信群消息机器人
@Slf4j
@Service
public class WeChatWebHookStrategy implements WebHookStrategy {
@Override
public Object getRequestParameters(WebHookSendParamsModel webHookSendParamsModel) {
WeChatMarkDownRichTextModel downRichTextModel = null;
if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.PUSH)) {
PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
downRichTextModel = getPushParams(pushEventsData);
} else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.TAG_PUSH)) {
PushEventsData pushEventsData = (PushEventsData) webHookSendParamsModel.getObject();
downRichTextModel = getTagPushParams(pushEventsData);
} else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.NOTE)) {
//旧版评论
if (webHookSendParamsModel.getObject() instanceof NoteWebHookDataDTO) {
NoteWebHookDataDTO noteWebHookDataDTO = (NoteWebHookDataDTO) webHookSendParamsModel.getObject();
downRichTextModel = getNoteParams(noteWebHookDataDTO);
}
//新版评论
else if (webHookSendParamsModel.getObject() instanceof CodeupCommentHookData) {
CodeupCommentHookData noteWebHookDataDTO = (CodeupCommentHookData) webHookSendParamsModel.getObject();
downRichTextModel = getNoteParams(noteWebHookDataDTO);
}
} else if (webHookSendParamsModel.getWebHookEventEnum().equals(WebHookEventEnum.MERGE_REQUEST)) {
//新版CR
if (webHookSendParamsModel.getObject() instanceof CodeReviewHookData) {
CodeReviewHookData codeReviewHookData = (CodeReviewHookData) webHookSendParamsModel.getObject();
downRichTextModel = getMergeRequestParams(codeReviewHookData);
}
//旧版CR
else if (webHookSendParamsModel.getObject() instanceof MergeRequestWebHookDataDTO) {
MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO = (MergeRequestWebHookDataDTO) webHookSendParamsModel.getObject();
downRichTextModel = getMergeRequestParams(mergeRequestWebHookDataDTO);
}
}
if (Objects.nonNull(downRichTextModel)) {
//主体消息
return WeChatRobotMsgUtil.getMarkDownFormatMsgContent(downRichTextModel);
}
log.warn("Abnormal assembly of wechat parameters :{}", JSON.toString(webHookSendParamsModel));
//兜底方案, 如果以上策略都不符合,直接返回原对象
return webHookSendParamsModel.getObject();
}
/**
* 获取推送请求参数
*
* @param pushEventsData
* @return
*/
private WeChatMarkDownRichTextModel getPushParams(PushEventsData pushEventsData) {
//链接
List<FeiShuButtonModel> hrefList = new ArrayList<>();
for (PushDataCommit pushDataCommit : pushEventsData.getCommits()) {
//描述内容取标题 以/n为结束符进行截取
String message = pushDataCommit.getMessage();
//与钉钉消息的commitId格式保持一致 取前面8位
String commitId = pushDataCommit.getId().substring(0, 8);
//commit 列表
hrefList.add(FeiShuButtonModel.builder().name(commitId).url(pushDataCommit.getUrl()).description(message.contains(Constants.RETURN) ? message.substring(0, message.indexOf(Constants.RETURN)) : message).build());
}
//兼容合并推送场景
String ref = pushEventsData.getRef();
ref = ref.contains(Constants.PATH_SEPARATOR) ? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1) : ref;
String content = String.format("%s pushed to branch %s at repository %s",
pushEventsData.getUserName(),
ref,
pushEventsData.getRepository().getName());
WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("推送提醒")
.content(content)
.buttonModelList(hrefList)
.build();
return weChatMarkDownRichTextModel;
}
/**
* 获取标签推送请求参数
*
* @param pushEventsData
* @return
*/
private WeChatMarkDownRichTextModel getTagPushParams(PushEventsData pushEventsData) {
String repoName = pushEventsData.getRepository().getName();
//获取tag name
String ref = pushEventsData.getRef();
ref = ref.contains(Constants.PATH_SEPARATOR) ? ref.substring(ref.lastIndexOf(Constants.PATH_SEPARATOR) + 1) : ref;
//消息主体
String content = String.format("%s pushed tag %s at repository %s", pushEventsData.getUserName(), ref, repoName);
WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("标签推送提醒")
.content(content)
.contentEndLinkUrl(pushEventsData.getRepository().getUrl())
.build();
return weChatMarkDownRichTextModel;
}
/**
* 获取新版CR请求参数
*
* @param codeReviewHookData
* @return
*/
public WeChatMarkDownRichTextModel getMergeRequestParams(CodeReviewHookData codeReviewHookData) {
CodeReviewWebHookAttributes objectAttributes = codeReviewHookData.getObjectAttributes();
String userName = codeReviewHookData.getUser().getName();
String repoName = codeReviewHookData.getRepository().getName();
//链接
List<FeiShuButtonModel> hrefList = new ArrayList<>();
hrefList.add(FeiShuButtonModel.builder().name(objectAttributes.getTitle()).url(objectAttributes.getUrl()).build());
List<String> descLines = new ArrayList<>();
descLines.add(String.format("Status:%s", objectAttributes.getState()));
descLines.add(String.format("Repository:%s", repoName));
String content = String.format("%s %s the merge request from branch %s to %s",
userName,
objectAttributes.getAction(),
objectAttributes.getSourceBranch(),
objectAttributes.getTargetBranch());
WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("合并请求提醒")
.content(content)
.buttonModelList(hrefList)
.describeLineList(descLines)
.build();
return weChatMarkDownRichTextModel;
}
/**
* 获取旧版CR请求参数
*
* @param mergeRequestWebHookDataDTO
* @return
*/
public WeChatMarkDownRichTextModel getMergeRequestParams(MergeRequestWebHookDataDTO mergeRequestWebHookDataDTO) {
MergeRequestWebHookAttributesDTO objectAttributes = mergeRequestWebHookDataDTO.getObjectAttributes();
String userName = mergeRequestWebHookDataDTO.getUser().getName();
String repoName = mergeRequestWebHookDataDTO.getRepository().getName();
//链接
List<FeiShuButtonModel> hrefList = new ArrayList<>();
hrefList.add(FeiShuButtonModel.builder().name(objectAttributes.getTitle()).url(objectAttributes.getUrl()).build());
List<String> descLines = new ArrayList<>();
descLines.add(String.format("Status:%s", objectAttributes.getState()));
descLines.add(String.format("Repository:%s", repoName));
String content = String.format("%s %s the merge request from branch %s to %s",
userName,
objectAttributes.getAction(),
objectAttributes.getSourceBranch(),
objectAttributes.getTargetBranch());
WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("合并请求提醒")
.content(content)
.buttonModelList(hrefList)
.describeLineList(descLines)
.build();
return weChatMarkDownRichTextModel;
}
/**
* 获取旧版评论请求参数
*
* @param noteWebHookDataDTO
* @return
*/
private WeChatMarkDownRichTextModel getNoteParams(NoteWebHookDataDTO noteWebHookDataDTO) {
WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = null;
//commit note
if (Objects.nonNull(noteWebHookDataDTO.getPushDataCommit())) {
//与钉钉消息的commitId格式保持一致 取前面8位
String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
//消息示例 : 小白 commented on commit d73575d7 \n这是一个评论消息
//消息主体
String content = String.format("%s %s on commit %s",
noteWebHookDataDTO.getUser().getName(),
WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
commitId);
weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("评论提醒")
.content(content)
.describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
.build();
} else if (Objects.nonNull(noteWebHookDataDTO.getMergeRequest())) {
//merge note
//消息主体
String content = String.format("%s %s on merge request from branch %s to %s ",
noteWebHookDataDTO.getUser().getName(),
WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
noteWebHookDataDTO.getMergeRequest().getSourceBranch(),
noteWebHookDataDTO.getMergeRequest().getTargetBranch());
weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("评论提醒")
.content(content)
.describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getNote()))
.build();
}
return weChatMarkDownRichTextModel;
}
/**
* 获取新版评论请求参数
*
* @param noteWebHookDataDTO
* @return
*/
private WeChatMarkDownRichTextModel getNoteParams(CodeupCommentHookData noteWebHookDataDTO) {
WeChatMarkDownRichTextModel weChatMarkDownRichTextModel = null;
//commit note
if (Objects.nonNull(noteWebHookDataDTO.getCommit())) {
//与钉钉消息的commitId格式保持一致 取前面8位
String commitId = noteWebHookDataDTO.getObjectAttributes().getCommitId().substring(0, 8);
//消息主体
String content = String.format("%s %s on commit %s",
noteWebHookDataDTO.getUser().getName(),
WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
commitId);
weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("评论提醒")
.content(content)
.describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
.build();
} else if (Objects.nonNull(noteWebHookDataDTO.getCodeReviewWebHookAttributes())) {
//merge note
//消息主体
String content = String.format("%s %s on merge request from branch %s to %s ",
noteWebHookDataDTO.getUser().getName(),
WeChatRobotMsgUtil.getCommentUrl("commented", noteWebHookDataDTO.getObjectAttributes().getUrl()),
noteWebHookDataDTO.getCodeReviewWebHookAttributes().getSourceBranch(),
noteWebHookDataDTO.getCodeReviewWebHookAttributes().getTargetBranch());
weChatMarkDownRichTextModel = WeChatMarkDownRichTextModel.builder()
.title("评论提醒")
.content(content)
.describeLineList(Collections.singletonList(noteWebHookDataDTO.getObjectAttributes().getContent()))
.build();
}
return weChatMarkDownRichTextModel;
}
@Override
public WebHookTypeEnum getWebHookType() {
return WebHookTypeEnum.WE_CHAT;
}
}
import lombok.Builder;
import lombok.Data;
import java.util.List;
/**
* 企业微信群机器人消息模型对象
*
* @Author xiaobai.jzm
* Date : 2023/9/11 14:07
*/
@Data
@Builder
public class WeChatMarkDownRichTextModel {
/**
* 标题
*/
private String title;
/**
* 内容-开头
*/
private String contentStart;
/**
* 内容-开头-链接
*/
private String contentStartLinkUrl;
/**
* 内容-主体
*/
private String content;
/**
* 内容-主体-链接
*/
private String contentLinkUrl;
/**
* 内容-结束
*/
private String contentEnd;
/**
* 内容-结束-链接
*/
private String contentEndLinkUrl;
/**
* 多行文本
*/
private List<String> contentLineList;
/**
* 描述信息(多行)
*/
private List<FeiShuButtonModel> buttonModelList;
/**
* 描述信息 多行文本
*/
private List<String> describeLineList;
}
/**
* 企业微信机器人群消息请求参数工具类
*
* @Author xiaobai.jzm
* Date : 2023/9/11 11:39
*/
public class WeChatRobotMsgUtil {
/**
* 获取markdown格式消息内容
* 富文本消息
*
* @param markDownRichTextModel
* @return
*/
public static JSONObject getMarkDownFormatMsgContent(WeChatMarkDownRichTextModel markDownRichTextModel) {
JSONObject contentJson = new JSONObject();
//如果传入null 则直接返回 保证后续流程异常
if (Objects.isNull(markDownRichTextModel)) {
return contentJson;
}
StringBuffer sb = new StringBuffer();
if (StringUtil.isNotBlank(markDownRichTextModel.getTitle())) {
sb.append("# ").append(markDownRichTextModel.getTitle()).append(Constants.RETURN_CHAR);
}
StringBuffer contentSb = new StringBuffer();
//开头是否有链接
if (StringUtil.isNotBlank(markDownRichTextModel.getContentStart())) {
if (StringUtil.isNotBlank(markDownRichTextModel.getContentStartLinkUrl())) {
contentSb.append(getCommentUrl(markDownRichTextModel.getContentStart(), markDownRichTextModel.getContentStartLinkUrl()));
} else {
contentSb.append(markDownRichTextModel.getContentStart());
}
}
//消息主体
if (StringUtil.isNotBlank(markDownRichTextModel.getContent())) {
if (StringUtil.isNotBlank(markDownRichTextModel.getContentLinkUrl())) {
contentSb.append(getCommentUrl(markDownRichTextModel.getContent(), markDownRichTextModel.getContentLinkUrl()));
} else {
contentSb.append(markDownRichTextModel.getContent());
}
}
//消息尾部
if (StringUtil.isNotBlank(markDownRichTextModel.getContentEnd())) {
if (StringUtil.isNotBlank(markDownRichTextModel.getContentEndLinkUrl())) {
contentSb.append(getCommentUrl(markDownRichTextModel.getContentEnd(), markDownRichTextModel.getContentEndLinkUrl()));
} else {
contentSb.append(markDownRichTextModel.getContentEnd());
}
}
//上面存在内容则需要换行
if (StringUtil.isNotBlank(contentSb.toString())) {
sb.append(contentSb).append(Constants.RETURN_CHAR);
}
//组装多行消息
if (CollectionUtils.isNotEmpty(markDownRichTextModel.getContentLineList())) {
for (String line : markDownRichTextModel.getContentLineList()) {
sb.append(line).append(Constants.RETURN_CHAR);
}
}
//描述信息
if (CollectionUtils.isNotEmpty(markDownRichTextModel.getButtonModelList())) {
for (FeiShuButtonModel buttonModel : markDownRichTextModel.getButtonModelList()) {
if (StringUtil.isNotBlank(buttonModel.getName())) {
//存在链接
if (StringUtil.isNotBlank(buttonModel.getUrl())) {
sb.append(">").append(getCommentUrl(buttonModel.getName(), buttonModel.getUrl()));
} else {
sb.append(buttonModel.getName());
}
//描述
if (StringUtil.isNotBlank(buttonModel.getDescription())) {
sb.append(":").append(getCommentText(buttonModel.getDescription()));
}
}
//存在多行内容 需要换行
sb.append(Constants.RETURN_CHAR);
}
}
//组装多行消息
if (CollectionUtils.isNotEmpty(markDownRichTextModel.getDescribeLineList())) {
for (String line : markDownRichTextModel.getDescribeLineList()) {
sb.append(">").append(getCommentText(line)).append(Constants.RETURN_CHAR);
}
}
contentJson.put("content", sb);
//请求参数
JSONObject paramsJson = new JSONObject();
paramsJson.put("msgtype", "markdown");
paramsJson.put("markdown", contentJson);
return paramsJson;
}
/**
* 获取灰色样式文本 comment 灰色 ,info 绿色 ,warning 橙红色
*
* @param text
* @return
*/
public static String getCommentText(String text) {
return StringUtil.isNotBlank(text) ? String.format("<font color='comment'>%s</font>", text) : "";
}
public static String getCommentUrl(String name, String url) {
return String.format("[%s](%s)", name, url);
}
}