connect static method

Future<Gateway> connect(
  1. NyxxGateway client,
  2. GatewayBot gatewayBot
)

Connect to the gateway using the provided client and gatewayBot configuration.

Implementation

static Future<Gateway> connect(NyxxGateway client, GatewayBot gatewayBot) async {
  final logger = Logger('${client.options.loggerName}.Gateway');

  final totalShards = client.apiOptions.totalShards ?? gatewayBot.shards;
  final List<int> shardIds = client.apiOptions.shards ?? List.generate(totalShards, (i) => i);

  logger
    ..info('Connecting ${shardIds.length}/$totalShards shards')
    ..fine('Shard IDs: $shardIds')
    ..fine(
      'Gateway URL: ${gatewayBot.url}, Recommended Shards: ${gatewayBot.shards}, Max Concurrency: ${gatewayBot.sessionStartLimit.maxConcurrency},'
      ' Remaining Session Starts: ${gatewayBot.sessionStartLimit.remaining}, Reset After: ${gatewayBot.sessionStartLimit.resetAfter}',
    );

  assert(
    shardIds.every((element) => element < totalShards),
    'Shard ID exceeds total shard count',
  );

  assert(
    shardIds.every((element) => element >= 0),
    'Invalid shard ID',
  );

  assert(
    shardIds.toSet().length == shardIds.length,
    'Duplicate shard ID',
  );

  assert(
    client.apiOptions.compression != GatewayCompression.payload || client.apiOptions.payloadFormat != GatewayPayloadFormat.etf,
    'Cannot enable payload compression when using the ETF payload format',
  );

  final shards = shardIds.map((id) => Shard.connect(id, totalShards, client.apiOptions, gatewayBot.url, client));
  return Gateway(client, gatewayBot, await Future.wait(shards), totalShards, shardIds);
}