コード例 #1
0
        public override async Task <bool> OnCommand(Command command, IMessage message, IMessenger messenger)
        {
            if (command == null)
            {
                throw new ArgumentNullException("command");
            }

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (messenger == null)
            {
                throw new ArgumentNullException("messenger");
            }

            if (command.Arguments.Any())
            {
                ScryFallCard scryCard = null;

                string searchTerm = null;

                if (command.Arguments.Length == 1)
                {
                    string name = command.Arguments[0];

                    if (string.IsNullOrEmpty(name))
                    {
                        return(false);
                    }

                    this.mLoggingService.Trace("Using Name: {0}", name);

                    searchTerm = name;

                    // Get card using only name
                    scryCard = await fetcher.GetCard(name, true);
                }
                else if (command.Arguments.Length == 2)
                {
                    string name = command.Arguments[1];
                    string set  = command.Arguments[0];

                    if (string.IsNullOrEmpty(name))
                    {
                        return(false);
                    }

                    if (string.IsNullOrEmpty(set))
                    {
                        return(false);
                    }

                    this.mLoggingService.Trace("Using Name: {0}; Set: {1}", name, set);

                    searchTerm = string.Join(" ", command.Arguments);

                    // Get card using name and set name or code
                    scryCard = await fetcher.GetCard(name, set, true);
                }

                if (scryCard != null)
                {
                    this.mLoggingService.Trace("Found card '{0}' in set '{1}'.",
                                               scryCard.Name,
                                               scryCard.SetName);

                    await this.Services.QueryStatisticsStore.InsertCardQueryStat(message.name, message.user_id,
                                                                                 scryCard.MultiverseIds.FirstOrDefault(), searchTerm);

                    // If Image_Uris is not null, get image
                    if (scryCard.Image_Uris != null)
                    {
                        string img_url = string.Empty;

                        // Get image, starting with large
                        if (!string.IsNullOrEmpty(scryCard.Image_Uris.Large))
                        {
                            img_url = scryCard.Image_Uris.Large;
                        }
                        else if (!string.IsNullOrEmpty(scryCard.Image_Uris.Png))
                        {
                            img_url = scryCard.Image_Uris.Png;
                        }
                        else if (!string.IsNullOrEmpty(scryCard.Image_Uris.Normal))
                        {
                            img_url = scryCard.Image_Uris.Normal;
                        }
                        else if (!string.IsNullOrEmpty(scryCard.Image_Uris.Small))
                        {
                            img_url = scryCard.Image_Uris.Small;
                        }
                        else
                        {
                            var card = await this.Services.Store.GetCard(scryCard.Name);

                            if (card != null)
                            {
                                img_url = card.Img;
                            }
                        }

                        if (!string.IsNullOrEmpty(img_url))
                        {
                            // Remove trailing ?xxxxxxxx portion from uri, if it exists
                            if (!string.IsNullOrEmpty(img_url) && img_url.LastIndexOf('?') > 0)
                            {
                                img_url = img_url.Substring(0, img_url.LastIndexOf('?'));
                            }

                            messenger.SendMessage(img_url);
                        }
                        else
                        {
                            messenger.SendMessage("Unable to find image.");
                        }
                    }
                    else
                    {
                        // This card likely has two sides, get both sides and send them
                        if (scryCard.Card_Faces != null)
                        {
                            foreach (ScryFall_CardFace face in scryCard.Card_Faces)
                            {
                                string img_url = string.Empty;

                                // Get image, starting with large
                                if (!string.IsNullOrEmpty(face.Image_Uris.Large))
                                {
                                    img_url = face.Image_Uris.Large;
                                }
                                else if (!string.IsNullOrEmpty(face.Image_Uris.Png))
                                {
                                    img_url = face.Image_Uris.Png;
                                }
                                else if (!string.IsNullOrEmpty(face.Image_Uris.Normal))
                                {
                                    img_url = face.Image_Uris.Normal;
                                }
                                else if (!string.IsNullOrEmpty(face.Image_Uris.Small))
                                {
                                    img_url = face.Image_Uris.Small;
                                }
                                else
                                {
                                    var card = await this.Services.Store.GetCard(scryCard.Name);

                                    if (card != null)
                                    {
                                        img_url = card.Img;
                                    }
                                }

                                if (!string.IsNullOrEmpty(img_url))
                                {
                                    // Remove trailing ?xxxxxxxx portion from uri, if it exists
                                    if (!string.IsNullOrEmpty(img_url) && img_url.LastIndexOf('?') > 0)
                                    {
                                        img_url = img_url.Substring(0, img_url.LastIndexOf('?'));
                                    }

                                    messenger.SendMessage(img_url);
                                }
                                else
                                {
                                    messenger.SendMessage("Unable to find image.");
                                }
                            }
                        }
                        else
                        {
                            messenger.SendMessage("No image found on ScryFal");
                        }
                    }

                    return(true);
                }
                else
                {
                    this.mLoggingService.Warning("Couldn't find card using arguments.");

                    // Use autocomplete to try returning a list of suggested names
                    string name = "";
                    if (command.Arguments.Length == 1)
                    {
                        name = command.Arguments[0];
                    }
                    else
                    {
                        name = command.Arguments[1];
                    }

                    // Get first 5 characters of name to use with autocomplete
                    string autocompleteName = new string(name.Take(5).ToArray());

                    var autocompleteResults = await this.Services.Autocompleter.GetAutocompleteAsync(autocompleteName);

                    if (autocompleteResults != null && autocompleteResults.Any())
                    {
                        LoggingService.Trace("Autocomplete returned '{0}' results for '{1}'...", autocompleteResults.Count(), name);

                        string suggestions = autocompleteResults.Take(5).OxbridgeOr();

                        string msg = string.Format("Did you mean {0}?", suggestions);

                        messenger.SendMessage(msg);
                    }
                    else
                    {
                        name = Uri.EscapeDataString(name);

                        string url = string.Format(cSearchUrl, name);

                        messenger.SendMessage(string.Format("Try seeing if your card is here: {0}", url));
                    }
                }
            }
            else
            {
                this.mLoggingService.Warning("No arguments provided.");
            }

            return(false);
        }
コード例 #2
0
        public override async Task <bool> OnCommand(Command command, IMessage message, IMessenger messenger)
        {
            if (command == null)
            {
                throw new ArgumentNullException("command");
            }

            if (message == null)
            {
                throw new ArgumentNullException("message");
            }

            if (messenger == null)
            {
                throw new ArgumentNullException("messenger");
            }

            if (command.Arguments.Any())
            {
                ScryFallCard scryCard = null;

                string searchTerm = null;

                if (command.Arguments.Length == 1)
                {
                    string name = command.Arguments[0];

                    if (string.IsNullOrEmpty(name))
                    {
                        return(false);
                    }

                    this.mLoggingService.Trace("Using Name: {0}", name);

                    searchTerm = name;

                    // Get card using only name
                    scryCard = await fetcher.GetCard(name, true);
                }
                else if (command.Arguments.Length == 2)
                {
                    string name = command.Arguments[1];
                    string set  = command.Arguments[0];

                    if (string.IsNullOrEmpty(name))
                    {
                        return(false);
                    }

                    if (string.IsNullOrEmpty(set))
                    {
                        return(false);
                    }

                    this.mLoggingService.Trace("Using Name: {0}; Set: {1}", name, set);

                    searchTerm = string.Join(" ", command.Arguments);

                    // Get card using name and set name or code
                    scryCard = await fetcher.GetCard(name, set, true);
                }

                if (scryCard != null)
                {
                    this.mLoggingService.Trace("Found card '{0}' in set '{1}'.",
                                               scryCard.Name,
                                               scryCard.SetName);

                    await this.Services.QueryStatisticsStore.InsertCardQueryStat(message.name, message.user_id,
                                                                                 scryCard.MultiverseIds.FirstOrDefault(), searchTerm);

                    string price = scryCard.PriceUsd;
                    string url   = scryCard.ScryFallUri;

                    url = this.Services.UrlShortener.ShortenUrl(url);

                    if (!string.IsNullOrEmpty(price))
                    {
                        string msg = string.Format("{0} [{1}] - ${2}. {3}", scryCard.Name, scryCard.SetCode.ToUpper(),
                                                   price, url);

                        messenger.SendMessage(msg);
                    }

                    return(true);
                }
                else
                {
                    this.mLoggingService.Warning("Couldn't find card using arguments.");

                    // Use autocomplete to try returning a list of suggested names
                    string name = "";
                    if (command.Arguments.Length == 1)
                    {
                        name = command.Arguments[0];
                    }
                    else
                    {
                        name = command.Arguments[1];
                    }

                    // Get first 5 characters of name to use with autocomplete
                    string autocompleteName = new string(name.Take(5).ToArray());

                    var autocompleteResults = await this.Services.Autocompleter.GetAutocompleteAsync(autocompleteName);

                    if (autocompleteResults != null && autocompleteResults.Any())
                    {
                        LoggingService.Trace("Autocomplete returned '{0}' results for '{1}'...", autocompleteResults.Count(), name);

                        string suggestions = autocompleteResults.Take(5).OxbridgeOr();

                        string msg = string.Format("Did you mean {0}?", suggestions);

                        messenger.SendMessage(msg);
                    }
                    else
                    {
                        name = Uri.EscapeDataString(name);

                        string url = string.Format(cSearchUrl, name);

                        messenger.SendMessage(string.Format("Try seeing if your card is here: {0}", url));
                    }
                }
            }
            else
            {
                this.mLoggingService.Warning("No arguments provided.");
            }

            return(false);
        }