Merge pull request #6280 from robintown/group-acls

Group ACLs with MELS
This commit is contained in:
J. Ryan Stinnett 2021-06-29 10:02:12 +01:00 committed by GitHub
commit 14ef38e057
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 6 deletions

View file

@ -38,6 +38,7 @@ import defaultDispatcher from '../../dispatcher/dispatcher';
const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes const CONTINUATION_MAX_INTERVAL = 5 * 60 * 1000; // 5 minutes
const continuedTypes = ['m.sticker', 'm.room.message']; const continuedTypes = ['m.sticker', 'm.room.message'];
const membershipTypes = ['m.room.member', 'm.room.third_party_invite', 'm.room.server_acl'];
// check if there is a previous event and it has the same sender as this event // check if there is a previous event and it has the same sender as this event
// and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL // and the types are the same/is in continuedTypes and the time between them is <= CONTINUATION_MAX_INTERVAL
@ -66,8 +67,6 @@ function shouldFormContinuation(prevEvent, mxEvent) {
return true; return true;
} }
const isMembershipChange = (e) => e.getType() === 'm.room.member' || e.getType() === 'm.room.third_party_invite';
/* (almost) stateless UI component which builds the event tiles in the room timeline. /* (almost) stateless UI component which builds the event tiles in the room timeline.
*/ */
@replaceableComponent("structures.MessagePanel") @replaceableComponent("structures.MessagePanel")
@ -1144,7 +1143,7 @@ class RedactionGrouper {
// Wrap consecutive member events in a ListSummary, ignore if redacted // Wrap consecutive member events in a ListSummary, ignore if redacted
class MemberGrouper { class MemberGrouper {
static canStartGroup = function(panel, ev) { static canStartGroup = function(panel, ev) {
return panel._shouldShowEvent(ev) && isMembershipChange(ev); return panel._shouldShowEvent(ev) && membershipTypes.includes(ev.getType());
} }
constructor(panel, ev, prevEvent, lastShownEvent) { constructor(panel, ev, prevEvent, lastShownEvent) {
@ -1162,7 +1161,7 @@ class MemberGrouper {
if (this.panel._wantsDateSeparator(this.events[0], ev.getDate())) { if (this.panel._wantsDateSeparator(this.events[0], ev.getDate())) {
return false; return false;
} }
return isMembershipChange(ev); return membershipTypes.includes(ev.getType());
} }
add(ev) { add(ev) {

View file

@ -66,6 +66,7 @@ enum TransitionType {
ChangedName = "changed_name", ChangedName = "changed_name",
ChangedAvatar = "changed_avatar", ChangedAvatar = "changed_avatar",
NoChange = "no_change", NoChange = "no_change",
ServerAcl = "server_acl",
} }
const SEP = ","; const SEP = ",";
@ -298,6 +299,12 @@ export default class MemberEventListSummary extends React.Component<IProps> {
? _t("%(severalUsers)smade no changes %(count)s times", { severalUsers: "", count: repeats }) ? _t("%(severalUsers)smade no changes %(count)s times", { severalUsers: "", count: repeats })
: _t("%(oneUser)smade no changes %(count)s times", { oneUser: "", count: repeats }); : _t("%(oneUser)smade no changes %(count)s times", { oneUser: "", count: repeats });
break; break;
case "server_acl":
res = (userCount > 1)
? _t("%(severalUsers)schanged the server ACLs %(count)s times",
{ severalUsers: "", count: repeats })
: _t("%(oneUser)schanged the server ACLs %(count)s times", { oneUser: "", count: repeats });
break;
} }
return res; return res;
@ -324,6 +331,10 @@ export default class MemberEventListSummary extends React.Component<IProps> {
return TransitionType.Invited; return TransitionType.Invited;
} }
if (e.mxEvent.getType() === 'm.room.server_acl') {
return TransitionType.ServerAcl;
}
switch (e.mxEvent.getContent().membership) { switch (e.mxEvent.getContent().membership) {
case 'invite': return TransitionType.Invited; case 'invite': return TransitionType.Invited;
case 'ban': return TransitionType.Banned; case 'ban': return TransitionType.Banned;
@ -410,19 +421,23 @@ export default class MemberEventListSummary extends React.Component<IProps> {
// Object mapping user IDs to an array of IUserEvents // Object mapping user IDs to an array of IUserEvents
const userEvents: Record<string, IUserEvents[]> = {}; const userEvents: Record<string, IUserEvents[]> = {};
eventsToRender.forEach((e, index) => { eventsToRender.forEach((e, index) => {
const userId = e.getStateKey(); const userId = e.getType() === 'm.room.server_acl' ? e.getSender() : e.getStateKey();
// Initialise a user's events // Initialise a user's events
if (!userEvents[userId]) { if (!userEvents[userId]) {
userEvents[userId] = []; userEvents[userId] = [];
} }
if (e.target) { if (e.getType() === 'm.room.server_acl') {
latestUserAvatarMember.set(userId, e.sender);
} else if (e.target) {
latestUserAvatarMember.set(userId, e.target); latestUserAvatarMember.set(userId, e.target);
} }
let displayName = userId; let displayName = userId;
if (e.getType() === 'm.room.third_party_invite') { if (e.getType() === 'm.room.third_party_invite') {
displayName = e.getContent().display_name; displayName = e.getContent().display_name;
} else if (e.getType() === 'm.room.server_acl') {
displayName = e.sender.name;
} else if (e.target) { } else if (e.target) {
displayName = e.target.name; displayName = e.target.name;
} }

View file

@ -2050,6 +2050,10 @@
"%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)smade no changes", "%(severalUsers)smade no changes %(count)s times|one": "%(severalUsers)smade no changes",
"%(oneUser)smade no changes %(count)s times|other": "%(oneUser)smade no changes %(count)s times", "%(oneUser)smade no changes %(count)s times|other": "%(oneUser)smade no changes %(count)s times",
"%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes", "%(oneUser)smade no changes %(count)s times|one": "%(oneUser)smade no changes",
"%(severalUsers)schanged the server ACLs %(count)s times|other": "%(severalUsers)schanged the server ACLs %(count)s times",
"%(severalUsers)schanged the server ACLs %(count)s times|one": "%(severalUsers)schanged the server ACLs",
"%(oneUser)schanged the server ACLs %(count)s times|other": "%(oneUser)schanged the server ACLs %(count)s times",
"%(oneUser)schanged the server ACLs %(count)s times|one": "%(oneUser)schanged the server ACLs",
"Power level": "Power level", "Power level": "Power level",
"Custom level": "Custom level", "Custom level": "Custom level",
"QR Code": "QR Code", "QR Code": "QR Code",