You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.1 KiB

package ui
import (
"bytes"
"fmt"
"time"
"github.com/RasmusLindroth/tut/api"
"github.com/RasmusLindroth/tut/config"
"github.com/RasmusLindroth/tut/util"
"github.com/rivo/tview"
)
type User struct {
Username string
Account string
DisplayName string
Locked bool
CreatedAt time.Time
FollowersCount int64
FollowingCount int64
StatusCount int64
Note string
URL string
Avatar string
AvatarStatic string
Header string
HeaderStatic string
Fields []Field
Bot bool
//Emojis []Emoji
//Moved *Account `json:"moved"`
}
type Field struct {
Name string
Value string
VerifiedAt time.Time
}
type DisplayUserData struct {
User User
Style config.Style
}
func drawUser(tv *TutView, data *api.User, main *tview.TextView, controls *tview.Flex, additional string, ut InputUserType) {
user := data.Data
relation := data.Relation
showUserControl := true
u := User{
Username: tview.Escape(user.Username),
Account: tview.Escape(user.Acct),
DisplayName: tview.Escape(user.DisplayName),
Locked: user.Locked,
CreatedAt: user.CreatedAt,
FollowersCount: user.FollowersCount,
FollowingCount: user.FollowingCount,
StatusCount: user.StatusesCount,
URL: user.URL,
Avatar: user.Avatar,
AvatarStatic: user.AvatarStatic,
Header: user.Header,
HeaderStatic: user.HeaderStatic,
Bot: user.Bot,
}
var urls []util.URL
fields := []Field{}
u.Note, urls = util.CleanHTML(user.Note)
for _, f := range user.Fields {
value, fu := util.CleanHTML(f.Value)
fields = append(fields, Field{
Name: tview.Escape(f.Name),
Value: tview.Escape(value),
VerifiedAt: f.VerifiedAt,
})
urls = append(urls, fu...)
}
u.Fields = fields
var controlItems []Control
if ut == InputUserFollowRequest {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserFollowRequestDecide, false))
}
if tv.tut.Client.Me.ID != user.ID {
if relation.Following {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserFollow, false))
} else {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserFollow, true))
}
if relation.Blocking {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserBlock, false))
} else {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserBlock, true))
}
if relation.Muting {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserMute, false))
} else {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserMute, true))
}
if len(urls) > 0 {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserLinks, true))
}
}
if showUserControl {
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserUser, true))
}
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserAvatar, true))
controlItems = append(controlItems, NewControl(tv.tut.Config, tv.tut.Config.Input.UserYank, true))
// Clear controls and only have add and delete for lists.
if ut == InputUserListAdd {
controlItems = []Control{NewControl(tv.tut.Config, tv.tut.Config.Input.ListUserAdd, true)}
} else if ut == InputUserListDelete {
controlItems = []Control{NewControl(tv.tut.Config, tv.tut.Config.Input.ListUserDelete, true)}
}
controls.Clear()
for i, item := range controlItems {
if i < len(controlItems)-1 {
controls.AddItem(NewControlButton(tv, item), item.Len+1, 0, false)
} else {
controls.AddItem(NewControlButton(tv, item), item.Len, 0, false)
}
}
ud := DisplayUserData{
User: u,
Style: tv.tut.Config.Style,
}
var output bytes.Buffer
err := tv.tut.Config.Templates.User.ExecuteTemplate(&output, "user.tmpl", ud)
if err != nil {
panic(err)
}
if main != nil {
if additional != "" {
additional = fmt.Sprintf("%s\n\n", config.SublteText(tv.tut.Config, tview.Escape(additional)))
}
main.SetText(additional + output.String())
}
}