public override async Task <(ISource source, string failReason)> FindHandlerAsync(DiscordMessage message, ICollection <IArchiveHandler> handlers) { if (string.IsNullOrEmpty(message.Content)) { return(null, null); } var matches = ExternalLink.Matches(message.Content); if (matches.Count == 0) { return(null, null); } var client = new MegaApiClient(); await client.LoginAnonymousAsync(); foreach (Match m in matches) { try { if (m.Groups["mega_link"].Value is string lnk && !string.IsNullOrEmpty(lnk) && Uri.TryCreate(lnk, UriKind.Absolute, out var uri)) { var node = await client.GetNodeFromLinkAsync(uri).ConfigureAwait(false); if (node.Type == NodeType.File) { var buf = bufferPool.Rent(1024); try { int read; using (var stream = await client.DownloadAsync(uri, doodad, Config.Cts.Token).ConfigureAwait(false)) read = await stream.ReadBytesAsync(buf).ConfigureAwait(false); foreach (var handler in handlers) { var(canHandle, reason) = handler.CanHandle(node.Name, (int)node.Size, buf.AsSpan(0, read)); if (canHandle) { return(new MegaSource(client, uri, node, handler), null); } else if (!string.IsNullOrEmpty(reason)) { return(null, reason); } } } finally { bufferPool.Return(buf); } } } } catch (Exception e) { Config.Log.Warn(e, $"Error sniffing {m.Groups["mega_link"].Value}"); } } return(null, null); }