uploadImage method

  1. @override
Future<Either<RequestError, Uri>> uploadImage({
  1. required DiscordUploadableImage image,
  2. required String channelId,
})
override

Uploads an image to a Discord channel, specified in channelId parameter.

Implementation

@override
Future<Either<RequestError, Uri>> uploadImage({
  required DiscordUploadableImage image,
  required String channelId,
}) async {
  final endpointUrl = apiUri.resolve('api/channels/${channelId}/messages');

  final request = http.MultipartRequest('POST', endpointUrl);

  request.headers['Authorization'] = 'Bot ${token}';

  request.files.add(
    http.MultipartFile.fromBytes(
      'files[0]',
      image.bytes,
      filename: '${image.name}.${image.format}',
    ),
  );

  try {
    final response = await _httpClient.send(request);

    if (response.statusCode == 200) {
      final body = jsonDecode(
        await response.stream.bytesToString(),
      );

      return Right(
        Uri.parse(
          body['attachments'][0]['url'],
        ),
      );
    } else if (response.statusCode == 401) {
      return Left(InvalidBotToken());
    } else if (response.statusCode == 403) {
      return Left(InvalidBotToken());
    } else if (response.statusCode == 404) {
      return Left(ChannelNotFound());
    } else {
      return Left(
        UnknownError(
          reason: await response.stream.bytesToString(),
          stackTrace: StackTrace.current,
        ),
      );
    }
  } on Object catch (error, stackTrace) {
    return Left(
      NetworkError(
        reason: error.toString(),
        stackTrace: stackTrace,
      ),
    );
  }
}