fromMap static method

Future<MessageCommandContext> fromMap(
  1. MarshallerContract marshaller,
  2. DataStoreContract datastore,
  3. EntityContext ctx,
  4. Map<String, dynamic> payload,
)

Implementation

static Future<MessageCommandContext> fromMap(
    MarshallerContract marshaller,
    DataStoreContract datastore,
    EntityContext ctx,
    Map<String, dynamic> payload) async {
  final data = payload['data'] as Map<String, dynamic>;
  final targetId = data['target_id'] as String;
  final resolved = data['resolved'] as Map<String, dynamic>?;

  final messagesMap =
      resolved?['messages'] as Map<String, dynamic>? ?? <String, dynamic>{};
  final messageJson = messagesMap[targetId] as Map<String, dynamic>?;

  if (messageJson == null) {
    throw StateError(
        'Cannot build MessageCommandContext: target message $targetId not '
        'present in interaction.data.resolved.messages');
  }

  final guildId = payload['guild_id'] as String?;

  final enrichedMessageJson = {
    ...messageJson,
    if (guildId != null && messageJson['guild_id'] == null)
      'guild_id': guildId,
    if (messageJson['channel_id'] == null && payload['channel_id'] != null)
      'channel_id': payload['channel_id'],
  };

  final raw =
      await marshaller.serializers.message.normalize(enrichedMessageJson);
  final target = await marshaller.serializers.message.serialize(raw);
  Server? server;
  if (guildId != null) {
    server = await datastore.server.get(guildId, false);
  }

  final channelId = payload['channel_id'] as String?;

  return MessageCommandContext(
    ctx: ctx,
    id: Snowflake.parse(payload['id']),
    applicationId: Snowflake.parse(payload['application_id']),
    token: payload['token'] as String,
    version: payload['version'] as int,
    target: target,
    server: server,
    channel: channelId != null
        ? await datastore.channel.get(channelId, false)
        : null,
  );
}