Esempio n. 1
0
        public async Task Poll(CommandContext ctx, string time, params DiscordEmoji[] options)
        {
            try
            {
                if (int.TryParse(time, out var minutes))
                {
                    var interactivity = ctx.Client.GetInteractivity();
                    var pollOptions   = options.Select(xe => xe.ToString());
                    var duration      = new TimeSpan(0, 0, minutes, 0, 0);
                    var output        = new DiscordEmbedBuilder()
                                        .WithTitle("Poll Time!")
                                        .WithDescription(string.Join(" **VS.** ", pollOptions));
                    var message = await ctx.RespondAsync(embed : output.Build());

                    foreach (var t in options)
                    {
                        await message.CreateReactionAsync(t);
                    }
                    var pollResult = await interactivity.CollectReactionsAsync(message, duration);

                    var results = pollResult.Reactions.Where(xkvp => options.Contains(xkvp.Key)).Select(xkvp => $"{xkvp.Key} wins the poll with **{xkvp.Value}** votes");
                    await ctx.RespondAsync(string.Join("\n", results));
                }
                else
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":warning: Invalid number of days, try **.poll 5** :open_mouth: :smile:");
                }
            }
            catch
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Unable to create the poll, please use stock Discord emojis as options!");
            }
        }
Esempio n. 2
0
        public async Task Dictionary(CommandContext ctx, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: A word or phrase is required!");
            }
            else
            {
                var data = await DefinitionService.GetDefinitionForTermAsync(query);

                if (data.Results.Count == 0)
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: No results found!");
                }
                else
                {
                    for (var index = 0; index < data.Results.Count; index++)
                    {
                        foreach (var value in data.Results[index].Senses)
                        {
                            if (value.Definition != null)
                            {
                                await ctx.TriggerTypingAsync();

                                var definition = value.Definition.ToString();
                                if (!(value.Definition is string))
                                {
                                    definition = ((JArray)JToken.Parse(value.Definition.ToString())).First.ToString();
                                }
                                var output = new DiscordEmbedBuilder()
                                             .WithTitle($"Dictionary definition for **{query}**")
                                             .WithDescription(definition.Length < 500 ? definition : definition.Take(500) + "...")
                                             .WithFooter("Type go for the next definition")
                                             .WithColor(DiscordColor.Blurple);
                                if (value.Examples != null)
                                {
                                    output.AddField("Example", value.Examples.First().text);
                                }
                                await ctx.RespondAsync(embed : output.Build());

                                var interactivity = await ctx.Client.GetInteractivity()
                                                    .WaitForMessageAsync(m => m.Channel.Id == ctx.Channel.Id && m.Content.ToLower() == "go", TimeSpan.FromSeconds(10));

                                if (interactivity != null)
                                {
                                    continue;
                                }
                                index = data.Results.Count;
                                break;
                            }
                        }
                    }
                }
            }
        }
Esempio n. 3
0
        public async Task Purge(CommandContext ctx, DiscordMember member, int limit)
        {
            if (limit <= 0 || limit > 100)
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Invalid number of messages to delete, must be in range of 1-100!");
            }
            var messages = await ctx.Channel.GetMessagesAfterAsync(ctx.Message.Id, limit);

            var delete = messages.Where(message => !string.IsNullOrWhiteSpace(member.ToString()) && message.Author.Id == member.Id).ToList();
            await ctx.Channel.DeleteMessagesAsync(delete).ConfigureAwait(false);

            await ctx.RespondAsync($"Purged **{delete.Count}** messages by {member.Username}#{member.Discriminator} (ID:{member.Id})");
        }
Esempio n. 4
0
        public async Task Overwatch(CommandContext ctx, string battletag, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(battletag))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Battletag is required! Try **.ow CriticalFlaw#11354** (case-sensitive)");
            }
            else
            {
                var overwatch = new OverwatchClient();
                var player    = await overwatch.GetPlayerAsync(battletag);

                if (player == null)
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: Player not found! Remember, battletags are case-sensitive.");
                }
                else
                {
                    await ctx.TriggerTypingAsync();

                    var output = new DiscordEmbedBuilder()
                                 .WithTitle(player.Username)
                                 .AddField("Level", player.PlayerLevel.ToString(), true)
                                 .AddField("Competitive", player.CompetitiveRank.ToString(), true)
                                 .AddField("Platform", player.Platform.ToString().ToUpper(), true)
                                 .AddField("Achievements", player.Achievements.Count.ToString(), true)
                                 .WithThumbnailUrl(player.ProfilePortraitUrl)
                                 .WithUrl(player.ProfileUrl)
                                 .WithColor(DiscordColor.Gold);
                    // Add Casual or Competitive stats if a query is present
                    switch (query.ToUpperInvariant())
                    {
                    case "CASUAL":
                        output.AddField("Healing Done", player.CasualStats.GetStatExact("All Heroes", "Assists", "Healing Done").Value.ToString(), true);
                        output.WithFooter("Casual stats shown are for All Heroes");
                        break;

                    case "COMP":
                    case "COMPETITIVE":
                        output.AddField("Healing Done", player.CompetitiveStats.GetStatExact("All Heroes", "Assists", "Healing Done").Value.ToString(), true);
                        output.WithFooter("Competitive stats shown are for All Heroes");
                        break;

                    default:
                        // Do nothing...
                        break;
                    }
                    await ctx.RespondAsync(embed : output.Build());
                }
            }
        }
Esempio n. 5
0
        public async Task Shorten(CommandContext ctx, [RemainingText] string query)
        {
            if (!Uri.IsWellFormedUriString(query, UriKind.RelativeOrAbsolute)) // && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: A valid URL link is required!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var shortenService = new ShortenService();
                await ctx.RespondAsync(shortenService.shortenUrl(query));
            }
        }
Esempio n. 6
0
        public async Task CreateRole(CommandContext ctx, [RemainingText] string role)
        {
            if (string.IsNullOrWhiteSpace(role))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Role name cannot be blank!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await ctx.Guild.CreateRoleAsync(role);

                await ctx.RespondAsync($"Role **{role}** has been **created**");
            }
        }
Esempio n. 7
0
        public async Task DeleteRole(CommandContext ctx, [RemainingText] DiscordRole role)
        {
            if (role == null)
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":mag: Role not found in this server!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await role.DeleteAsync();

                await ctx.RespondAsync($"Role **{role.Name}** has been **removed**");
            }
        }
Esempio n. 8
0
        public async Task SetChannelName(CommandContext ctx, [RemainingText] string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Channel name cannot be blank!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await ctx.Channel.ModifyAsync(chn => chn.Name = name.Trim().Replace(" ", "-"));

                await ctx.RespondAsync($"Channel name has been changed to **{name.Trim().Replace(" ", "-")}**");
            }
        }
Esempio n. 9
0
        public async Task SetServerName(CommandContext ctx, [RemainingText] string name)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Server name cannot be blank!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await ctx.Guild.ModifyAsync(srv => srv.Name = $"{name}");

                await ctx.RespondAsync($"Server name has been changed to **{name}**");
            }
        }
Esempio n. 10
0
        public async Task PruneUsers(CommandContext ctx, string day)
        {
            if (int.TryParse(day, out var days))
            {
                await ctx.TriggerTypingAsync();

                await ctx.RespondAsync($"**{ctx.Guild.GetPruneCountAsync(days).Result}** server members have been pruned.");

                await ctx.Guild.PruneAsync(days);
            }
            else
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Invalid number of days, try **.prune 30**");
            }
        }
Esempio n. 11
0
        public async Task RemoveUserRoles(CommandContext ctx, DiscordMember member)
        {
            if (member.Roles.Max(r => r.Position) >= ctx.Member.Roles.Max(r => r.Position))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: You are not authorised to remove roles from this user!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await member.ReplaceRolesAsync(Enumerable.Empty <DiscordRole>()).ConfigureAwait(false);

                await ctx.RespondAsync($"Removed all roles from {member.DisplayName}");
            }
        }
Esempio n. 12
0
        public async Task CreateVoiceChannel(CommandContext ctx, [RemainingText] string channel)
        {
            if (string.IsNullOrWhiteSpace(channel))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Channel name cannot be blank!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await ctx.Guild.CreateChannelAsync(channel.Trim().Replace(" ", "-"), ChannelType.Voice, ctx.Channel.Parent);

                await ctx.RespondAsync($"Voice Channel **#{channel.Trim().Replace(" ", "-")}** has been **created**");
            }
        }
Esempio n. 13
0
        public async Task YouTubeChannel(CommandContext ctx, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Channel search query is required!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var youTubeService = new YoutubeService();
                var output         = await youTubeService.GetEmbeddedResults(query, 5, "channel");

                await ctx.RespondAsync($"Search results for {Formatter.Bold(query)}", embed : output);
            }
        }
Esempio n. 14
0
        public async Task SteamServerLink(CommandContext ctx, [RemainingText] string link)
        {
            await ctx.TriggerTypingAsync();

            var regexes = new Regex(@"connect\s*(?'ip'\S+)\s*;\s*password\s*(?'pw'\S+);?", RegexOptions.Compiled);
            var match   = regexes.Match(link);

            if (match.Success)
            {
                await ctx.RespondAsync(string.Format($"steam://connect/{match.Groups["ip"].Value}/{match.Groups["pw"].Value}"));
            }
            else
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Invalid connection info, follow the format: **connect 123.345.56.789:00000; password hello**");
            }
        }
Esempio n. 15
0
        public async Task Deafen(CommandContext ctx, DiscordMember member, [RemainingText] string reason = null)
        {
            if (member.IsDeafened)
            {
                await BotServices.SendErrorEmbedAsync(ctx, $"{member.DisplayName}#{member.Discriminator} is already **deafened**!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var rstr = string.IsNullOrWhiteSpace(reason) ? "" : $": {reason}";
                await member.SetDeafAsync(true, rstr);

                await ctx.RespondAsync($"**Deafened** user {member.DisplayName}#{member.Discriminator} (ID:{member.Id})\n**Reason:** {rstr}\n**Deafened by: **{ctx.Member.DisplayName}");
            }
        }
Esempio n. 16
0
        public async Task OMDB(CommandContext ctx, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: A search query is required!");
            }
            else
            {
                var service = new BotServices();
                var client  = new OMDbClient(service.GetAPIToken("omdb"), true);
                var movie   = await client.GetItemByTitle(query.Replace(" ", "+"));

                if (movie.Response == "False")
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: No results found!");
                }
                else
                {
                    await ctx.TriggerTypingAsync();

                    var output = new DiscordEmbedBuilder()
                                 .WithTitle(movie.Title)
                                 .WithDescription(movie.Plot.Length < 500 ? movie.Plot : movie.Plot.Take(500) + "...")
                                 .AddField("Released", movie.Released, true)
                                 .AddField("Runtime", movie.Runtime, true)
                                 .AddField("Genre", movie.Genre, true)
                                 .AddField("Country", movie.Country, true)
                                 .AddField("Box Office", movie.BoxOffice, true)
                                 .AddField("Production", movie.Production, true)
                                 .AddField("IMDB Rating", movie.imdbRating, true)
                                 .AddField("Metacritic", movie.Metascore, true)
                                 .AddField("Rotten Tomatoes", movie.tomatoRating, true)
                                 .AddField("Director", movie.Director, true)
                                 .AddField("Actors", movie.Actors, true)
                                 .WithColor(DiscordColor.Goldenrod);
                    if (movie.Poster != "N/A")
                    {
                        output.WithImageUrl(movie.Poster);
                    }
                    if (movie.tomatoURL != "N/A")
                    {
                        output.WithUrl(movie.tomatoURL);
                    }
                    await ctx.RespondAsync(embed : output.Build());
                }
            }
        }
Esempio n. 17
0
        public async Task Mute(CommandContext ctx, DiscordMember member, [RemainingText] string reason = null)
        {
            if (member.IsMuted)
            {
                await BotServices.SendErrorEmbedAsync(ctx, $"{member.DisplayName}#{member.Discriminator} is already **muted**!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var ustr = $"{ctx.User.Username}#{ctx.User.Discriminator} ({ctx.User.Id})";
                var rstr = string.IsNullOrWhiteSpace(reason) ? "" : $": {reason}";
                await member.SetMuteAsync(true, $"{ustr}: {rstr}");

                await ctx.RespondAsync($"**Muted** user {member.DisplayName}#{member.Discriminator} (ID:{member.Id})\n**Reason:** {rstr}");
            }
        }
Esempio n. 18
0
        public async Task Kick(CommandContext ctx, DiscordMember member, [RemainingText] string reason = null)
        {
            if (ctx.Member.Id == member.Id)
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: You cannot kick yourself!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var ustr = $"{ctx.User.Username}#{ctx.User.Discriminator} ({ctx.User.Id})";
                var rstr = string.IsNullOrWhiteSpace(reason) ? "" : $": {reason}";
                await member.RemoveAsync($"{ustr}: {rstr}");

                await ctx.RespondAsync($"**Kicked** user {member.DisplayName}#{member.Discriminator} (ID:{member.Id})\n**Reason:** {rstr}");
            }
        }
Esempio n. 19
0
        public async Task EightBall(CommandContext ctx, [RemainingText] string question)
        {
            if (string.IsNullOrWhiteSpace(question))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: You have to ask a question!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var rnd    = new Random();
                var output = new DiscordEmbedBuilder()
                             .WithTitle($":8ball: {EightBallAnswers.list[rnd.Next(0, EightBallAnswers.list.Count)]}")
                             .WithColor(DiscordColor.Black);
                await ctx.RespondAsync(embed : output.Build());
            }
        }
Esempio n. 20
0
        public async Task UrbanDictionary(CommandContext ctx, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: A word or phrase is required!");
            }
            else
            {
                var data = await DictionaryService.GetDictionaryForTermAsync(query);

                if (data.result_type == "no_results")
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: No results found!");
                }
                else
                {
                    foreach (var value in data.list)
                    {
                        await ctx.TriggerTypingAsync();

                        var output = new DiscordEmbedBuilder()
                                     .WithTitle($"Urban Dictionary definition for **{query}** by {value.author}")
                                     .WithDescription(value.definition.Length < 500 ? value.definition : value.definition.Take(500) + "...")
                                     .WithUrl(value.permalink)
                                     .WithFooter("Type next for the next definition")
                                     .WithColor(DiscordColor.Blurple);
                        if (!string.IsNullOrWhiteSpace(value.example))
                        {
                            output.AddField("Example", value.example);
                        }
                        output.AddField(":thumbsup:", value.thumbs_up.ToString(), true);
                        output.AddField(":thumbsdown:", value.thumbs_down.ToString(), true);
                        await ctx.RespondAsync(embed : output.Build());

                        var interactivity = await ctx.Client.GetInteractivity()
                                            .WaitForMessageAsync(m => m.Channel.Id == ctx.Channel.Id && m.Content.ToLower() == "next", TimeSpan.FromSeconds(10));

                        if (interactivity == null)
                        {
                            break;
                        }
                    }
                }
            }
        }
Esempio n. 21
0
        public async Task GetTime(CommandContext ctx, [RemainingText] string location)
        {
            if (string.IsNullOrWhiteSpace(location))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: A valid location is required! Try **.time Ottawa, CA**");
            }
            else
            {
                try
                {
                    await ctx.TriggerTypingAsync();

                    var http = new HttpClient();
                    http.DefaultRequestHeaders.Clear();
                    var service          = new BotServices();
                    var token            = service.GetAPIToken("google");
                    var locationResource = await http.GetStringAsync($"https://maps.googleapis.com/maps/api/geocode/json?address={location.Replace(" ", "")}&key={token}");

                    var locationObject = JsonConvert.DeserializeObject <TimeService>(locationResource);
                    if (locationObject.status != "OK")
                    {
                        await BotServices.SendErrorEmbedAsync(ctx, ":mag: Location not found!");
                    }
                    else
                    {
                        var currentSeconds = (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
                        var url            = $"https://maps.googleapis.com/maps/api/timezone/json?location={locationObject.results[0].geometry.location.lat},{locationObject.results[0].geometry.location.lng}&timestamp={currentSeconds}&key={token}";
                        var timeResource   = await http.GetStringAsync(url);

                        var timeObject = JsonConvert.DeserializeObject <TimeService.TimeZoneResult>(timeResource);
                        var time       = DateTime.UtcNow.AddSeconds(timeObject.dstOffset + timeObject.rawOffset);
                        var output     = new DiscordEmbedBuilder()
                                         .WithTitle($"Time in {locationObject.results[0].formatted_address}")
                                         .WithDescription($":clock1: **{time.ToShortTimeString()}** {timeObject.timeZoneName}")
                                         .WithColor(DiscordColor.Cyan);
                        await ctx.RespondAsync(embed : output.Build());
                    }
                }
                catch
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: Unable to find time data for this location!");
                }
            }
        }
Esempio n. 22
0
        public async Task RemoveVoiceChannel(CommandContext ctx, [RemainingText] DiscordChannel channel)
        {
            if (channel == null)
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":mag: Channel not found in this server!");
            }
            else if (channel.Type != ChannelType.Voice)
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: This is not a voice channel, use **.deletetext** instead!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                await channel.DeleteAsync();

                await ctx.RespondAsync($"Voice Channel **{channel.Name}** has been **removed**");
            }
        }
Esempio n. 23
0
        public async Task Twitch(CommandContext ctx, [RemainingText] string stream)
        {
            if (string.IsNullOrWhiteSpace(stream))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: An existing Twitch channel name is required!");
            }
            else
            {
                try
                {
                    await ctx.TriggerTypingAsync();

                    var http      = new HttpClient();
                    var service   = new BotServices();
                    var twitchUrl = $"https://api.twitch.tv/kraken/streams/{stream.ToLower()}?client_id={service.GetAPIToken("twitch")}";
                    var response  = await http.GetStringAsync(twitchUrl).ConfigureAwait(false);

                    var twitch = JsonConvert.DeserializeObject <TwitchService>(response);
                    twitch.Url = twitchUrl;
                    if (!twitch.IsLive)
                    {
                        await BotServices.SendErrorEmbedAsync(ctx, "Channel is **Offline** (or doesn't exist) :pensive:");
                    }
                    else
                    {
                        var output = new DiscordEmbedBuilder()
                                     .WithTitle($"{twitch.Stream.Channel.display_name} is live streaming on Twitch!")
                                     .AddField("Now Playing", twitch.Game)
                                     .AddField("Stream Title", twitch.Title)
                                     .AddField("Followers", twitch.Followers.ToString(), true)
                                     .AddField("Viewers", twitch.Viewers.ToString(), true)
                                     .WithThumbnailUrl(twitch.Icon)
                                     .WithUrl(twitch.Url)
                                     .WithColor(DiscordColor.Purple);
                        await ctx.RespondAsync(embed : output.Build());
                    }
                }
                catch
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":warning: Unable to determine channel status, please do not include special characters in your input!");
                }
            }
        }
Esempio n. 24
0
        public async Task Math(CommandContext ctx, double num1, string operation, double num2)
        {
            try
            {
                double result;
                switch (operation)
                {
                case "+":
                    result = num1 + num2;
                    break;

                case "-":
                    result = num1 - num2;
                    break;

                case "*":
                    result = num1 * num2;
                    break;

                case "/":
                    result = num1 / num2;
                    break;

                case "%":
                    result = num1 % num2;
                    break;

                default:
                    result = num1 + num2;
                    break;
                }

                var output = new DiscordEmbedBuilder()
                             .WithTitle($":1234: The result is {result:#,##0.00}")
                             .WithColor(DiscordColor.CornflowerBlue);
                await ctx.RespondAsync(embed : output.Build());
            }
            catch
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Error calculating math equation, make sure your values are integers and the operation is valid!");
            }
        }
Esempio n. 25
0
        public async Task Weather(CommandContext ctx, [RemainingText] string location)
        {
            if (string.IsNullOrWhiteSpace(location))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: A valid location is required! Try **.weather Ottawa, CA**");
            }
            else
            {
                try
                {
                    await ctx.TriggerTypingAsync();

                    var http = new HttpClient();
                    http.DefaultRequestHeaders.Clear();
                    var response = await http.GetStringAsync($"http://api.openweathermap.org/data/2.5/weather?q={location}&appid=42cd627dd60debf25a5739e50a217d74&units=metric");

                    var weather = JsonConvert.DeserializeObject <WeatherService.WeatherData>(response);
                    if (weather.cod == 404)
                    {
                        await BotServices.SendErrorEmbedAsync(ctx, ":mag: Location not found!");
                    }
                    else
                    {
                        Func <double, double> format = WeatherService.CelsiusToFahrenheit;
                        var output = new DiscordEmbedBuilder()
                                     .AddField("Location", $"[{weather.name + ", " + weather.sys.country}](https://openweathermap.org/city/{weather.id})", true)
                                     .AddField("Temperature", $"{weather.main.temp:F1}°C / {format(weather.main.temp):F1}°F", true)
                                     .AddField("Conditions", string.Join(", ", weather.weather.Select(w => w.main)), true)
                                     .AddField("Humidity", $"{weather.main.humidity}%", true)
                                     .AddField("Wind Speed", $"{weather.wind.speed}m/s", true)
                                     .AddField("Temperature (Min/Max)", $"{weather.main.tempMin:F1}°C - {weather.main.tempMax:F1}°C\n{format(weather.main.tempMin):F1}°F - {format(weather.main.tempMax):F1}°F", true)
                                     .WithColor(DiscordColor.Cyan);
                        await ctx.RespondAsync(embed : output.Build());
                    }
                }
                catch
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: Unable to find weather data for this location!");
                }
            }
        }
Esempio n. 26
0
        public async Task Clean(CommandContext ctx, int limit, [RemainingText] DiscordChannel channel)
        {
            if (limit <= 0 || limit > 100)
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Invalid number of messages to delete, must be in range of 1-100!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                if (channel == null)
                {
                    channel = ctx.Channel;
                }
                var messages = await ctx.Channel.GetMessagesAsync(limit).ConfigureAwait(false);

                await ctx.Channel.DeleteMessagesAsync(messages).ConfigureAwait(false);

                await ctx.RespondAsync($"**{messages.Count}** message(s) have been removed from #{ctx.Channel.Name}");
            }
        }
Esempio n. 27
0
        public async Task TF2Wiki(CommandContext ctx, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: TF2Wiki search query is a required!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                var    http     = new HttpClient();
                var    textInfo = new CultureInfo("en-US", false).TextInfo;
                string search   = null;
                foreach (var term in query.Split(' '))
                {
                    if (term.Length <= 2)
                    {
                        search += $"{term} ";
                    }
                    else
                    {
                        search += $"{textInfo.ToTitleCase(term)} ";
                    }
                }
                if (search != null)
                {
                    var result = await http.GetStringAsync($"https://wiki.teamfortress.com/w/api.php?action=query&format=json&prop=info&redirects=1&formatversion=2&inprop=url&titles={Uri.EscapeDataString(search.Replace(' ', '_').Trim())}");

                    var data = JsonConvert.DeserializeObject <WikipediaService>(result);
                    if (data.Query.Pages[0].Missing)
                    {
                        await BotServices.SendErrorEmbedAsync(ctx, ":mag: TF2Wiki page not found!");
                    }
                    else
                    {
                        await ctx.Channel.SendMessageAsync(data.Query.Pages[0].FullUrl, embed : null).ConfigureAwait(false);
                    }
                }
            }
        }
Esempio n. 28
0
        public async Task SetServerAvatar(CommandContext ctx, string query)
        {
            if (!Uri.TryCreate(query, UriKind.Absolute, out var uriResult) && (!query.EndsWith(".img") || !query.EndsWith(".png") || !query.EndsWith(".jpg")))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: An image URL ending with .img, .png or .jpg is required!");
            }
            else
            {
                await ctx.TriggerTypingAsync();

                using (var client = new WebClient())
                {
                    var stream = new MemoryStream();
                    var data   = client.DownloadData(query);
                    stream.Write(data, 0, data.Length);
                    stream.Position = 0;
                    await ctx.Guild.ModifyAsync(chn => chn.Icon = stream);

                    await ctx.RespondAsync($"{ctx.Guild.Name} server avatar has been updated!");
                }
            }
        }
Esempio n. 29
0
        public async Task ColorRole(CommandContext ctx, params string[] colors)
        {
            try
            {
                if (colors.Length != 2 && colors.Length != 4)
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":warning: Invalid parameters, try **.colorrole admin [0-255] [0-255] [0-255]**");
                }
                else
                {
                    await ctx.TriggerTypingAsync();

                    var roleName = colors[0].ToLowerInvariant();
                    var role     = ctx.Guild.Roles.FirstOrDefault(r => r.Name.ToLowerInvariant() == roleName);
                    if (role == null)
                    {
                        await BotServices.SendErrorEmbedAsync(ctx, ":mag: Role not found in this server!");
                    }
                    else
                    {
                        var rgb   = colors.Length == 4;
                        var arg   = colors[1].Replace("#", "");
                        var color = new DiscordColor(
                            Convert.ToByte(rgb ? int.Parse(arg) : Convert.ToInt32(arg.Substring(0, 2), 16)),
                            Convert.ToByte(rgb ? int.Parse(colors[2]) : Convert.ToInt32(arg.Substring(2, 2), 16)),
                            Convert.ToByte(rgb ? int.Parse(colors[3]) : Convert.ToInt32(arg.Substring(4, 2), 16)));
                        await role.UpdateAsync(color : color).ConfigureAwait(false);

                        await ctx.RespondAsync($"Color of the role **{roleName}** has been changed to **{color}**");
                    }
                }
            }
            catch
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Unable to change role color, try **.colorrole admin [0-255] [0-255] [0-255]**");
            }
        }
Esempio n. 30
0
        public async Task Pokemon(CommandContext ctx, [RemainingText] string query)
        {
            if (string.IsNullOrWhiteSpace(query))
            {
                await BotServices.SendErrorEmbedAsync(ctx, ":warning: Pokemon name is required! Try **.poke charizard**");
            }
            else
            {
                var pokemon = await PokemonService.GetPokemonDataAsync(query);

                if (pokemon.cards.Count == 0)
                {
                    await BotServices.SendErrorEmbedAsync(ctx, ":mag: Pokemon not found!");
                }
                else
                {
                    await ctx.TriggerTypingAsync();

                    var rnd    = new Random();
                    var cards  = Card.Find <Pokemon>(pokemon.cards[rnd.Next(0, pokemon.cards.Count)].id);
                    var output = new DiscordEmbedBuilder()
                                 .WithTitle($"{cards.Card.Name} (ID: {cards.Card.NationalPokedexNumber})")
                                 .AddField("Health Points", cards.Card.Hp, true)
                                 .AddField("Artist", cards.Card.Artist, true)
                                 .AddField("Rarity", cards.Card.Rarity, true)
                                 .AddField("Series", cards.Card.Series, true)
                                 .WithImageUrl(cards.Card.ImageUrl)
                                 .WithColor(DiscordColor.Lilac)
                                 .WithFooter($"Card ID: {cards.Card.Id}");
                    if (cards.Card.ImageUrlHiRes != null)
                    {
                        output.WithImageUrl(cards.Card.ImageUrlHiRes);                                      // Replace with high resolution image if available
                    }
                    await ctx.RespondAsync(embed : output.Build());
                }
            }
        }