@ -757,6 +757,8 @@ TimelineModel::data(const mtx::events::collections::TimelineEvents &event, int r
return formatHistoryVisibilityEvent ( e ) ;
else if constexpr ( t = = mtx : : events : : EventType : : RoomGuestAccess )
return formatGuestAccessEvent ( e ) ;
else if constexpr ( t = = mtx : : events : : EventType : : RoomMember )
return formatMemberEvent ( e ) ;
return tr ( " %1 changed unknown state event %2. " )
. arg ( displayName ( QString : : fromStdString ( e . sender ) ) )
@ -2958,34 +2960,27 @@ TimelineModel::joinReplacementRoom(const QString &id)
}
QString
TimelineModel : : formatMemberEvent ( const QString & id )
TimelineModel : : formatMemberEvent (
const mtx : : events : : StateEvent < mtx : : events : : state : : Member > & event ) const
{
auto e = events . get ( id . toStdString ( ) , " " ) ;
if ( ! e )
return { } ;
auto event = std : : get_if < mtx : : events : : StateEvent < mtx : : events : : state : : Member > > ( e ) ;
if ( ! event )
return { } ;
mtx : : events : : StateEvent < mtx : : events : : state : : Member > const * prevEvent = nullptr ;
if ( ! event - > unsigned_data . replaces_state . empty ( ) ) {
auto tempPrevEvent = events . get ( event - > unsigned_data . replaces_state , event - > event_id ) ;
if ( ! event . unsigned_data . replaces_state . empty ( ) ) {
auto tempPrevEvent = events . get ( event . unsigned_data . replaces_state , event . event_id ) ;
if ( tempPrevEvent ) {
prevEvent =
std : : get_if < mtx : : events : : StateEvent < mtx : : events : : state : : Member > > ( tempPrevEvent ) ;
}
}
QString user = QString : : fromStdString ( event - > state_key ) ;
QString user = QString : : fromStdString ( event . state_key ) ;
QString name = utils : : replaceEmoji ( displayName ( user ) ) ;
QString rendered ;
QString sender = QString : : fromStdString ( event - > sender ) ;
QString sender = QString : : fromStdString ( event . sender ) ;
QString senderName = utils : : replaceEmoji ( displayName ( sender ) ) ;
// see table https://matrix.org/docs/spec/client_server/latest#m-room-member
using namespace mtx : : events : : state ;
switch ( event - > content . membership ) {
switch ( event . content . membership ) {
case Membership : : Invite :
rendered = tr ( " %1 invited %2. " ) . arg ( senderName , name ) ;
break ;
@ -2994,9 +2989,8 @@ TimelineModel::formatMemberEvent(const QString &id)
QString oldName = utils : : replaceEmoji (
QString : : fromStdString ( prevEvent - > content . display_name ) . toHtmlEscaped ( ) ) ;
bool displayNameChanged =
prevEvent - > content . display_name ! = event - > content . display_name ;
bool avatarChanged = prevEvent - > content . avatar_url ! = event - > content . avatar_url ;
bool displayNameChanged = prevEvent - > content . display_name ! = event . content . display_name ;
bool avatarChanged = prevEvent - > content . avatar_url ! = event . content . avatar_url ;
if ( displayNameChanged & & avatarChanged )
rendered = tr ( " %1 has changed their avatar and changed their "
@ -3011,30 +3005,30 @@ TimelineModel::formatMemberEvent(const QString &id)
// the case of nothing changed but join follows join shouldn't happen, so
// just show it as join
} else {
if ( event - > content . join_authorised_via_users_server . empty ( ) )
if ( event . content . join_authorised_via_users_server . empty ( ) )
rendered = tr ( " %1 joined. " ) . arg ( name ) ;
else
rendered =
tr ( " %1 joined via authorisation from %2's server. " )
. arg ( name ,
QString : : fromStdString ( event - > content . join_authorised_via_users_server ) ) ;
QString : : fromStdString ( event . content . join_authorised_via_users_server ) ) ;
}
break ;
case Membership : : Leave :
if ( ! prevEvent | | prevEvent - > content . membership = = Membership : : Join ) {
if ( event - > state_key = = event - > sender )
if ( event . state_key = = event . sender )
rendered = tr ( " %1 left the room. " ) . arg ( name ) ;
else
rendered = tr ( " %2 kicked %1. " ) . arg ( name , senderName ) ;
} else if ( prevEvent - > content . membership = = Membership : : Invite ) {
if ( event - > state_key = = event - > sender )
if ( event . state_key = = event . sender )
rendered = tr ( " %1 rejected their invite. " ) . arg ( name ) ;
else
rendered = tr ( " %2 revoked the invite to %1. " ) . arg ( name , senderName ) ;
} else if ( prevEvent - > content . membership = = Membership : : Ban ) {
rendered = tr ( " %2 unbanned %1. " ) . arg ( name , senderName ) ;
} else if ( prevEvent - > content . membership = = Membership : : Knock ) {
if ( event - > state_key = = event - > sender )
if ( event . state_key = = event . sender )
rendered = tr ( " %1 redacted their knock. " ) . arg ( name ) ;
else
rendered = tr ( " %2 rejected the knock from %1. " ) . arg ( name , senderName ) ;
@ -3053,8 +3047,8 @@ TimelineModel::formatMemberEvent(const QString &id)
break ;
}
if ( event - > content . reason ! = " " ) {
rendered + = " " + tr ( " Reason: %1 " ) . arg ( QString : : fromStdString ( event - > content . reason ) ) ;
if ( event . content . reason ! = " " ) {
rendered + = " " + tr ( " Reason: %1 " ) . arg ( QString : : fromStdString ( event . content . reason ) ) ;
}
return rendered ;