Clean up everything

This commit is contained in:
Christian Pauly 2020-01-19 15:07:42 +01:00
commit f4ef4eeea9
15 changed files with 617 additions and 375 deletions

View file

@ -0,0 +1,224 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
import 'room_state_enums_extensions.dart';
extension LocalizedBody on Event {
static Set<MessageTypes> textOnlyMessageTypes = {
MessageTypes.Text,
MessageTypes.Reply,
MessageTypes.Notice,
MessageTypes.Emote,
MessageTypes.None,
};
getLocalizedBody(BuildContext context,
{bool withSenderNamePrefix = false, hideQuotes = false}) {
if (this.redacted) {
return "Redacted by ${this.redactedBecause.sender.calcDisplayname()}";
}
String localizedBody = body;
final String senderName = this.sender.calcDisplayname();
switch (this.type) {
case EventTypes.Sticker:
localizedBody = "$senderName sent a sticker";
break;
case EventTypes.Redaction:
localizedBody = "$senderName redacted an event";
break;
case EventTypes.RoomAliases:
localizedBody = "$senderName changed the room aliases";
break;
case EventTypes.RoomCanonicalAlias:
localizedBody = "$senderName changed the room invite link";
break;
case EventTypes.RoomCreate:
localizedBody = "$senderName created the room";
break;
case EventTypes.RoomJoinRules:
JoinRules joinRules = JoinRules.values.firstWhere(
(r) =>
r.toString().replaceAll("JoinRules.", "") ==
content["join_rule"],
orElse: () => null);
if (joinRules == null) {
localizedBody = "$senderName changed the join rules";
} else {
localizedBody =
"$senderName changed the join rules to: ${joinRules.getLocalizedString(context)}";
}
break;
case EventTypes.RoomMember:
String text = "Failed to parse member event";
final String targetName = this.stateKeyUser.calcDisplayname();
// Has the membership changed?
final String newMembership = this.content["membership"] ?? "";
final String oldMembership =
this.unsigned["prev_content"] is Map<String, dynamic>
? this.unsigned["prev_content"]["membership"] ?? ""
: "";
if (newMembership != oldMembership) {
if (oldMembership == "invite" && newMembership == "join") {
text = "$targetName has accepted the invitation";
} else if (oldMembership == "leave" && newMembership == "join") {
text = "$targetName has joined the chat";
} else if (oldMembership == "join" && newMembership == "ban") {
text = "$senderName has kicked and banned $targetName";
} else if (oldMembership == "join" &&
newMembership == "leave" &&
this.stateKey != this.senderId) {
text = "$senderName has kicked $targetName";
} else if (oldMembership == "join" &&
newMembership == "leave" &&
this.stateKey == this.senderId) {
text = "$senderName has left the room";
} else if (oldMembership == "invite" && newMembership == "ban") {
text = "$senderName has banned $targetName";
} else if (oldMembership == "leave" && newMembership == "ban") {
text = "$senderName has banned $targetName";
} else if (oldMembership == "ban" && newMembership == "leave") {
text = "$senderName has unbanned $targetName";
} else if (newMembership == "invite") {
text = "$senderName has invited $targetName";
} else if (newMembership == "join") {
text = "$targetName has joined";
}
} else if (newMembership == "join") {
final String newAvatar = this.content["avatar_url"] ?? "";
final String oldAvatar =
this.unsigned["prev_content"] is Map<String, dynamic>
? this.unsigned["prev_content"]["avatar_url"] ?? ""
: "";
final String newDisplayname = this.content["displayname"] ?? "";
final String oldDisplayname =
this.unsigned["prev_content"] is Map<String, dynamic>
? this.unsigned["prev_content"]["displayname"] ?? ""
: "";
// Has the user avatar changed?
if (newAvatar != oldAvatar) {
text = "$targetName has changed the profile avatar";
}
// Has the user avatar changed?
else if (newDisplayname != oldDisplayname) {
text =
"${this.stateKeyUser.id} has changed the displayname to '$newDisplayname'";
}
}
localizedBody = text;
break;
case EventTypes.RoomPowerLevels:
localizedBody = "$senderName changed the group permissions";
break;
case EventTypes.RoomName:
localizedBody =
"$senderName changed the group name to: '${content["name"]}'";
break;
case EventTypes.RoomTopic:
localizedBody =
"$senderName changed the group name to: '${content["topic"]}'";
break;
case EventTypes.RoomAvatar:
localizedBody = "$senderName changed the group avatar";
break;
case EventTypes.GuestAccess:
GuestAccess guestAccess = GuestAccess.values.firstWhere(
(r) =>
r.toString().replaceAll("GuestAccess.", "") ==
content["guest_access"],
orElse: () => null);
if (guestAccess == null) {
localizedBody = "$senderName changed the guest access rules";
} else {
localizedBody =
"$senderName changed the guest access rules to: ${guestAccess.getLocalizedString(context)}";
}
break;
case EventTypes.HistoryVisibility:
HistoryVisibility historyVisibility = HistoryVisibility.values
.firstWhere(
(r) =>
r.toString().replaceAll("HistoryVisibility.", "") ==
content["history_visibility"],
orElse: () => null);
if (historyVisibility == null) {
localizedBody = "$senderName changed the history visibility";
} else {
localizedBody =
"$senderName changed the history visibility to: ${historyVisibility.getLocalizedString(context)}";
}
break;
case EventTypes.Encryption:
localizedBody = "$senderName activated end to end encryption";
break;
case EventTypes.Encrypted:
localizedBody = "Could not decrypt message";
break;
case EventTypes.CallInvite:
localizedBody = body;
break;
case EventTypes.CallAnswer:
localizedBody = body;
break;
case EventTypes.CallCandidates:
localizedBody = body;
break;
case EventTypes.CallHangup:
localizedBody = body;
break;
case EventTypes.Unknown:
localizedBody = body;
break;
case EventTypes.Message:
switch (this.messageType) {
case MessageTypes.Image:
localizedBody = "$senderName sent a picture";
break;
case MessageTypes.File:
localizedBody = "$senderName sent a file";
break;
case MessageTypes.Audio:
localizedBody = "$senderName sent an audio";
break;
case MessageTypes.Video:
localizedBody = "$senderName sent a video";
break;
case MessageTypes.Location:
localizedBody = "$senderName shared the location";
break;
case MessageTypes.Sticker:
localizedBody = "$senderName sent a sticker";
break;
case MessageTypes.Emote:
localizedBody = "* $body";
break;
case MessageTypes.Text:
case MessageTypes.Notice:
case MessageTypes.None:
case MessageTypes.Reply:
localizedBody = body;
break;
}
break;
default:
localizedBody =
"Unknown event '${this.type.toString().replaceAll("EventTypes.", "")}'";
}
// Add the sender name prefix
if (withSenderNamePrefix &&
this.type == EventTypes.Message &&
textOnlyMessageTypes.contains(this.messageType)) {
localizedBody = "$senderName: $localizedBody";
}
// Hide quotes
if (hideQuotes) {
List<String> lines = localizedBody.split("\n");
lines.removeWhere((s) => s.startsWith("> "));
localizedBody = lines.join("\n");
}
return localizedBody;
}
}

View file

@ -0,0 +1,13 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
extension LocalizedRoomDisplayname on Room {
String getLocalizedDisplayname(BuildContext context) {
if ((this.name?.isEmpty ?? true) &&
(this.canonicalAlias?.isEmpty ?? true) &&
!this.isDirectChat) {
return "Group with ${this.displayname}";
}
return this.displayname;
}
}

View file

@ -1,16 +0,0 @@
import 'package:famedlysdk/famedlysdk.dart';
class RoomNameCalculator {
final Room room;
const RoomNameCalculator(this.room);
String get name {
if ((room.name?.isEmpty ?? true) &&
(room.canonicalAlias?.isEmpty ?? true) &&
!room.isDirectChat) {
return "Group with ${room.displayname}";
}
return room.displayname;
}
}

View file

@ -0,0 +1,45 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
extension HistoryVisibilityDisplayString on HistoryVisibility {
String getLocalizedString(BuildContext context) {
switch (this) {
case HistoryVisibility.invited:
return "From the invitation";
case HistoryVisibility.joined:
return "From joining";
case HistoryVisibility.shared:
return "Visible for all participants";
case HistoryVisibility.world_readable:
return "Visible for everyone";
default:
return this.toString().replaceAll("HistoryVisibility.", "");
}
}
}
extension GuestAccessDisplayString on GuestAccess {
String getLocalizedString(BuildContext context) {
switch (this) {
case GuestAccess.can_join:
return "Guests can join";
case GuestAccess.forbidden:
return "Guests are forbidden";
default:
return this.toString().replaceAll("GuestAccess.", "");
}
}
}
extension JoinRulesDisplayString on JoinRules {
String getLocalizedString(BuildContext context) {
switch (this) {
case JoinRules.public:
return "Anyone can join";
case JoinRules.invite:
return "Invited users only";
default:
return this.toString().replaceAll("JoinRules.", "");
}
}
}