package guilds
import (
"context"
"github.com/diamondburned/arikawa/v3/discord"
"github.com/diamondburned/gotk4/pkg/gtk/v4"
"github.com/diamondburned/gotkit/gtkutil/cssutil"
"github.com/diamondburned/ningen/v3"
"libdb.so/dissent/internal/components/hoverpopover"
"libdb.so/dissent/internal/gtkcord"
"libdb.so/dissent/internal/sidebar/sidebutton"
)
type Guild struct {
*sidebutton.Button
ctx context.Context
parent *Folder
popover *hoverpopover.MarkupHoverPopover
id discord.GuildID
name string
}
var guildCSS = cssutil.Applier("guild-guild", `
.guild-name {
font-weight: bold;
}
`)
func NewGuild(ctx context.Context, id discord.GuildID) *Guild {
g := &Guild{ctx: ctx, id: id}
g.Button = sidebutton.NewButton(ctx, func() {
parent := gtk.BaseWidget(g.Button.Parent())
parent.ActivateAction("win.open-guild", gtkcord.NewGuildIDVariant(id))
})
g.popover = hoverpopover.NewMarkupHoverPopover(g.Button, func(w *hoverpopover.MarkupHoverPopoverWidget) bool {
w.AddCSSClass("guild-name-popover")
w.SetPosition(gtk.PosRight)
w.Label.AddCSSClass("guild-name")
w.Label.SetText(g.name)
return true
})
g.SetUnavailable()
guildCSS(g)
return g
}
func (g *Guild) ID() discord.GuildID { return g.id }
func (g *Guild) Name() string { return g.name }
func (g *Guild) Invalidate() {
state := gtkcord.FromContext(g.ctx)
guild, err := state.Cabinet.Guild(g.id)
if err != nil {
g.SetUnavailable()
return
}
g.Update(guild)
}
func (g *Guild) SetUnavailable() {
g.name = "(guild unavailable)"
g.Icon.SetIconName("dialog-question-symbolic")
g.Icon.SetText("")
g.SetSensitive(false)
}
func (g *Guild) Update(guild *discord.Guild) {
g.name = guild.Name
g.SetSensitive(true)
g.Icon.SetText(guild.Name)
g.Icon.SetFromURL(gtkcord.InjectAvatarSize(guild.IconURL()))
g.InvalidateUnread()
}
func (g *Guild) SetParentFolder(parent *Folder) {
g.parent = parent
}
func (g *Guild) ParentFolder() *Folder {
return g.parent
}
func (g *Guild) viewChild() {}
func (g *Guild) InvalidateUnread() {
state := gtkcord.FromContext(g.ctx)
var mentions int
chs, _ := state.Cabinet.Channels(g.id)
for _, ch := range chs {
read := state.ReadState.ReadState(ch.ID)
if read != nil {
mentions += read.MentionCount
}
}
g.SetIndicator(state.GuildIsUnread(g.id, ningen.GuildUnreadOpts{
UnreadOpts: ningen.UnreadOpts{},
Types: gtkcord.AllowedChannelTypes,
}))
g.Mentions.SetCount(mentions)
if g.parent != nil {
g.parent.InvalidateUnread()
}
}