Compare commits
2 Commits
f9814bf410
...
deb4ccb32b
Author | SHA1 | Date |
---|---|---|
diamondburned | deb4ccb32b | |
diamondburned | 9eb392a954 |
|
@ -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 "
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue