Compare commits

...

2 Commits

Author SHA1 Message Date
diamondburned deb4ccb32b Fix missing guild folder labels 2021-03-25 23:39:53 -07:00
diamondburned 9eb392a954 Implement AddPresenceLabel 2021-03-25 23:32:15 -07:00
5 changed files with 104 additions and 37 deletions

View File

@ -66,11 +66,7 @@ func (a Author) ID() cchat.ID {
// Name subscribes the author to the global name label registry. // Name subscribes the author to the global name label registry.
func (a Author) Name(_ context.Context, l cchat.LabelContainer) (func(), error) { func (a Author) Name(_ context.Context, l cchat.LabelContainer) (func(), error) {
if guildID := a.user.GuildID(); guildID.IsValid() { return a.state.Labels.AddMemberLabel(a.user.GuildID(), a.user.UserID(), l), nil
return a.state.Labels.AddMemberLabel(guildID, a.user.UserID(), l), nil
}
return a.state.Labels.AddPresenceLabel(a.user.UserID(), l), nil
} }
const authorReplyingTo = " replying to " const authorReplyingTo = " replying to "

View File

@ -56,6 +56,8 @@ func (gf *GuildFolder) Name(ctx context.Context, l cchat.LabelContainer) (func()
} }
} }
l.SetLabel(name)
// TODO: add folder updater from setting update events. // TODO: add folder updater from setting update events.
return func() {}, nil return func() {}, nil
} }

View File

@ -93,6 +93,58 @@ func (r *Repository) AddGuildLabel(guildID discord.GuildID, l cchat.LabelContain
} }
} }
func (r *Repository) onChannelDelete(ev *gateway.ChannelDeleteEvent) {
// Not sure what to do.
}
func (r *Repository) onChannelUpdate(ev *gateway.ChannelUpdateEvent) {
r.mutex.Lock()
defer r.mutex.Unlock()
if r.stopped {
return
}
channel, ok := r.stores.channels[ev.ID]
if !ok {
return
}
rich := mention.NewChannelText(r.state, ev.ID)
for labeler := range channel {
labeler.SetLabel(rich)
}
}
// AddChannelLabel adds a label to display the given channel live. Refer to
// Repository for more documentation.
func (r *Repository) AddChannelLabel(chID discord.ChannelID, l cchat.LabelContainer) func() {
l.SetLabel(mention.NewChannelText(r.state, chID))
r.mutex.Lock()
defer r.mutex.Unlock()
llist := r.stores.channels[chID]
llist.Add(l)
r.stores.channels[chID] = llist
return func() {
r.mutex.Lock()
defer r.mutex.Unlock()
llist := r.stores.channels[chID]
llist.Remove(l)
if len(llist) == 0 {
delete(r.stores.channels, chID)
return
}
r.stores.channels[chID] = llist
}
}
func (r *Repository) onMemberRemove(ev *gateway.GuildMemberRemoveEvent) { func (r *Repository) onMemberRemove(ev *gateway.GuildMemberRemoveEvent) {
// Not sure what to do. // Not sure what to do.
} }
@ -189,11 +241,7 @@ func (r *Repository) AddMemberLabel(
} }
} }
func (r *Repository) onChannelDelete(ev *gateway.ChannelDeleteEvent) { func (r *Repository) onPresenceUpdate(ev *gateway.PresenceUpdateEvent) {
// Not sure what to do.
}
func (r *Repository) onChannelUpdate(ev *gateway.ChannelUpdateEvent) {
r.mutex.Lock() r.mutex.Lock()
defer r.mutex.Unlock() defer r.mutex.Unlock()
@ -201,53 +249,44 @@ func (r *Repository) onChannelUpdate(ev *gateway.ChannelUpdateEvent) {
return return
} }
channel, ok := r.stores.channels[ev.ID] labels, ok := r.stores.presences[ev.User.ID]
if !ok { if !ok {
return return
} }
rich := mention.NewChannelText(r.state, ev.ID) rich := mention.NewUserText(r.state, ev.User.ID)
for labeler := range channel { for label := range labels {
labeler.SetLabel(rich) label.SetLabel(rich)
} }
} }
// AddChannelLabel adds a label to display the given channel live. Refer to func (r *Repository) AddPresenceLabel(uID discord.UserID, l cchat.LabelContainer) func() {
// Repository for more documentation. l.SetLabel(mention.NewUserText(r.state, uID))
func (r *Repository) AddChannelLabel(chID discord.ChannelID, l cchat.LabelContainer) func() {
l.SetLabel(mention.NewChannelText(r.state, chID))
r.mutex.Lock() r.mutex.Lock()
defer r.mutex.Unlock() defer r.mutex.Unlock()
llist := r.stores.channels[chID] llist := r.stores.presences[uID]
llist.Add(l) llist.Add(l)
r.stores.channels[chID] = llist r.stores.presences[uID] = llist
return func() { return func() {
r.mutex.Lock() r.mutex.Lock()
defer r.mutex.Unlock() defer r.mutex.Unlock()
llist := r.stores.channels[chID] llist := r.stores.presences[uID]
llist.Remove(l) llist.Remove(l)
if len(llist) == 0 { if len(llist) == 0 {
delete(r.stores.channels, chID) delete(r.stores.presences, uID)
return return
} }
r.stores.channels[chID] = llist r.stores.presences[uID] = llist
} }
} }
func (r *Repository) AddPresenceLabel(uID discord.UserID, l cchat.LabelContainer) func() {
// TODO: Presence update events
// TODO: user fallbacks
panic("Implement me")
return nil
}
// Stop detaches all handlers. // Stop detaches all handlers.
func (r *Repository) Stop() { func (r *Repository) Stop() {
r.mutex.Lock() r.mutex.Lock()

View File

@ -16,22 +16,20 @@ type Segment struct {
} }
func (s Segment) Bounds() (int, int) { return s.Position, s.Position } func (s Segment) Bounds() (int, int) { return s.Position, s.Position }
func (s Segment) AsAvatarer() text.Avatarer { return avatarURL{s} } func (s Segment) AsAvatarer() text.Avatarer { return avatarURL(s) }
type avatarURL struct { type avatarURL Segment
seg Segment
}
var _ text.Avatarer = avatarURL{} var _ text.Avatarer = avatarURL{}
func (aurl avatarURL) AvatarText() string { func (aurl avatarURL) AvatarText() string {
return aurl.seg.Text return aurl.Text
} }
func (aurl avatarURL) AvatarSize() int { func (aurl avatarURL) AvatarSize() int {
return aurl.seg.Size return aurl.Size
} }
func (aurl avatarURL) Avatar() string { func (aurl avatarURL) Avatar() string {
return aurl.seg.URL return aurl.URL
} }

View File

@ -49,6 +49,38 @@ func NewMemberText(s *ningen.State, g discord.GuildID, u discord.UserID) text.Ri
return rich return rich
} }
// NewUserText creates a new rich text describing a Discord user using the
// Presence API.
func NewUserText(s *ningen.State, u discord.UserID) text.Rich {
p, err := s.Presence(0, u)
if err != nil {
return text.Plain(u.Mention())
}
user := NewUser(p.User)
user.WithPresence(*p)
user.WithState(s)
user.Prefetch()
rich := text.Rich{Content: user.DisplayName()}
rich.Segments = []text.Segment{
Segment{
Start: 0,
End: len(rich.Content),
User: user,
},
}
if p.User.Bot {
rich.Content += " "
rich.Segments = append(rich.Segments,
colored.NewBlurple(segutil.Write(&rich, "[BOT]")),
)
}
return rich
}
type User struct { type User struct {
user discord.User user discord.User
guildID discord.GuildID guildID discord.GuildID