handleEventUpdate method

Future<void> handleEventUpdate(
  1. EventUpdate update
)

Implementation

Future<void> handleEventUpdate(EventUpdate update) async {
  final event = update.content;
  final type = event['type'].startsWith('m.key.verification.')
      ? event['type']
      : event['content']['msgtype'];
  if (type == null ||
      !type.startsWith('m.key.verification.') ||
      client.verificationMethods.isEmpty) {
    return;
  }
  if (type == EventTypes.KeyVerificationRequest) {
    event['content']['timestamp'] = event['origin_server_ts'];
  }

  final transactionId =
      KeyVerification.getTransactionId(event['content']) ?? event['event_id'];

  final req = _requests[transactionId];
  if (req != null) {
    final otherDeviceId = event['content']['from_device'];
    if (event['sender'] != client.userID) {
      await req.handlePayload(type, event['content'], event['event_id']);
    } else if (event['sender'] == client.userID &&
        otherDeviceId != null &&
        otherDeviceId != client.deviceID) {
      // okay, another of our devices answered
      req.otherDeviceAccepted();
      req.dispose();
      _requests.remove(transactionId);
    }
  } else if (event['sender'] != client.userID) {
    if (!{EventTypes.KeyVerificationRequest, EventTypes.KeyVerificationStart}
        .contains(type)) {
      return; // we can only start on these
    }
    final room = client.getRoomById(update.roomID) ??
        Room(id: update.roomID, client: client);
    final newKeyRequest = KeyVerification(
        encryption: encryption, userId: event['sender'], room: room);
    await newKeyRequest.handlePayload(
        type, event['content'], event['event_id']);
    if (newKeyRequest.state != KeyVerificationState.askAccept) {
      // something went wrong, let's just dispose the request
      newKeyRequest.dispose();
    } else {
      // new request! Let's notify it and stuff
      _requests[transactionId] = newKeyRequest;
      client.onKeyVerificationRequest.add(newKeyRequest);
    }
  }
}