diff --git a/src/main/java/com/ycwl/basic/notify/NotifyFactory.java b/src/main/java/com/ycwl/basic/notify/NotifyFactory.java new file mode 100644 index 0000000..993494c --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/NotifyFactory.java @@ -0,0 +1,45 @@ +package com.ycwl.basic.notify; + +import com.ycwl.basic.notify.adapters.INotifyAdapter; +import com.ycwl.basic.notify.enums.NotifyType; + +import java.util.HashMap; +import java.util.Map; + +public class NotifyFactory { + public static INotifyAdapter get(NotifyType type) { + switch (type) { + case SERVER_CHAN: + return new com.ycwl.basic.notify.adapters.ServerChanNotifyAdapter(); + default: + throw new RuntimeException("不支持的通知类型"); + } + } + + + protected static Map namedNotifier = new HashMap<>(); + protected static INotifyAdapter defaultNotifier = null; + + public static void register(String name, INotifyAdapter adapter) { + namedNotifier.put(name, adapter); + } + + public static INotifyAdapter to(String name) { + INotifyAdapter adapter = namedNotifier.get(name); + if (adapter == null) { + throw new RuntimeException("未定义的通知方式:"+name); + } + return adapter; + } + + public static INotifyAdapter to() { + if (defaultNotifier == null) { + throw new RuntimeException("未定义默认通知方式"); + } + return defaultNotifier; + } + + public static void setDefault(String defaultStorage) { + NotifyFactory.defaultNotifier = to(defaultStorage); + } +} diff --git a/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java b/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java new file mode 100644 index 0000000..42e447f --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/adapters/INotifyAdapter.java @@ -0,0 +1,11 @@ +package com.ycwl.basic.notify.adapters; + +import com.ycwl.basic.notify.entity.NotifyContent; + +import java.util.Map; + +public interface INotifyAdapter { + void loadConfig(Map _config); + + void send(NotifyContent notifyContent); +} diff --git a/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java b/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java new file mode 100644 index 0000000..fab9796 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/adapters/ServerChanNotifyAdapter.java @@ -0,0 +1,76 @@ +package com.ycwl.basic.notify.adapters; + +import com.ycwl.basic.notify.entity.NotifyContent; +import com.ycwl.basic.notify.entity.ServerChanConfig; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class ServerChanNotifyAdapter implements INotifyAdapter { + ServerChanConfig config; + + @Override + public void loadConfig(Map _config) { + ServerChanConfig config = new ServerChanConfig(); + config.setKey(_config.get("key")); + config.checkEverythingOK(); + this.config = config; + } + + @Override + public void send(NotifyContent notifyContent) { + scSend(notifyContent.getTitle(), notifyContent.getContent(), config.getKey()); + } + + public static String scSend(String title, String content, String key) { + try { + String api; + + // 判断 sendkey 是否以 "sctp" 开头,并提取数字部分拼接 URL + if (key.startsWith("sctp")) { + Pattern pattern = Pattern.compile("sctp(\\d+)t"); + Matcher matcher = pattern.matcher(key); + if (matcher.find()) { + String num = matcher.group(1); + api = "https://" + num + ".push.ft07.com/send/" + key +".send"; + } else { + throw new IllegalArgumentException("Invalid sendkey format for sctp"); + } + } else { + api = "https://sctapi.ftqq.com/" + key + ".send"; + } + + String body = "text=" + URLEncoder.encode(title, "UTF-8") + "&desp=" + URLEncoder.encode(content, "UTF-8"); + URL apiUrl = new URL(api); + HttpURLConnection httpConnection = (HttpURLConnection) apiUrl.openConnection(); + httpConnection.setRequestMethod("POST"); + httpConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + httpConnection.setDoOutput(true); + DataOutputStream bodyWriter = new DataOutputStream(httpConnection.getOutputStream()); + bodyWriter.writeBytes(body); + bodyWriter.flush(); + bodyWriter.close(); + int responseCode = httpConnection.getResponseCode(); + BufferedReader reader = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); + StringBuilder responseText = new StringBuilder(); + + String line; + while ((line = reader.readLine()) != null) { + responseText.append(line); + } + + reader.close(); + return responseText.toString(); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java b/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java new file mode 100644 index 0000000..2739048 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/entity/NotifyContent.java @@ -0,0 +1,13 @@ +package com.ycwl.basic.notify.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class NotifyContent { + private String title; + private String content; +} diff --git a/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java b/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java new file mode 100644 index 0000000..9fc5e57 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/entity/ServerChanConfig.java @@ -0,0 +1,12 @@ +package com.ycwl.basic.notify.entity; + +import lombok.Data; + +@Data +public class ServerChanConfig { + private String key; + + public void checkEverythingOK() { + return; + } +} diff --git a/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java b/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java new file mode 100644 index 0000000..799f3e8 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/enums/NotifyType.java @@ -0,0 +1,14 @@ +package com.ycwl.basic.notify.enums; + +import lombok.Getter; + +@Getter +public enum NotifyType { + SERVER_CHAN("SERVER_CHAN"); + + private final String type; + + NotifyType(String type) { + this.type = type; + } +} diff --git a/src/main/java/com/ycwl/basic/notify/starter/NotifyAutoConfigurator.java b/src/main/java/com/ycwl/basic/notify/starter/NotifyAutoConfigurator.java new file mode 100644 index 0000000..b06a234 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/starter/NotifyAutoConfigurator.java @@ -0,0 +1,32 @@ +package com.ycwl.basic.notify.starter; + +import com.ycwl.basic.notify.NotifyFactory; +import com.ycwl.basic.notify.adapters.INotifyAdapter; +import com.ycwl.basic.notify.starter.config.NotifyConfigItem; +import com.ycwl.basic.notify.starter.config.OverallNotifyConfig; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class NotifyAutoConfigurator { + private final OverallNotifyConfig config; + public NotifyAutoConfigurator(OverallNotifyConfig config) { + this.config = config; + if (config != null) { + if (config.getConfigs() != null) { + loadConfig(); + } + if (StringUtils.isNotBlank(config.getDefaultUse())) { + NotifyFactory.setDefault(config.getDefaultUse()); + } + } + } + + private void loadConfig() { + for (NotifyConfigItem item : config.getConfigs()) { + INotifyAdapter adapter = NotifyFactory.get(item.getType()); + adapter.loadConfig(item.getConfig()); + NotifyFactory.register(item.getName(), adapter); + } + } +} diff --git a/src/main/java/com/ycwl/basic/notify/starter/config/NotifyConfigItem.java b/src/main/java/com/ycwl/basic/notify/starter/config/NotifyConfigItem.java new file mode 100644 index 0000000..711b0c5 --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/starter/config/NotifyConfigItem.java @@ -0,0 +1,13 @@ +package com.ycwl.basic.notify.starter.config; + +import com.ycwl.basic.notify.enums.NotifyType; +import lombok.Data; + +import java.util.Map; + +@Data +public class NotifyConfigItem { + private String name; + private NotifyType type; + private Map config; +} diff --git a/src/main/java/com/ycwl/basic/notify/starter/config/OverallNotifyConfig.java b/src/main/java/com/ycwl/basic/notify/starter/config/OverallNotifyConfig.java new file mode 100644 index 0000000..93c475b --- /dev/null +++ b/src/main/java/com/ycwl/basic/notify/starter/config/OverallNotifyConfig.java @@ -0,0 +1,15 @@ +package com.ycwl.basic.notify.starter.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@ConfigurationProperties(prefix = "notify") +@Data +public class OverallNotifyConfig { + private String defaultUse; + private List configs; +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 74140e1..764ad44 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -155,4 +155,12 @@ storage: aliFace: accessKeyId: "LTAI5tMwrmxVcUEKoH5QzLHx" accessKeySecret: "ZCIP8aKx1jwX1wkeYIPQEDZ8fPtN1c" - region: "cn-shanghai" \ No newline at end of file + region: "cn-shanghai" + +notify: + defaultUse: "developer" + configs: + - name: "developer" + type: "SERVER_CHAN" + config: + key: sctp747tje1xjxbwn2fodgu1qezpn3 \ No newline at end of file diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 4f542fe..8d36326 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -156,4 +156,12 @@ storage: aliFace: accessKeyId: "LTAI5tMwrmxVcUEKoH5QzLHx" accessKeySecret: "ZCIP8aKx1jwX1wkeYIPQEDZ8fPtN1c" - region: "cn-shanghai" \ No newline at end of file + region: "cn-shanghai" + +notify: + defaultUse: "developer" + configs: + - name: "developer" + type: "SERVER_CHAN" + config: + key: sctp747tje1xjxbwn2fodgu1qezpn3 \ No newline at end of file