89 lines
2 KiB
Go
89 lines
2 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"log/slog"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
|
||
|
"github.com/alecthomas/kong"
|
||
|
"github.com/gocolly/colly/v2"
|
||
|
)
|
||
|
|
||
|
// ToDo: emoji in text support
|
||
|
// ToDo: attachment support?
|
||
|
// ToDo: polls support?
|
||
|
|
||
|
type Status struct {
|
||
|
Username string
|
||
|
DisplayName string
|
||
|
ProfileURL string
|
||
|
AvatarURL string
|
||
|
Text string
|
||
|
Published string
|
||
|
ReplyCount int
|
||
|
FavouriteCount int
|
||
|
BoostCount int
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
ctx := kong.Parse(&cli)
|
||
|
|
||
|
if cli.Debug {
|
||
|
slog.SetLogLoggerLevel(slog.LevelDebug)
|
||
|
}
|
||
|
|
||
|
if err := ctx.Run(); err != nil {
|
||
|
fmt.Fprintf(os.Stderr, "ERROR: %s\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func getStatusesForURL(url string) []*Status {
|
||
|
statuses := []*Status{}
|
||
|
|
||
|
c := colly.NewCollector()
|
||
|
|
||
|
c.OnHTML("article.status", func(e *colly.HTMLElement) {
|
||
|
replyCount, _ := strconv.Atoi(e.ChildText("aside.status-info div[title=Replies] dd"))
|
||
|
favouriteCount, _ := strconv.Atoi(e.ChildText("aside.status-info div[title=Faves] dd"))
|
||
|
boostCount, _ := strconv.Atoi(e.ChildText("aside.status-info div[title=Boosts] dd"))
|
||
|
|
||
|
status := &Status{
|
||
|
Username: e.ChildText("address div.author-strap span.username"),
|
||
|
DisplayName: e.ChildText("address div.author-strap span.displayname"),
|
||
|
ProfileURL: e.ChildAttr("address a", "href"),
|
||
|
AvatarURL: e.ChildAttr("address img.avatar", "src"),
|
||
|
Text: e.ChildText("div.status-body div.content"),
|
||
|
Published: e.ChildAttr("aside.status-info div.published-at time", "datetime"),
|
||
|
ReplyCount: replyCount,
|
||
|
FavouriteCount: favouriteCount,
|
||
|
BoostCount: boostCount,
|
||
|
}
|
||
|
|
||
|
slog.Debug("Status", "status", status)
|
||
|
|
||
|
statuses = append(statuses, status)
|
||
|
})
|
||
|
|
||
|
c.Visit(url)
|
||
|
|
||
|
return statuses
|
||
|
}
|
||
|
|
||
|
func (u *statusesCmd) Run() error {
|
||
|
statuses := getStatusesForURL(u.URL)
|
||
|
for _, s := range statuses {
|
||
|
txt := s.Text
|
||
|
if len(txt) > 30 {
|
||
|
txt = txt[:27] + "..."
|
||
|
}
|
||
|
slog.Info("Status", "username", s.Username, "display name", s.DisplayName, "text", txt)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (p *parseCmd) Run() error {
|
||
|
return nil
|
||
|
}
|