| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -39,6 +39,8 @@ func ParseEvent(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Event
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						fallthrough
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.EventMessage:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						return ParseMessage(matrix, room, evt)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.StateTopic, mautrix.StateRoomName, mautrix.StateAliases, mautrix.StateCanonicalAlias:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						return ParseStateEvent(matrix, room, evt)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.StateMember:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						return ParseMembershipEvent(room, evt)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -53,6 +55,45 @@ func unixToTime(unix int64) time.Time {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return timestamp
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func ParseStateEvent(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Event) messages.UIMessage {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					displayname := evt.Sender
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					member := room.GetMember(evt.Sender)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if member != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						displayname = member.Displayname
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					text := tstring.NewColorTString(displayname, widget.GetHashColor(evt.Sender))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					switch evt.Type {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.StateTopic:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if len(evt.Content.Topic) == 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							text = text.AppendColor(" removed the topic.", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							text = text.AppendColor(" changed the topic to ", tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								AppendStyle(evt.Content.Topic, tcell.StyleDefault.Underline(true)).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								AppendColor(".", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.StateRoomName:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if len(evt.Content.Name) == 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							text = text.AppendColor(" removed the room name.", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							text = text.AppendColor(" changed the room name to ", tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								AppendStyle(evt.Content.Name, tcell.StyleDefault.Underline(true)).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								AppendColor(".", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.StateCanonicalAlias:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						if len(evt.Content.Alias) == 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							text = text.AppendColor(" removed the main address of the room.", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							text = text.AppendColor(" changed the main address of the room to ", tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								AppendStyle(evt.Content.Alias, tcell.StyleDefault.Underline(true)).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								AppendColor(".", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					case mautrix.StateAliases:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text = ParseAliasEvent(evt, displayname)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ts := unixToTime(evt.Timestamp)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return messages.NewExpandedTextMessage(evt.ID, evt.Sender, displayname, mautrix.MessageType(evt.Type.Type), text, ts)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func ParseMessage(matrix ifc.MatrixContainer, room *rooms.Room, evt *mautrix.Event) messages.UIMessage {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					displayname := evt.Sender
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					member := room.GetMember(evt.Sender)
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -153,10 +194,12 @@ func getMembershipEventContent(room *rooms.Room, evt *mautrix.Event) (sender str
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						sender, text = getMembershipChangeMessage(evt, membership, prevMembership, senderDisplayname, displayname, prevDisplayname)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else if displayname != prevDisplayname {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						sender = "---"
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text = tstring.NewColorTString(fmt.Sprintf("%s changed their display name to %s.", prevDisplayname, displayname), tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						color := widget.GetHashColor(*evt.StateKey)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text.Colorize(0, len(prevDisplayname), color)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text.Colorize(len(prevDisplayname)+len(" changed their display name to "), len(displayname), color)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text = tstring.NewBlankTString().
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(prevDisplayname, color).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(" changed their display name to ", tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(displayname, color).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(".", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					
					| 
						
					 | 
				
			
			 | 
			 | 
			
				@@ -170,3 +213,66 @@ func ParseMembershipEvent(room *rooms.Room, evt *mautrix.Event) messages.UIMessa
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					ts := unixToTime(evt.Timestamp)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return messages.NewExpandedTextMessage(evt.ID, evt.Sender, displayname, "m.room.member", text, ts)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				func ParseAliasEvent(evt *mautrix.Event, displayname string) tstring.TString {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					var prevAliases []string
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if evt.Unsigned.PrevContent != nil {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						prevAliases = evt.Unsigned.PrevContent.Aliases
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					aliases := evt.Content.Aliases
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					var added, removed []tstring.TString
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Outer1:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for _, oldAlias := range prevAliases {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						for _, newAlias := range aliases {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							if oldAlias == newAlias {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								continue Outer1
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						removed = append(removed, tstring.NewStyleTString(oldAlias, tcell.StyleDefault.Foreground(widget.GetHashColor(oldAlias)).Underline(true)))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				Outer2:
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					for _, newAlias := range aliases {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						for _, oldAlias := range prevAliases {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							if oldAlias == newAlias {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
								continue Outer2
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						added = append(added, tstring.NewStyleTString(newAlias, tcell.StyleDefault.Foreground(widget.GetHashColor(newAlias)).Underline(true)))
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					var addedStr, removedStr tstring.TString
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if len(added) == 1 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						addedStr = added[0]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else if len(added) > 1 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						addedStr = tstring.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							Join(added[:len(added)-1], ", ").
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							Append(" and ").
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendTString(added[len(added)-1])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if len(removed) == 1 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						removedStr = removed[0]
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else if len(removed) > 1 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						removedStr = tstring.
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							Join(removed[:len(removed)-1], ", ").
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							Append(" and ").
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendTString(removed[len(removed)-1])
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					text := tstring.NewBlankTString()
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					if len(addedStr) > 0 && len(removedStr) > 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text = text.AppendColor(fmt.Sprintf("%s added ", displayname), tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendTString(addedStr).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(" and removed ", tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendTString(removedStr).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(" as addresses for this room.", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else if len(addedStr) > 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text = text.AppendColor(fmt.Sprintf("%s added ", displayname), tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendTString(addedStr).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(" as addresses for this room.", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else if len(removedStr) > 0 {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						text = text.AppendColor(fmt.Sprintf("%s removed ", displayname), tcell.ColorGreen).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendTString(removedStr).
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
							AppendColor(" as addresses for this room.", tcell.ColorGreen)
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					} else {
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
						return nil
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					}
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
					return text
 | 
			
		
		
	
		
			
				 | 
				 | 
			
			 | 
			 | 
			
				}
 | 
			
		
		
	
	
		
			
				
					
					| 
						 
							
							
							
						 
					 | 
				
			
			 | 
			 | 
			
				 
 |