예제 #1
0
        public async Task SetPrefix(string prefix)
        {
            var embed = new KaguyaEmbedBuilder();

            if (prefix.Length > 5)
            {
                await ConsoleLogger.LogAsync("Command prefix was too long. Not set.", DataStorage.JsonStorage.LogLvl.DEBUG);

                embed.WithDescription("Your command prefix may not be longer than 5 characters.");
                embed.SetColor(EmbedColor.RED);
                await ReplyAsync(embed : embed.Build());

                return;
            }

            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            server.CommandPrefix = prefix;
            await DatabaseQueries.UpdateAsync(server);

            embed.WithDescription($"Command prefix has been changed to `{prefix}`.");
            embed.WithFooter($"Use this command again without specifying a prefix to reset it.");
            embed.SetColor(EmbedColor.VIOLET);

            await ReplyAsync(embed : embed.Build());
        }
예제 #2
0
        public async Task InviteDm()
        {
            string devInviteUrl = $"[[Kaguya Dev Invite]]({ConfigProperties.KAGUYA_DEV_INVITE_URL})\n";
            string inviteUrl    = $"[[Invite Kaguya to your server]]({ConfigProperties.KAGUYA_INVITE_URL})\n";
            string discordUrl   = $"[[Kaguya Support Discord]]({ConfigProperties.KAGUYA_SUPPORT_DISCORD_URL})\n";

            if (Context.User.Id != ConfigProperties.BotConfig.BotOwnerId)
            {
                devInviteUrl = null;
            }

            var embed = new KaguyaEmbedBuilder
            {
                Title       = "Kaguya Invite Links",
                Description = $"{inviteUrl}{discordUrl}{devInviteUrl}"
            };

            try
            {
                await Context.User.SendMessageAsync(embed : embed.Build());
            }
            catch (HttpException)
            {
                await ConsoleLogger.LogAsync("Tried to DM a user the Kaguya invite links " +
                                             "but an HttpException was thrown.", LogLvl.WARN);
            }

            await ReplyAsync(embed : new KaguyaEmbedBuilder
            {
                Description = "Links sent! Check your DM <:Kaguya:581581938884608001>"
            }
                             .Build());
        }
예제 #3
0
파일: Set.cs 프로젝트: kaguyabot/Kaguya
        public async Task OsuSetCommand([Remainder] string username)
        {
            KaguyaEmbedBuilder embed;
            User playerObject = username.AsUlong(false) == 0
                ? await OsuBase.Client.GetUserByUsernameAsync(username, GameMode.Standard)
                : await OsuBase.Client.GetUserByUserIdAsync((long)username.AsUlong(), GameMode.Standard);

            if (playerObject == null)
            {
                await SendBasicErrorEmbedAsync($"The username you provided doesn't match an existing osu! player.");

                return;
            }

            //Getting user profile database object and updating it.
            DataStorage.DbData.Models.User user = await DatabaseQueries.GetOrCreateUserAsync(Context.User.Id);

            user.OsuId = (int)playerObject.UserId;
            await DatabaseQueries.UpdateAsync(user);

            embed = new KaguyaEmbedBuilder
            {
                Title       = "osu! Username",
                Description = $"Your osu! username has been set to `{playerObject.Username}`."
            };

            await ReplyAsync(embed : embed.Build());
        }
예제 #4
0
        public async Task SwapLogLevel(string level)
        {
            LogLvl curLog          = ConfigProperties.LogLevel;
            string validSeverities = "Trace, Debug, Info, Warn, Error";

            ConfigProperties.LogLevel = level.ToLower() switch
            {
                "trace" => LogLvl.TRACE,
                "debug" => LogLvl.DEBUG,
                "info" => LogLvl.INFO,
                "warn" => LogLvl.WARN,
                "error" => LogLvl.ERROR,
                _ => throw new ArgumentOutOfRangeException($"Valid logtypes are `{validSeverities}`", new Exception())
            };

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"Successfully changed LogLevel from `{curLog.Humanize()}` to `{ConfigProperties.LogLevel.Humanize()}`",
                Footer      = new EmbedFooterBuilder
                {
                    Text = $"Note: This loglevel will return back to `{curLog.Humanize()}` after a restart."
                }
            };

            embed.SetColor(EmbedColor.VIOLET);

            await ReplyAsync(embed : embed.Build());
        }
    }
예제 #5
0
파일: AddRole.cs 프로젝트: mmattbtw/Kaguya
        public async Task GiveRole(IGuildUser user, params string[] args)
        {
            int i = 0;

            foreach (string roleName in args)
            {
                SocketRole role = roleName.AsUlong(false) != 0
                    ? Context.Guild.GetRole(roleName.AsUlong())
                    : Context.Guild.Roles.FirstOrDefault(x => x.Name.ToLower() == roleName.ToLower());

                try
                {
                    await user.AddRoleAsync(role);

                    i++;
                }
                catch (Exception ex)
                {
                    await ConsoleLogger.LogAsync($"Exception thrown when adding role to user through command addrole: {ex.Message}", LogLvl.WARN);
                }
            }

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"`{user.Username}` has been given `{i.ToWords()}` roles."
            };

            await ReplyAsync(embed : embed.Build());
        }
예제 #6
0
파일: Redeem.cs 프로젝트: kaguyabot/Kaguya
        private async Task SendEmbedToBotOwner(ICommandContext context, IKey key)
        {
            SocketUser owner  = Client.GetUser(ConfigProperties.BotConfig.BotOwnerId);
            var        fields = new List <EmbedFieldBuilder>
            {
                new EmbedFieldBuilder
                {
                    IsInline = false,
                    Name     = "Key Properties",
                    Value    = $"Key: `{key.Key}`\nCreated by: `{owner}`\nExpires: " +
                               $"`{DateTime.Now.AddSeconds(key.LengthInSeconds).Humanize(false)}`"
                }
            };

            if (key.GetType() == typeof(PremiumKey))
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Description = $"User `{context.User}` has just redeemed a " +
                                  $"Kaguya Premium key!",
                    Fields = fields
                };

                try
                {
                    await owner.SendMessageAsync(embed : embed.Build());
                }
                catch (HttpException)
                {
                    await ConsoleLogger.LogAsync("Attempted to DM an owner a notification about a " +
                                                 "Kaguya Premium key redemption, but a " +
                                                 "Discord.Net.HttpException was thrown.", LogLvl.WARN);
                }
            }
        }
예제 #7
0
파일: AddQuote.cs 프로젝트: mmattbtw/Kaguya
        public async Task Command([Remainder] string text)
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            IEnumerable <Quote> quotes = server.Quotes;
            int quoteCount             = quotes?.Count() ?? 0;

            if (quoteCount > 0)
            {
                if (server.Quotes.Any(x => x.Text.Equals(text)))
                {
                    var cEmbed = new KaguyaEmbedBuilder(EmbedColor.YELLOW)
                    {
                        Description = "A quote with the same text already exists. Do you want to create this one anyway?"
                    };

                    var data = new ReactionCallbackData("", cEmbed.Build(), true, true, TimeSpan.FromSeconds(120));
                    data.AddCallBack(GlobalProperties.CheckMarkEmoji(), async(c, r) => { await InsertQuote(Context, server, text); });

                    data.AddCallBack(GlobalProperties.NoEntryEmoji(),
                                     async(c, r) => { await SendBasicErrorEmbedAsync("Okay, no action will be taken."); });

                    await InlineReactionReplyAsync(data);

                    return;
                }
            }

            await InsertQuote(Context, server, text);
        }
예제 #8
0
        public async Task BanUser(SocketGuildUser user, [Remainder] string reason = null)
        {
            var embed = new KaguyaEmbedBuilder();

            reason ??= "<No reason provided>";

            try
            {
                await user.BanAsync(reason : reason);

                if (user.Id != 159985870458322944)
                {
                    embed.Description = $"Successfully banned `{user}` with reason `{reason}`\n";
                }
                else // Easter egg lol
                {
                    embed.Description = $"Successfully banned `{user}` with reason `{reason}`\n" +
                                        $"*Nice choice* <:Kaguya:581581938884608001> 👍";
                }
            }
            catch (Exception)
            {
                embed.Description = $"Failed to ban `{user}`\n";
            }

            await ReplyAsync(embed : embed.Build());
        }
예제 #9
0
파일: UnWarn.cs 프로젝트: mmattbtw/Kaguya
        public async Task UnWarnUser(SocketGuildUser user, [Remainder] string reason = null)
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            List <WarnedUser> warnings = await DatabaseQueries.GetAllForServerAndUserAsync <WarnedUser>(user.Id, server.ServerId);

            int warnCount = warnings.Count;
            var fields    = new List <EmbedFieldBuilder>();

            reason ??= "<No reason provided>";

            if (warnCount > 4 && !server.IsPremium)
            {
                warnCount = 4;
            }

            if (warnCount > 9 && server.IsPremium)
            {
                warnCount = 9;
            }

            if (warnings.Count == 0)
            {
                var reply = new KaguyaEmbedBuilder
                {
                    Description = $"{user.Username} has no warnings to remove!"
                };

                reply.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : reply.Build());

                return;
            }

            for (int i = 0; i < warnCount; i++)
            {
                var field = new EmbedFieldBuilder
                {
                    Name  = $"Warning #{i + 1}",
                    Value = $"Reason: `{warnings.ElementAt(i).Reason}`"
                };

                fields.Add(field);
            }

            var embed = new KaguyaEmbedBuilder
            {
                Title  = $"Warnings for {user}",
                Fields = fields,
                Footer = new EmbedFooterBuilder
                {
                    Text = "Select a reaction to remove the warning."
                }
            };

            await ReactionReply(user, warnings, embed.Build(), warnCount, server, reason);
        }
예제 #10
0
        public async Task ShadowbanUser(SocketGuildUser user, [Remainder] string reason = null)
        {
            SocketGuild guild  = Context.Guild;
            IRole       role   = guild.Roles.FirstOrDefault(x => x.Name == SB_ROLE);
            Server      server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            if (role == null)
            {
                await ReplyAsync($"{Context.User.Mention} Could not find role `{SB_ROLE}`. Creating...");

                RestRole newRole = await guild.CreateRoleAsync(SB_ROLE, GuildPermissions.None, null, false, false, null);

                role = newRole;
                await ReplyAsync($"{Context.User.Mention} Created role `{SB_ROLE}` with permissions: `none`.");
                await ReplyAsync($"{Context.User.Mention} Scanning permission overwrites for channels...");
            }

            if (string.IsNullOrWhiteSpace(reason))
            {
                reason = "<No reason provided>";
            }

            try
            {
                await ScanChannelsForPermissions(role);

                if (user.Roles.Contains(role))
                {
                    await SendBasicErrorEmbedAsync($"{user.Mention} already has the role {role.Mention}.");

                    return;
                }

                await user.AddRoleAsync(role);
            }
            catch (Exception e)
            {
                throw new KaguyaSupportException("Failed to add `kaguya-mute` role to user!\n\n" +
                                                 $"Error Log: ```{e}```");
            }

            IEnumerable <SocketRole> roles = user.Roles.Where(x => !x.IsManaged && x.Name != "@everyone");
            await user.RemoveRolesAsync(roles);

            var successEmbed = new KaguyaEmbedBuilder
            {
                Description = $"`{user}` has been transported to the shadowlands...",
                Footer      = new EmbedFooterBuilder
                {
                    Text = "In the shadowlands, users may not interact with any text or voice channel, " +
                           "or view who is in the server.\n\n" +
                           "Use the unshadowban command to undo this action."
                }
            };

            KaguyaEvents.TriggerShadowban(new ModeratorEventArgs(server, guild, user, (SocketGuildUser)Context.User, reason, null));
            await ReplyAsync(embed : successEmbed.Build());
        }
예제 #11
0
        /*
         * Some extensions here are also present in KaguyaBase. It is important they are
         * left here as extensions in the event that an ISocketMessageChannel needs it where
         * the current command's Context isn't available or is not in use.
         */

        /// <summary>
        /// Sends a basic reply in chat with the default embed color.
        /// </summary>
        /// <param name="channel"></param>
        /// <param name="description"></param>
        /// <returns></returns>
        public static async Task SendBasicSuccessEmbedAsync(this IMessageChannel channel, string description)
        {
            var embed = new KaguyaEmbedBuilder
            {
                Description = description
            };

            await channel.SendMessageAsync(embed : embed.Build());
        }
예제 #12
0
        public async Task Command()
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            List <FilteredPhrase> fp = server.FilteredPhrases.ToList();

            int chars = fp.Sum(phrase => phrase.Phrase.Length);

            string fpStr = "";

            if (chars < 1750)
            {
                fpStr = fp.Aggregate(fpStr, (current, phrase) => current + $"`{phrase.Phrase}`\n");

                if (chars == 0)
                {
                    await SendBasicErrorEmbedAsync("This server currently has no registered filtered phrases.");

                    return;
                }

                var embed = new KaguyaEmbedBuilder
                {
                    Title       = $"Filtered Phrases for {Context.Guild.Name}",
                    Description = fpStr
                };

                await SendEmbedAsync(embed);

                return;
            }

            using (var stream = new MemoryStream())
            {
                var sr = new StreamWriter(stream);

                foreach (FilteredPhrase phrase in fp)
                {
                    await sr.WriteLineAsync(phrase.Phrase);
                }

                stream.Seek(0, SeekOrigin.Begin);
                await stream.FlushAsync();

                var embed = new KaguyaEmbedBuilder
                {
                    Title       = $"Filtered Phrases for {Context.Guild.Name}",
                    Description = $"{Context.User.Mention}, your filtered phrases were too long to send in one message, " +
                                  $"so I put them in a text file for you!"
                };

                await Context.Channel.SendFileAsync(stream,
                                                    $"Filtered_Phrases_{Context.Guild.Name}_{DateTime.Now.ToLongDateString()}.txt",
                                                    embed : embed.Build());
            }
        }
예제 #13
0
파일: Unmute.cs 프로젝트: mmattbtw/Kaguya
        public async Task UnmuteUser(SocketGuildUser user, [Remainder] string reason = null)
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            var mutedObject = await DatabaseQueries.GetFirstMatchAsync <MutedUser>(x => x.UserId == user.Id && x.ServerId == server.ServerId);

            reason ??= "<No reason provided>";

            if (mutedObject != null)
            {
                await DatabaseQueries.DeleteAsync(mutedObject);
            }

            if (server.IsPremium)
            {
                await DatabaseQueries.UpdateAsync(server);
            }

            try
            {
                SocketRole muteRole = Context.Guild.Roles.FirstOrDefault(x => x.Name.ToLower() == "kaguya-mute");

                if (!user.Roles.Contains(muteRole))
                {
                    await ReplyAsync($"{Context.User.Mention} **{user}** is not muted.");

                    return;
                }

                await user.RemoveRoleAsync(muteRole);
                await ReplyAsync($"{Context.User.Mention} Successfully unmuted **{user}**.");


                KaguyaEvents.TriggerUnmute(new ModeratorEventArgs(server, Context.Guild, user, (SocketGuildUser)Context.User, reason, null));
            }
            catch (NullReferenceException)
            {
                var errorEmbed = new KaguyaEmbedBuilder
                {
                    Description = "User was never muted because the mute role doesn't exist.",
                    Footer      = new EmbedFooterBuilder
                    {
                        Text = "Use the mute command to generate the mute role."
                    }
                };

                errorEmbed.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : errorEmbed.Build());
            }
            catch (Exception e)
            {
                throw new KaguyaSupportException($"An unexpected error occurred.\n\nError Log: {e}");
            }
        }
예제 #14
0
        /// <summary>
        /// Sends a basic error message in chat.
        /// </summary>
        /// <param name="channel"></param>
        /// <param name="description"></param>
        /// <returns></returns>
        public static async Task SendBasicErrorEmbedAsync(this IMessageChannel channel, string description)
        {
            var embed = new KaguyaEmbedBuilder
            {
                Description = description
            };

            embed.SetColor(EmbedColor.RED);

            await channel.SendMessageAsync(embed : embed.Build());
        }
예제 #15
0
        public async Task AddPhrase(params string[] args)
        {
            string s = "s";

            if (args.Length == 1)
            {
                s = "";
            }

            Server server = DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id).Result;
            List <FilteredPhrase> allFp = server.FilteredPhrases.ToList();

            if (args.Length == 0)
            {
                var embed0 = new KaguyaEmbedBuilder
                {
                    Description = "Please specify at least one phrase."
                };

                embed0.SetColor(EmbedColor.RED);

                await SendEmbedAsync(embed0);

                return;
            }

            foreach (string element in args)
            {
                var fp = new FilteredPhrase
                {
                    ServerId = server.ServerId,
                    Phrase   = element
                };

                if (allFp.Contains(fp))
                {
                    continue;
                }

                await DatabaseQueries.InsertIfNotExistsAsync(fp);

                await ConsoleLogger.LogAsync($"Server {server.ServerId} has added the phrase \"{element}\" to their word filter.",
                                             DataStorage.JsonStorage.LogLvl.DEBUG);
            }

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"Successfully added {args.Length} phrase{s} to the filter."
            };

            embed.SetColor(EmbedColor.VIOLET);

            await ReplyAsync(embed : embed.Build());
        }
예제 #16
0
        public async Task SetPrefix()
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            var embed = new KaguyaEmbedBuilder(EmbedColor.VIOLET)
            {
                Description = $"Your current command prefix is `{server.CommandPrefix}`"
            };

            await ReplyAsync(embed : embed.Build());
        }
예제 #17
0
        public async Task Command(params SocketGuildUser[] users)
        {
            if (users.Length == 0)
            {
                var errorEmbed = new KaguyaEmbedBuilder
                {
                    Description = "Please specify one (or more) users to action."
                };

                await ReplyAsync(embed : errorEmbed.Build());

                return;
            }

            await ReplyAsync($"{Context.User.Mention} Processing, please wait...");

            List <SocketRole> roles = Context.Guild.Roles.Where(x => !x.IsManaged && x.Name != "@everyone").ToList();
            var namesList           = new List <string>(users.Length);

            int errorRoles = Context.Guild.Roles.Count(x => x.IsManaged);

            foreach (SocketGuildUser user in users)
            {
                namesList.Add(user.ToString());
                await user.AddRolesAsync(roles);
            }

            string nameString = $"";

            foreach (string name in namesList)
            {
                nameString += $"`{name}`, ";
            }

            nameString = nameString.Substring(0, nameString.Length - 2);

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"Successfully applied `{(Context.Guild.Roles.Count - errorRoles).ToWords()}` roles to " +
                              $"{nameString}."
            };

            if (errorRoles > 0)
            {
                embed.Description += $"\n\nI failed to assign `{errorRoles.ToWords()}` roles. These " +
                                     $"roles are managed by integrations or other bots, therefore it " +
                                     $"cannot be assigned to any users.";
            }

            await ReplyAsync(embed : embed.Build());
        }
예제 #18
0
파일: Redeem.cs 프로젝트: kaguyabot/Kaguya
        private async Task ApplyRewardsToUser(User user, IUser discordUser, IKey key)
        {
            int points = (int)(25000 * (TimeSpan.FromSeconds(key.LengthInSeconds).TotalDays / 30));

            user.AddPoints(points);

            var embed = new KaguyaEmbedBuilder(EmbedColor.GOLD)
            {
                Description = $"{discordUser.Mention} You have been awarded `{points:N0}` points!"
            };

            await DatabaseQueries.UpdateAsync(user);

            await discordUser.SendMessageAsync(embed : embed.Build());
        }
예제 #19
0
        public async Task Find([Remainder] string roleName)
        {
            SocketGuild guild = Context.Guild;
            IReadOnlyCollection <SocketRole> roles = guild.Roles;

            if (roles.All(x => x.Name.ToLower() != roleName.ToLower()))
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Description = $"The role `{roleName.ToUpper()}` could not be found."
                };

                embed.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : embed.Build());

                return;
            }

            int matchCount = roles.Count(x => x.Name.ToLower() == roleName.ToLower());

            if (matchCount > 1)
            {
                await MultipleMatchingRolesHandler(guild, roleName, roles);

                return;
            }

            SocketRole matchingRole = guild.Roles.FirstOrDefault(x => x.Name.ToLower() == roleName.ToLower());

            List <PaginatedMessage.Page> pages = Pages(guild, matchingRole);
            var pager = new PaginatedMessage
            {
                Pages = pages,
                Color = Color.Blue
            };

            await PagedReplyAsync(pager, new ReactionList
            {
                Backward = true,
                First    = true,
                Forward  = true,
                Jump     = true,
                Last     = true,
                Trash    = true
            });
        }
예제 #20
0
        private async Task <CommandInfo> FindCommandInfo(string cmd, Server server)
        {
            CommandService cmdInfo    = CommandHandler.Commands;
            var            allAliases = new List <string>();

            foreach (CommandInfo command in cmdInfo.Commands)
            {
                allAliases.AddRange(command.Aliases.Select(alias => alias.ToLower()));
            }

            /*We use LastOrDefault instead of FirstOrDefault
             * because there are two "help" commands with the same names, but only the
             * last one has the proper description / syntax to be displayed in chat.*/

            CommandInfo selectedCommandByName  = cmdInfo.Commands.LastOrDefault(x => x.Name.ToLower() == cmd);
            CommandInfo selectedCommandByAlias = cmdInfo.Commands.LastOrDefault(x => x.Aliases.Contains(cmd));

            CommandInfo selectedCommand;

            if (selectedCommandByAlias != null && selectedCommandByName == null || selectedCommandByAlias != null)
            {
                selectedCommand = selectedCommandByAlias;
            }

            else if (selectedCommandByName != null)
            {
                selectedCommand = selectedCommandByName;
            }

            else
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Description =
                        $"Command `{server.CommandPrefix}{cmd}` does not exist. Please ensure you are typing the name (or ailias) correctly. " +
                        $"Use `{server.CommandPrefix}help` for a list of all commands."
                };

                embed.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : embed.Build());

                selectedCommand = null;
            }

            return(selectedCommand);
        }
예제 #21
0
        public async Task Command(params SocketGuildUser[] users)
        {
            if (users.Length == 0)
            {
                var errorEmbed = new KaguyaEmbedBuilder
                {
                    Description = "Please specify one (or more) users to action."
                };

                await ReplyAsync(embed : errorEmbed.Build());

                return;
            }

            await ReplyAsync($"{Context.User.Mention} Processing, please wait...");

            List <SocketRole> roles = Context.Guild.Roles.Where(x => !x.IsManaged && x.Name != "@everyone").ToList();
            var namesList           = new List <string>(users.Length);

            int errorRoles = Context.Guild.Roles.Count(x => x.IsManaged);

            foreach (SocketGuildUser user in users)
            {
                namesList.Add(user.ToString());
                await user.RemoveRolesAsync(roles);
            }

            string nameString = $"";

            foreach (string name in namesList)
            {
                nameString += $"`{name}`, ";
            }

            nameString = nameString.Substring(0, nameString.Length - 2);

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"Successfully removed all roles from " +
                              $"{nameString}. Note that if there are any roles " +
                              $"managed by integrations or bots, these may not be removed."
            };

            await ReplyAsync(embed : embed.Build());
        }
예제 #22
0
        public async Task Command()
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            var embed = new KaguyaEmbedBuilder
            {
                Title       = "Greeting Message",
                Description = $"Current greeting:\n\n`" +
                              $"{(!string.IsNullOrEmpty(server.CustomGreeting) ? $"`{server.CustomGreeting}`" : "*No greeting set.*")}`",
                Footer = new EmbedFooterBuilder
                {
                    Text = $"This greeting is currently {(server.CustomGreetingIsEnabled ? "enabled" : "disabled")}. Toggle " +
                           $"this setting with the {server.CommandPrefix}tg command."
                }
            };

            await ReplyAsync(embed : embed.Build());
        }
예제 #23
0
파일: Kick.cs 프로젝트: mmattbtw/Kaguya
        public async Task KickUser(SocketGuildUser user, [Remainder] string reason = null)
        {
            var embed = new KaguyaEmbedBuilder();

            reason ??= "<No reason provided>";

            try
            {
                await user.KickAsync(reason);

                embed.Description = $"Successfully kicked `{user}` with reason `{reason}`";
            }
            catch (Exception)
            {
                embed.Description = $"Failed to kick `{user}`.";
            }

            await ReplyAsync(embed : embed.Build());
        }
예제 #24
0
        private async Task ChatReply(string formattedTimeString, int amount)
        {
            #region Grammar
            string s = "";

            if (amount != 1)
            {
                s = "s";
            }
            #endregion

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"Successfully generated `{amount} key{s}`.\n\n" +
                              $"Duration: `{formattedTimeString}`\n" +
                              $"Creator: `[Name: {Context.User} | ID: {Context.User.Id}]`\n"
            };

            await ReplyAsync(embed : embed.Build());
        }
예제 #25
0
        public async Task RemovePhrase()
        {
            Server server = await DatabaseQueries.GetOrCreateServerAsync(Context.Guild.Id);

            List <FilteredPhrase> allFp = server.FilteredPhrases.ToList();

            foreach (FilteredPhrase element in allFp)
            {
                await DatabaseQueries.DeleteAsync(element);
            }

            var embed = new KaguyaEmbedBuilder
            {
                Description = $"Successfully cleared the server's word filter. ({allFp.Count} phrases)"
            };

            embed.SetColor(EmbedColor.VIOLET);

            await ReplyAsync(embed : embed.Build());
        }
예제 #26
0
        public async Task RemoveRole(params string[] roleNames)
        {
            if (roleNames.Length > 1)
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Title = "Roles Created"
                };

                foreach (string role in roleNames)
                {
                    embed.AddField("Role Created", $"`{role}` has been created.");
                    await Context.Guild.CreateRoleAsync(role, GuildPermissions.None, Color.Default, false, false, null);
                }

                await ReplyAsync(embed : embed.Build());
            }
            else if (roleNames.Count() == 1)
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Description = $"**{Context.User.Mention} Successfully created role `{roleNames[0]}`**"
                };

                await Context.Guild.CreateRoleAsync(roleNames[0], GuildPermissions.None, Color.Default, false, false, null);

                await ReplyAsync(embed : embed.Build());
            }
            else
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Description = $"Please specify a role to create."
                };

                embed.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : embed.Build());
            }
        }
예제 #27
0
        public static async Task Trigger(SocketGuild newGuild)
        {
            SocketGuildUser owner = newGuild.Owner;
            var             embed = new KaguyaEmbedBuilder
            {
                Title       = $"Salutations!",
                Description = $"Greetings, {owner.Username}. Thanks for adding me to your server! " +
                              $"Here's a few tips on how to get started:\n\n" +
                              $"- Kaguya's default prefix is `$`. Use this to invoke all commands. " +
                              $"All commands may be found by typing `$help`.\n" +
                              $"- Change my prefix to something else using `$prefix <new prefix>`. " +
                              $"Example: `$prefix k!`.\n" +
                              $"- If you forget the prefix, tag me at anytime to use commands.\n\n" +
                              $"- Don't like something? Turn it off!\n" +
                              $"Example to disable levels: `$togglelevels`\n\n" +
                              $"If you need assistance, [click here to join my support server.](https://discord.gg/aumCJhr)\n\n" +
                              $"**[Click here to watch a tutorial on how to use me.](https://www.youtube.com/watch?v=uNqiYOSSTYI)**\n\n" +
                              $"Enjoy!"
            };

            await owner.SendMessageAsync(embed : embed.Build());
        }
예제 #28
0
        public async Task React(string text, ulong msgId = 0)
        {
            IMessage message = null;

            if (msgId == 0)
            {
                message = Context.Message;
            }

            if (msgId != 0)
            {
                message = await Context.Channel.GetMessageAsync(msgId);
            }

            if (text.Length > 10)
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Description = "Your reaction may not be more than 10 characters long."
                };

                embed.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : embed.Build());

                return;
            }

            text.Replace(" ", "");
            var emojis = new List <Emoji>();

            foreach (char letter in text)
            {
                emojis.Add(new Emoji($"{ReturnEmoji(letter)}"));
            }

            await(message as IUserMessage).AddReactionsAsync(emojis.ToArray());
        }
예제 #29
0
        public async Task Command(params SocketGuildUser[] users)
        {
            Request tickleGif = await ConfigProperties.NekoClient.Action_v3.TickleGif();

            if (users.Length == 1)
            {
                var embed = new KaguyaEmbedBuilder
                {
                    Title       = "Tickle!",
                    Description = $"{Context.User.Mention} tickled {users[0].Mention}!",
                    ImageUrl    = tickleGif.ImageUrl
                };

                await ReplyAsync(embed : embed.Build());

                return;
            }
            else
            {
                var names = new List <string>();
                users.ToList().ForEach(x => names.Add(x.Mention));

                if (names.Count == 0)
                {
                    names.Add("the air");
                }

                var embed = new KaguyaEmbedBuilder
                {
                    Title       = "Tickle!",
                    Description = $"{Context.User.Mention} tickled {names.Humanize()}!",
                    ImageUrl    = tickleGif.ImageUrl
                };

                await ReplyAsync(embed : embed.Build());
            }
        }
예제 #30
0
        public async Task Remind(string timeString, [Remainder] string text)
        {
            TimeSpan           time = timeString.ParseToTimespan();
            KaguyaEmbedBuilder embed;

            if (time.TotalSeconds < 10)
            {
                embed = new KaguyaEmbedBuilder
                {
                    Description = "You must set a reminder for at least 10 seconds from now."
                };

                embed.SetColor(EmbedColor.RED);

                await ReplyAsync(embed : embed.Build());

                return;
            }

            var reminder = new Reminder
            {
                UserId       = Context.User.Id,
                Expiration   = DateTime.Now.AddSeconds(time.TotalSeconds).ToOADate(),
                Text         = text,
                HasTriggered = false
            };

            await DatabaseQueries.InsertAsync(reminder);

            embed = new KaguyaEmbedBuilder
            {
                Description = $"Okay! I'll remind you in `{time.Humanize(3)}` to `{text}`"
            };

            await ReplyAsync(embed : embed.Build());
        }