feat(feed): Add getActivityFeed() function (+ gitea.Client storage modifications)
This commit is contained in:
parent
cf2fbd8414
commit
d57c150cf3
14
config.go
14
config.go
@ -9,14 +9,14 @@ import (
|
|||||||
// Server holds information about a Gitea server.
|
// Server holds information about a Gitea server.
|
||||||
type Server struct {
|
type Server struct {
|
||||||
servername string
|
servername string
|
||||||
url string
|
url string
|
||||||
username string
|
username string
|
||||||
token string
|
token string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Configuration holds data retrieved from a Lua script.
|
// Configuration holds data retrieved from a Lua script.
|
||||||
type Configuration struct {
|
type Configuration struct {
|
||||||
servers []Server
|
servers []*Server
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseText parses a text value from the configuration file.
|
// parseText parses a text value from the configuration file.
|
||||||
@ -45,7 +45,7 @@ func parseServerFromTable(L *lua.LState, table lua.LValue) (Server, error) {
|
|||||||
if err := getStringFromTable(L, table, "url", &server.url); err != nil {
|
if err := getStringFromTable(L, table, "url", &server.url); err != nil {
|
||||||
return server, err
|
return server, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return server, nil
|
return server, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,10 +60,10 @@ func (config *Configuration) Parse(fname string) error {
|
|||||||
for i := 1; i <= L.ObjLen(table); i++ {
|
for i := 1; i <= L.ObjLen(table); i++ {
|
||||||
lserver := L.GetTable(table, lua.LNumber(i))
|
lserver := L.GetTable(table, lua.LNumber(i))
|
||||||
if server, err := parseServerFromTable(L, lserver); err == nil {
|
if server, err := parseServerFromTable(L, lserver); err == nil {
|
||||||
config.servers = append(config.servers, server)
|
config.servers = append(config.servers, &server)
|
||||||
} else {
|
} else {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
96
feed.go
Normal file
96
feed.go
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"code.gitea.io/sdk/gitea"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Activity stores an entry in a gitea user's activity feed.
|
||||||
|
type Activity struct {
|
||||||
|
act_user *gitea.User
|
||||||
|
act_user_id int64
|
||||||
|
comment gitea.Comment
|
||||||
|
comment_id int64
|
||||||
|
content string
|
||||||
|
created string
|
||||||
|
id int64
|
||||||
|
is_private bool
|
||||||
|
op_type string
|
||||||
|
ref_name string
|
||||||
|
repo *gitea.Repository
|
||||||
|
repo_id int64
|
||||||
|
user_id int64
|
||||||
|
}
|
||||||
|
|
||||||
|
// getActivityFeed returns the authenticated user's activity feed.
|
||||||
|
func getActivityFeed() []Activity {
|
||||||
|
feed := []Activity{}
|
||||||
|
for _, server := range config.servers {
|
||||||
|
client := Servers[server.servername]
|
||||||
|
resp, err := http.Get(fmt.Sprintf("%s/api/v1/users/%s/activities/feeds?limit=10&page=1",
|
||||||
|
server.url,
|
||||||
|
server.username,
|
||||||
|
))
|
||||||
|
if err != nil {
|
||||||
|
println("Failed to make HTTP request")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
var data []map[string]interface{}
|
||||||
|
err = json.NewDecoder(resp.Body).Decode(&data)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error decoding JSON: "+fmt.Sprint(err))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
for _, obj := range data {
|
||||||
|
act_user, _, err := client.GetUserInfo(obj["act_user"].(map[string]interface{})["login"].(string))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Error getting user: "+fmt.Sprint(err))
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
// repo, _, err := client.GetRepo(
|
||||||
|
// obj["repo"].
|
||||||
|
// (map[string]interface{})["name"].(string),
|
||||||
|
// obj["repo"].
|
||||||
|
// (map[string]interface{})["owner"].
|
||||||
|
// (map[string]interface{})["login"].(string),
|
||||||
|
// )
|
||||||
|
// if err != nil {
|
||||||
|
// fmt.Println("Failed to get repository: "+fmt.Sprint(err))
|
||||||
|
// continue
|
||||||
|
// }
|
||||||
|
var comment gitea.Comment
|
||||||
|
if obj["comment"] != nil {
|
||||||
|
raw_comment := obj["comment"].(map[string]interface{})
|
||||||
|
comment = gitea.Comment{
|
||||||
|
Body: raw_comment["body"].(string),
|
||||||
|
HTMLURL: raw_comment["html_url"].(string),
|
||||||
|
ID: int64(raw_comment["id"].(float64)),
|
||||||
|
IssueURL: raw_comment["issue_url"].(string),
|
||||||
|
OriginalAuthor: raw_comment["original_author"].(string),
|
||||||
|
OriginalAuthorID: int64(raw_comment["original_author_id"].(float64)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
feed = append(feed, Activity{
|
||||||
|
// repo: repo,
|
||||||
|
act_user: act_user,
|
||||||
|
act_user_id: int64(obj["act_user_id"].(float64)),
|
||||||
|
comment: comment,
|
||||||
|
comment_id: int64(obj["comment_id"].(float64)),
|
||||||
|
content: obj["content"].(string),
|
||||||
|
created: obj["created"].(string),
|
||||||
|
id: int64(obj["id"].(float64)),
|
||||||
|
is_private: obj["is_private"].(bool),
|
||||||
|
op_type: obj["op_type"].(string),
|
||||||
|
ref_name: obj["ref_name"].(string),
|
||||||
|
repo_id: int64(obj["repo_id"].(float64)),
|
||||||
|
user_id: int64(obj["user_id"].(float64)),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return feed
|
||||||
|
}
|
14
main.go
14
main.go
@ -10,11 +10,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var config Configuration
|
var config Configuration
|
||||||
var Clients map[string]*gitea.Client
|
var Servers map[string]*gitea.Client
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
parser := argparse.NewParser("gitivity", "Command line tool to get Gitea statistics")
|
parser := argparse.NewParser("gitivity", "Command line tool to get Gitea statistics")
|
||||||
Times := parser.NewCommand("times", "Get a user's tracked times.")
|
Times := parser.NewCommand("times", "Get a user's tracked times.")
|
||||||
|
Summary := parser.NewCommand("summary", "Display a summary of a user's activity.")
|
||||||
|
Feed := parser.NewCommand("feed", "Display the user's activity feed.")
|
||||||
config_path := parser.String("c", "config", &argparse.Options{Required: false, Help: "Configuration file", Default: "./config.lua"})
|
config_path := parser.String("c", "config", &argparse.Options{Required: false, Help: "Configuration file", Default: "./config.lua"})
|
||||||
server_option := parser.String("s", "server", &argparse.Options{Required: false, Help: "Specific server to use"})
|
server_option := parser.String("s", "server", &argparse.Options{Required: false, Help: "Specific server to use"})
|
||||||
|
|
||||||
@ -24,8 +26,8 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
Clients = make(map[string]*gitea.Client)
|
|
||||||
config = Configuration{}
|
config = Configuration{}
|
||||||
|
Servers = make(map[string]*gitea.Client)
|
||||||
if err := config.Parse(*config_path); err != nil {
|
if err := config.Parse(*config_path); err != nil {
|
||||||
panic("Failed to parse configuration file")
|
panic("Failed to parse configuration file")
|
||||||
}
|
}
|
||||||
@ -42,14 +44,18 @@ func main() {
|
|||||||
fmt.Printf("Failed to create Gitea client! (%s)\n", err)
|
fmt.Printf("Failed to create Gitea client! (%s)\n", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
Clients[server.servername] = client
|
Servers[server.servername] = client
|
||||||
}
|
}
|
||||||
if len(Clients) == 0 {
|
if len(Servers) == 0 {
|
||||||
println("No servers configured / specified")
|
println("No servers configured / specified")
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if Times.Happened() {
|
if Times.Happened() {
|
||||||
times()
|
times()
|
||||||
|
} else if Summary.Happened() {
|
||||||
|
summary()
|
||||||
|
} else if Feed.Happened() {
|
||||||
|
//feed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,9 @@ type Colors struct {
|
|||||||
overlay []lipgloss.Color
|
overlay []lipgloss.Color
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Styles struct {
|
||||||
|
}
|
||||||
|
|
||||||
var colors = Colors{
|
var colors = Colors{
|
||||||
green: lipgloss.Color("#a6da95"),
|
green: lipgloss.Color("#a6da95"),
|
||||||
text: lipgloss.Color("#cad3f5"),
|
text: lipgloss.Color("#cad3f5"),
|
||||||
|
72
summary.go
Normal file
72
summary.go
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"code.gitea.io/sdk/gitea"
|
||||||
|
tea "github.com/charmbracelet/bubbletea"
|
||||||
|
)
|
||||||
|
|
||||||
|
type summaryviewer struct {
|
||||||
|
times []gitea.TrackedTime
|
||||||
|
total_time time.Duration
|
||||||
|
quitting bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m summaryviewer) Init() tea.Cmd {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m summaryviewer) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
||||||
|
switch msg := msg.(type) {
|
||||||
|
case tea.KeyMsg:
|
||||||
|
switch msg.String() {
|
||||||
|
case "q", "ctrl+c":
|
||||||
|
return m, tea.Quit
|
||||||
|
default:
|
||||||
|
return m, tea.Printf("You pressed: %s", msg.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return m, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m summaryviewer) View() string {
|
||||||
|
s := ""
|
||||||
|
if !m.quitting {
|
||||||
|
s += "Showing statistics for user "
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func summary() {
|
||||||
|
p := tea.NewProgram(initialIndicator(("Fetching time logs...")))
|
||||||
|
go func() {
|
||||||
|
if _, err := p.Run(); err != nil {
|
||||||
|
panic("An error occured.")
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
viewer := summaryviewer{}
|
||||||
|
since := time.Now().AddDate(0, 0, -14)
|
||||||
|
viewer.times = getTimeLogs(since, func(repo gitea.Repository, took time.Duration) {
|
||||||
|
p.Send(IndicatorInfo{
|
||||||
|
info: fmt.Sprintf("%s / %s", repo.Owner.UserName, repo.Name),
|
||||||
|
duration: took,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
for _, t := range viewer.times {
|
||||||
|
viewer.total_time += time.Duration(t.Time * int64(time.Second))
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Send(IndicatorInfo{info: "Done", quitting: true})
|
||||||
|
p.RestoreTerminal()
|
||||||
|
p.Quit()
|
||||||
|
|
||||||
|
program := tea.NewProgram(viewer)
|
||||||
|
if _, err := program.Run(); err != nil {
|
||||||
|
panic("An error occurred.")
|
||||||
|
}
|
||||||
|
}
|
2
times.go
2
times.go
@ -15,7 +15,7 @@ import (
|
|||||||
// getTimeLogs gets every single time log possible.
|
// getTimeLogs gets every single time log possible.
|
||||||
func getTimeLogs(since time.Time, on_process_repo func(repo gitea.Repository, took time.Duration)) []gitea.TrackedTime {
|
func getTimeLogs(since time.Time, on_process_repo func(repo gitea.Repository, took time.Duration)) []gitea.TrackedTime {
|
||||||
var times []gitea.TrackedTime
|
var times []gitea.TrackedTime
|
||||||
for _, client := range Clients {
|
for _, client := range Servers {
|
||||||
page := 1
|
page := 1
|
||||||
user, _, err := client.GetMyUserInfo()
|
user, _, err := client.GetMyUserInfo()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user