diff --git a/pages/gist.go b/pages/gist.go new file mode 100644 index 0000000..be20487 --- /dev/null +++ b/pages/gist.go @@ -0,0 +1,90 @@ +package pages + +import ( + "github.com/gocolly/colly" + "github.com/gofiber/fiber/v2" + "log" + "net/http" + "os" +) + +type Gist struct { + Fullname string + Refname string + Description string + DownloadLink string + Parent string + Stars string + Forks string + Language []string + License string + DefaultBranch string + Readme string +} + +type GistFiles struct { + Name string +} + +func HandleGist(c *fiber.Ctx) error { + var gistArray []Gist + var gistFilesArray []GistFiles + + resp, statusErr := http.Get("https://gists.github.com/" + c.Params("user") + "/" + c.Params("repo")) + if statusErr != nil { + log.Println(statusErr) + } + if resp.StatusCode == 404 { + // I need a better way to do this + return c.Status(404).Render("error", fiber.Map{ + "title": "Error", + "error": "Repository " + c.Params("user") + "/" + c.Params("repo") + " not found", + }) + } + + // Scraping + Scrape := Gist{} + + UserAgent, ok := os.LookupEnv("GOTHUB_USER_AGENT") + if !ok { + UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" + } + + sc := colly.NewCollector(colly.AllowedDomains("gist.github.com"), colly.UserAgent(UserAgent)) + + sc.OnHTML("div.gisthead", func(e *colly.HTMLElement) { + Scrape.Refname = c.Params("user") + "/" + c.Params("repo") + Scrape.Fullname = c.Params("user") + "/" + e.ChildText("a[href='/"+c.Params("user")+"/"+c.Params("repo")+"' i]") + Scrape.DownloadLink = e.ChildAttr("a[href$='.zip']", "href") + Scrape.Stars = e.ChildText("ul li a:first") + Scrape.Stars = e.ChildText("li a[href*='/" + c.Params("user") + "/" + c.Params("repo") + "/stargazers' i]") + Scrape.Parent = e.ChildText("span.note a") + Scrape.Forks = e.ChildText("li span.social-count") + // I need a better way to do this + if Scrape.Forks == "" { + Scrape.Forks = e.ChildText("li a[href*='/" + c.Params("user") + "/" + c.Params("repo") + "/forks' i]") + } + }) + + sc.OnHTML("div[itemprop='about']", func(e *colly.HTMLElement) { + Scrape.Description = e.Text + }) + + sc.OnHTML("div.repository-content.gist-content", func(e *colly.HTMLElement) { + e.ForEach("strong.user-select-contain.gist-blob-name.css-truncate-target", func(i int, el *colly.HTMLElement) { + gistFilesArray = append(gistFilesArray, GistFiles{ + Name: el.Text, + }) + }) + }) + + sc.Visit("https://gist.github.com/" + c.Params("user") + "/" + c.Params("repo") + "/") + // Add scrape-based info to gistArray + gistArray = append(gistArray, Scrape) + + return c.Render("gist", fiber.Map{ + "title": "Repository " + c.Params("user") + "/" + c.Params("repo"), + "gist": gistArray, + "files": gistFilesArray, + }) +} diff --git a/serve/serve.go b/serve/serve.go index 3c9cc18..62fdb40 100644 --- a/serve/serve.go +++ b/serve/serve.go @@ -3,6 +3,7 @@ package serve import ( "html/template" "log" + "net/url" "os" "regexp" "runtime" @@ -108,7 +109,19 @@ func Serve(port string) { utils.ProxyRequest(c, "https://avatars.githubusercontent.com/u/"+c.Params("id")+"?v=4") return nil }) - app.Get("/:user/:repo", pages.HandleRepo) + app.Get("/:user/:repo", ratelimiter, func(c *fiber.Ctx) error { + u, err := url.Parse(c.Request().URI().String()) + if err != nil { + return err + } + params, _ := url.ParseQuery(u.RawQuery) + typ := params.Get("type") + + if typ == "gist" { + return pages.HandleGist(c) + } + return pages.HandleRepo(c) + }) app.Get("/:user/:repo/blob/:branch/+", pages.FileView) app.Get("/:user/:repo/tree/:branch/+", pages.DirView) app.Get("/:user/:repo/tree/:branch", pages.HandleRepo) diff --git a/views/gist.html b/views/gist.html new file mode 100644 index 0000000..2b61a02 --- /dev/null +++ b/views/gist.html @@ -0,0 +1,57 @@ +{{ template "header" .}} + +
+ {{ if .gist }} + {{ range $key, $value := .gist}} +
+ Download (zip) + View on GitHub +
+ +
+

{{.Fullname}}

+ {{ if .Parent }} +

This repository is a fork of {{.Parent}}.

+ {{ end }} + {{ if .Description }} +

{{.Description}}

+ {{ end }} +

⭐ {{.Stars}} 🍴 {{.Forks}}

+ {{ if .Language }} +

🗒️ + {{range .Language}} + {{.}} + {{end}} +

+ {{end}} +
+ {{end}} + {{ if .files}} +
+

Files

+
+
    + {{ range $key, $value := .files}} +
  • {{.Name}}
  • + {{ end }} +
+
+
+ {{ end }} + {{ if .readme}} +
+ {{ if .repo }} + {{ range $key, $value := .repo}} +

{{.Readme}}

+ {{end}} + {{end}} +
+ {{ unescape .readme}} +
+
+ {{ end }} + {{ else }} +

Repository not found

+

That repository doesn't exist.

+ {{ end }} +