matrixToInviteLink method

Future<Uri> matrixToInviteLink()

Generates a matrix.to link with appropriate routing info to share the room

Implementation

Future<Uri> matrixToInviteLink() async {
  if (canonicalAlias.isNotEmpty) {
    return Uri.parse(
        'https://matrix.to/#/${Uri.encodeComponent(canonicalAlias)}');
  }
  final List queryParameters = [];
  final users = await requestParticipants([Membership.join]);
  final currentPowerLevelsMap = getState(EventTypes.RoomPowerLevels)?.content;

  final temp = List<User>.from(users);
  temp.removeWhere((user) => user.powerLevel < 50);
  if (currentPowerLevelsMap != null) {
    // just for weird rooms
    temp.removeWhere((user) =>
        user.powerLevel < getDefaultPowerLevel(currentPowerLevelsMap));
  }

  if (temp.isNotEmpty) {
    temp.sort((a, b) => a.powerLevel.compareTo(b.powerLevel));
    if (temp.last.id.domain != null) {
      queryParameters.add(temp.last.id.domain!);
    }
  }

  final Map<String, int> servers = {};
  for (final user in users) {
    if (user.id.domain != null) {
      if (servers.containsKey(user.id.domain!)) {
        servers[user.id.domain!] = servers[user.id.domain!]! + 1;
      } else {
        servers[user.id.domain!] = 1;
      }
    }
  }
  final sortedServers = Map.fromEntries(servers.entries.toList()
        ..sort((e1, e2) => e2.value.compareTo(e1.value)))
      .keys
      .take(3);
  for (final server in sortedServers) {
    if (!queryParameters.contains(server)) {
      queryParameters.add(server);
    }
  }

  var queryString = '?';
  for (var i = 0; i < min(queryParameters.length, 3); i++) {
    if (i != 0) {
      queryString += '&';
    }
    queryString += 'via=${queryParameters[i]}';
  }
  return Uri.parse(
      'https://matrix.to/#/${Uri.encodeComponent(id)}$queryString');
}