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.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 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 = "

\"${title}\"

\n" + "${title}\n" + "

\n" + "\n" + "

${subtitle}

\n" + "

" + "\n" + "\n" + "" + "

\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; } }