diff --git a/app/models/project/Project.scala b/app/models/project/Project.scala index baf4cf066..fbc456bb9 100755 --- a/app/models/project/Project.scala +++ b/app/models/project/Project.scala @@ -28,6 +28,7 @@ import ore.{Joinable, OreConfig, Visitable} import play.api.libs.json._ import play.api.libs.functional.syntax._ import play.twirl.api.Html +import _root_.util.GitHubUtil import _root_.util.StringUtils import _root_.util.StringUtils._ import models.project.VisibilityTypes.{Public, Visibility} @@ -464,7 +465,18 @@ case class Project(override val id: Option[Int] = None, * @return Project home page */ def homePage: Page = Defined { - val page = new Page(this.id.get, Page.HomeName, Page.Template(this.name, Page.HomeMessage), false, -1) + var body = Page.HomeMessage + val source = this.settings.source + if (source.isDefined && GitHubUtil.isGitHubUrl(source.get)) { + val urlParts = source.get.split("//github.com/")(1).split("/") + val ghUser = urlParts(0) + val ghProject = urlParts(1) + val readme = GitHubUtil.getReadme(ghUser, ghProject) + if (readme != null && readme.isDefined) { + body = readme.get + } + } + val page = new Page(this.id.get, Page.HomeName, Page.Template(this.name, body), false, -1) this.service.await(page.schema.getOrInsert(page)).get } diff --git a/app/util/GitHubUtil.scala b/app/util/GitHubUtil.scala new file mode 100644 index 000000000..ef39483e5 --- /dev/null +++ b/app/util/GitHubUtil.scala @@ -0,0 +1,28 @@ +package util + +import java.io.FileNotFoundException + +import play.api.libs.json.{JsValue, Json} + +import scala.io.Source + +object GitHubUtil { + + private val identifier = "A-Za-z0-9-_" + private val gitHubUrlPattern = s"""http(s)?://github.com/[$identifier]+/[$identifier]+(/)?""".r.pattern + private val readmeApi = "https://api.github.com/repos/%s/%s/readme" + + def isGitHubUrl(url: String): Boolean = gitHubUrlPattern.matcher(url).matches() + + def getReadme(user: String, project: String): Option[String] = { + try { + val readmeApiJson: JsValue = Json.parse(Source.fromURL(readmeApi.format(user, project)).mkString) + val url = (readmeApiJson \ "download_url").get.toString() + val readme = Source.fromURL(url).mkString + Some(readme) + } catch { + case _: FileNotFoundException => None + } + } + +}