Esempio n. 1
0
        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);
        }