github_zeekling/src/main/java/com/zeekling/blog/BlogUpdateServiceImpl.java

104 lines
4.3 KiB
Java

package com.zeekling.blog;
import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.io.FeedException;
import com.zeekling.conf.BlogConfigure;
import com.zeekling.util.ConfigureUtil;
import com.zeekling.util.FeedXmlUtil;
import com.zeekling.util.GitHubs;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.json.JSONObject;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.charset.StandardCharsets;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* @author zeekling [lingzhaohui@zeekling.cn]
* @version 1.0
* @apiNote
* @since 2020-07-26
*/
public class BlogUpdateServiceImpl implements BlogUpdateService {
private static final Logger LOGGER = LogManager.getLogger(BlogUpdateServiceImpl.class);
private BlogConfigure blogConfigure = null;
public BlogUpdateServiceImpl(String confPath) {
// init blogConfigure
try {
blogConfigure = ConfigureUtil.getNewInstants(confPath, BlogConfigure.class);
} catch (IllegalAccessException | InstantiationException | IOException e) {
e.printStackTrace();
}
}
@Override
public int update() {
if (blogConfigure == null) {
return -1;
}
final JSONObject gitHubUser = GitHubs.getGitHubUser(blogConfigure.getPat());
if (null == gitHubUser) {
LOGGER.error("login failed");
return -1;
}
LOGGER.info("login success");
final String loginName = gitHubUser.optString("login");
boolean ok = GitHubs.createOrUpdateGitHubRepo(blogConfigure.getPat(), loginName, blogConfigure.getRepoName(),
blogConfigure.getClientSubtitle(), blogConfigure.getHome());
if (!ok) {
LOGGER.error("get " + blogConfigure.getRepoName() + " failed");
return -1;
}
final String readme = genSoloBlogReadme(loginName + "/" + blogConfigure.getRepoName());
ok = GitHubs.updateFile(blogConfigure.getPat(), loginName, blogConfigure.getRepoName(), "README.md", readme.getBytes(StandardCharsets.UTF_8));
if (ok) {
LOGGER.log(Level.INFO, "Exported public articles to your repo [" + blogConfigure.getRepoName() + "]");
}
return 0;
}
private String genSoloBlogReadme(final String repoFullName) {
final StringBuilder bodyBuilder = new StringBuilder("### 最新\n");
try {
List<SyndEntry> entries = FeedXmlUtil.parseXml(blogConfigure.getRss());
for (SyndEntry syndEntry: entries){
bodyBuilder.append("\n* [").append(syndEntry.getTitle()).append("](").append(syndEntry.getLink()).append(")");
}
} catch (FeedException | MalformedURLException e) {
e.printStackTrace();
}
bodyBuilder.append("\n\n");
String ret = "<p align=\"center\"><img alt=\"${title}\" src=\"${favicon}\"></p><h2 align=\"center\">\n" +
"${title}\n" +
"</h2>\n" +
"\n" +
"<h4 align=\"center\">${subtitle}</h4>\n" +
"<p align=\"center\">" +
"<a title=\"${title}\" target=\"_blank\" href=\"https://github.com/${repoFullName}\"><img src=\"https://img.shields.io/github/last-commit/${repoFullName}.svg?style=flat-square&color=FF9900\"></a>\n" +
"<a title=\"GitHub repo size in bytes\" target=\"_blank\" href=\"https://github.com/${repoFullName}\"><img src=\"https://img.shields.io/github/repo-size/${repoFullName}.svg?style=flat-square\"></a>\n" +
"<a title=\"Hits\" target=\"_blank\" href=\"https://github.com/zeekling/hits\"><img src=\"https://hits.b3log.org/${repoFullName}.svg\"></a>" +
"</p>\n" +
"\n" +
"${body}\n\n" +
"---\n" +
"\n" +
"本仓库通过 [github_zeekling](https://git.zeekling.cn/zeekling/github_zeekling) 自动进行同步更新 ❤️ ";
ret = ret.replace("${title}", blogConfigure.getClientTitle()).
replace("${subtitle}", blogConfigure.getClientSubtitle()).
replace("${favicon}", blogConfigure.getFavicon()).
replace("${repoFullName}", repoFullName).
replace("${body}", bodyBuilder.toString());
return ret;
}
}