From a691813b90410010ae9f12548158faf4d3a76a5a Mon Sep 17 00:00:00 2001 From: diamondburned Date: Sat, 2 Jan 2021 00:52:53 -0800 Subject: [PATCH] partially fixed references --- internal/discord/channel/message/message.go | 12 ++--- internal/discord/message/author.go | 18 ++++---- internal/discord/message/message.go | 49 ++++++++++++--------- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/internal/discord/channel/message/message.go b/internal/discord/channel/message/message.go index ba796e6..c57bc63 100644 --- a/internal/discord/channel/message/message.go +++ b/internal/discord/channel/message/message.go @@ -64,26 +64,26 @@ func (msgr *Messenger) JoinServer(ctx context.Context, ct cchat.MessagesContaine return } - m, err := msgr.Messages() + messages, err := msgr.Messages() if err != nil { // TODO: log return } - g, err := msgr.Guild() + guild, err := msgr.Guild() if err != nil { return } // Loop over all messages and replace the author. The latest // messages are in front. - for _, msg := range m { - for _, member := range c.Members { - if msg.Author.ID != member.User.ID { + for _, msg := range messages { + for _, m := range c.Members { + if msg.Author.ID != m.User.ID { continue } - ct.UpdateMessage(message.NewMessageUpdateAuthor(msg, member, *g, msgr.State)) + ct.UpdateMessage(message.NewMessageUpdateAuthor(msg, m, *guild, msgr.State)) } } })) diff --git a/internal/discord/message/author.go b/internal/discord/message/author.go index 3b65ea4..403eda1 100644 --- a/internal/discord/message/author.go +++ b/internal/discord/message/author.go @@ -135,22 +135,22 @@ func (a *Author) addAuthorReference(msgref discord.Message, s *state.Instance) { } // AddMessageReference adds a message reference to the author. -func (a *Author) AddMessageReference(msgref discord.Message, s *state.Instance) { - if !msgref.GuildID.IsValid() { - a.addAuthorReference(msgref, s) +func (a *Author) AddMessageReference(ref discord.Message, s *state.Instance) { + if !ref.GuildID.IsValid() { + a.addAuthorReference(ref, s) return } - g, err := s.Cabinet.Guild(msgref.GuildID) + g, err := s.Cabinet.Guild(ref.GuildID) if err != nil { - a.addAuthorReference(msgref, s) + a.addAuthorReference(ref, s) return } - m, err := s.Cabinet.Member(g.ID, msgref.Author.ID) + m, err := s.Cabinet.Member(g.ID, ref.Author.ID) if err != nil { - a.addAuthorReference(msgref, s) - s.MemberState.RequestMember(msgref.GuildID, msgref.Author.ID) + a.addAuthorReference(ref, s) + s.MemberState.RequestMember(g.ID, ref.Author.ID) return } @@ -158,6 +158,6 @@ func (a *Author) AddMessageReference(msgref discord.Message, s *state.Instance) start, end := richMember(&a.name, *m, *g, s) a.name.Segments = append(a.name.Segments, - reference.NewMessageSegment(start, end, msgref.ID), + reference.NewMessageSegment(start, end, ref.ID), ) } diff --git a/internal/discord/message/message.go b/internal/discord/message/message.go index 4c9ddfc..f038df7 100644 --- a/internal/discord/message/message.go +++ b/internal/discord/message/message.go @@ -174,7 +174,7 @@ func NewMessage(m discord.Message, s *state.Instance, author Author) Message { content.Content = strings.ReplaceAll(refmsg, "\n", " ") + "\n" content.Segments = []text.Segment{ - reference.NewMessageSegment(0, len(refmsg), ref.ID), + reference.NewMessageSegment(0, len(content.Content), ref.ID), } author.AddMessageReference(*ref, s) @@ -186,22 +186,20 @@ func NewMessage(m discord.Message, s *state.Instance, author Author) Message { // Request members in mentions if we're in a guild. if m.GuildID.IsValid() { for _, segment := range content.Segments { - if mention, ok := segment.(*mention.Segment); ok { - // If this is not a user mention, then skip. - if mention.User == nil { - continue - } - - // If we already have a member, then skip. We could check this - // using the timestamp, as we might have a user set into the - // member field - if mention.User.Member.Joined.IsValid() { - continue - } - - // Request the member. - s.MemberState.RequestMember(m.GuildID, mention.User.Member.User.ID) + mention, ok := segment.(*mention.Segment) + if !ok { + continue } + + // If this is not a user mention, then skip. If we already have a + // member, then skip. We could check this using the timestamp, as we + // might have a user set into the member field. + if mention.User == nil || mention.User.Member.Joined.IsValid() { + continue + } + + // Request the member. + s.MemberState.RequestMember(m.GuildID, mention.User.Member.User.ID) } } @@ -233,15 +231,26 @@ func (m Message) Mentioned() bool { // ReferencedMessage searches for the referenced message if needed. func ReferencedMessage(m discord.Message, s *state.Instance, wait bool) (reply *discord.Message) { - if m.ReferencedMessage != nil { - return m.ReferencedMessage - } - // Deleted or does not exist. if m.Reference == nil || !m.Reference.MessageID.IsValid() { return nil } + // Check these in case. + if !m.Reference.ChannelID.IsValid() { + m.Reference.ChannelID = m.ChannelID + } + if !m.Reference.GuildID.IsValid() { + m.Reference.GuildID = m.GuildID + } + + if m.ReferencedMessage != nil { + // Set these in case Discord acts dumb. + m.ReferencedMessage.GuildID = m.Reference.GuildID + m.ReferencedMessage.ChannelID = m.Reference.ChannelID + return m.ReferencedMessage + } + if !wait { reply, _ = s.Cabinet.Message(m.Reference.ChannelID, m.Reference.MessageID) } else {