Exemplo n.º 1
0
        public async Task ShowXPCommand(SocketGuildUser user = null)
        {
            user ??= Context.socketServerUser;

            var   serverMemory = MemorySystem.memory[Context.server];
            ulong xp           = serverMemory[user].GetData <XPSystem, XPServerUserData>().xp;
            uint  level        = XPToLevel(xp);

            uint rank = (uint)serverMemory.GetSubMemories <ServerUserMemory>().Keys
                        .SelectIgnoreNull(key => {
                var botUser = MopBot.client.GetUser(key);

                if (botUser == null)
                {
                    return(null);
                }

                return(new KeyValuePair <ulong, ServerUserMemory>?(new KeyValuePair <ulong, ServerUserMemory>(key, serverMemory[botUser])));
            })
                        .OrderByDescending(pair => pair?.Value.GetData <XPSystem, XPServerUserData>().xp ?? 0)
                        .FirstIndex(pair => pair?.Key == user.Id) + 1;

            ulong thisLevelXP = LevelToXP(level);
            ulong nextLevelXP = LevelToXP(level + 1);

            var builder = MopBot.GetEmbedBuilder(Context)
                          .WithAuthor(user.Username, user.GetAvatarUrl())
                          .WithDescription($"**XP: **{xp-thisLevelXP}/{nextLevelXP-thisLevelXP} ({xp}/{nextLevelXP} Total)\r\n**Level: **{level}\r\n**Rank: **#{rank}");

            await Context.socketTextChannel.SendMessageAsync("", embed : builder.Build());
        }
Exemplo n.º 2
0
        public async Task ShowShopCommand(string shopId)
        {
            var server             = Context.server;
            var memory             = server.GetMemory();
            var cmdShopServerData  = memory.GetData <CommandShopSystem, CommandShopServerData>();
            var currencyServerData = memory.GetData <CurrencySystem, CurrencyServerData>();
            var shops = cmdShopServerData.Shops;

            if (!shops.TryGetValue(shopId, out Shop shop))
            {
                throw new BotError($"No such shop: `{shopId}`.");
            }

            var embedBuilder = MopBot.GetEmbedBuilder(server)
                               .WithTitle(shop.displayName)
                               .WithDescription(shop.description)
                               .WithThumbnailUrl(shop.thumbnailUrl)
                               .WithFooter(@"Use ""!shop buy rewards <item number>"" to buy stuff!");

            var items = shop.Items;

            if (items != null)
            {
                for (int i = 0; i < items.Length; i++)
                {
                    ShopItem item = items[i];
                    await shop.SafeItemAction(i, throwError : false, action : async item => {
                        embedBuilder.AddField($"#{i+1} - {item.name}", $"Costs {string.Join(", ",item.prices.Select(price => currencyServerData.Currencies[price.currency].ToString(price.amount)))}");
                    });
                }
            }

            await Context.ReplyAsync(embedBuilder.Build());
        }
Exemplo n.º 3
0
        public async Task ShowCurrenciesCommand()
        {
            var context            = Context;
            var userId             = context.user.Id;
            var currencyServerData = context.server.GetMemory().GetData <CurrencySystem, CurrencyServerData>();

            var currencies = currencyServerData.Currencies;

            if (currencies.Count == 0)
            {
                throw new BotError("There are currently no currencies on this server.");
            }

            var builder = MopBot.GetEmbedBuilder(context)
                          .WithAuthor($"{context.user.GetDisplayName()}'s Coins & Points", context.user.GetAvatarUrl());

            foreach (var nameId in currencies)
            {
                var   currency = nameId.value;
                ulong amount   = currency.GetAmount(userId);               //currencyUserData[id];

                builder.AddField(
                    $"{currency.emote ?? "💰"} - **{amount} {StringUtils.ChangeForm(currency.displayName,amount==1)}**",
                    $"{currency.description ?? "No description"}\r\nId: `{nameId.name}`"
                    );
            }

            await context.ReplyAsync(embed : builder.Build());
        }
Exemplo n.º 4
0
        public async Task AvatarCommand(SocketGuildUser user, [Remainder] string args = null)
        {
            var embed = MopBot.GetEmbedBuilder(Context)
                        .WithAuthor($"{user.GetDisplayName()}'s avatar")
                        .WithImageUrl(user.GetAvatarUrl(size: 1024))
                        .WithFooter($"Requested by {Context.socketServerUser.GetDisplayName()}", Context.user.GetAvatarUrl())
                        .Build();

            await Context.ReplyAsync(embed, false);
        }
Exemplo n.º 5
0
        private async Task ExecuteAction(MessageContext context, ModerationPunishment action, string reason, SocketGuildUser user = null)
        {
            user ??= context.socketServerUser ?? throw new ArgumentNullException($"Both {nameof(user)} and {nameof(context)}.{nameof(MessageContext.socketServerUser)} are null.");

            var embedBuilder = MopBot.GetEmbedBuilder(user.Guild)
                               .WithAuthor(user)
                               .WithDescription($"**Reason:** `{reason}`");

            bool RequirePermission(DiscordPermission discordPermission)
            {
                if (!context.server.CurrentUser.HasChannelPermission(context.socketServerChannel, DiscordPermission.BanMembers))
                {
                    action = ModerationPunishment.Announce;

                    embedBuilder.Title = $"{embedBuilder.Title}\r\n**Attempted to execute action '{action}', but the following permission was missing: `{DiscordPermission.BanMembers}`.";

                    return(false);
                }

                return(true);
            }

            switch (action)
            {
            case ModerationPunishment.Kick:
                if (RequirePermission(DiscordPermission.KickMembers))
                {
                    await user.KickAsync(reason : reason);

                    embedBuilder.Title = "User auto-kicked";
                }

                break;

            case ModerationPunishment.Ban:
                if (RequirePermission(DiscordPermission.KickMembers))
                {
                    await user.BanAsync(reason : reason);

                    embedBuilder.Title = "User auto-banned";
                }

                break;
            }

            if (action == ModerationPunishment.Announce)
            {
                embedBuilder.Title = "User violation detected";
            }

            var data = context.server.GetMemory().GetData <AutoModerationSystem, AutoModerationServerData>();

            await context.socketTextChannel.SendMessageAsync(data.announcementPrefix, embed : embedBuilder.Build());
        }
Exemplo n.º 6
0
        public override async Task OnMessageReceived(MessageContext context)
        {
            var server  = context.server;
            var channel = context.socketTextChannel;

            if (channel == null)
            {
                return;
            }

            var triviaServerMemory = server.GetMemory().GetData <TriviaSystem, TriviaServerData>();
            var qa = triviaServerMemory.currentQuestion;

            if (qa == null || channel.Id != triviaServerMemory.currentChannel)
            {
                return;
            }

            var regex = GetCurrentQuestionRegex(triviaServerMemory);

            string text  = context.content.ToLower().RemoveWhitespaces();
            var    match = regex.Match(context.content);

            if (match.Success)
            {
                triviaServerMemory.currentQuestion = null;

                var user = context.socketServerUser;

                CurrencyAmount.TryGiveToUser(ref triviaServerMemory.currencyRewards, user, out string givenString);

                var timeSpan = DateTime.Now - triviaServerMemory.lastTriviaPost.AddSeconds(triviaServerMemory.postIntervalInSeconds);
                var embed    = MopBot.GetEmbedBuilder(server)
                               .WithDescription($"{user.Mention} wins{(givenString!=null ? $", and gets {givenString}" : null)}!\r\nThe question was `{qa.question}`, and their answer was `{match.Groups[1].Value}`.\r\n\r\nThe next question will come up in `{timeSpan:m'm 's's'}` from now.")
                               .Build();

                await channel.SendMessageAsync(embed : embed);

                var currentUser = server.CurrentUser;

                if (triviaServerMemory.lockTriviaChannel && currentUser.HasChannelPermission(channel, DiscordPermission.ManageChannel))
                {
                    //Lock the channel, since the question has been answered.

                    await channel.ModifyPermissions(currentUser, op => op.Modify(sendMessages: PermValue.Allow));                   //Make sure we're still allowed to post

                    await channel.ModifyPermissions(server.EveryoneRole, op => op.Modify(sendMessages: PermValue.Deny));            //Forbid posting for everyone else
                }

                return;
            }
        }
Exemplo n.º 7
0
        public async Task ListSystems()
        {
            var server   = Context.server;
            var isMaster = Context.user.IsBotMaster();
            var builder  = MopBot.GetEmbedBuilder(server);

            foreach (var system in allSystems.Where(s => (!s.Configuration.Hidden || isMaster) && !s.Configuration.AlwaysEnabled).OrderBy(s => s.GetType().Name))
            {
                builder.AddField($"{(system.IsEnabledForServer(server) ? ":white_check_mark:" : ":x:")} - {system.Name}", system.Configuration.Description ?? "`Configuration missing.`");
            }

            await ReplyAsync(embed : builder.Build());
        }
Exemplo n.º 8
0
        public async Task ShowIssue(uint issueId)
        {
            var data  = Context.server.GetMemory().GetData <IssueSystem, IssueServerData>();
            var issue = data.issues.FirstOrDefault(i => i.issueId == issueId) ?? throw new BotError($"An issue with Id #{issueId} could not be found.");

            var user    = Context.user;
            var builder = MopBot.GetEmbedBuilder(Context)
                          .WithAuthor($"Requested by {user.GetDisplayName()}", user.GetAvatarUrl())
                          .WithTitle($"Issue #{issue.issueId}")
                          .WithDescription($"**Status:** {StatusText[issue.status]}```\r\n{issue.text}```");

            await Context.messageChannel.SendMessageAsync(embed : builder.Build());
        }
Exemplo n.º 9
0
        public async Task HelpCommand()
        {
            var context = Context;
            var builder = MopBot.GetEmbedBuilder(context)
                          .WithAuthor($"Commands available to @{context.socketServerUser.GetDisplayName()}:", context.user.GetAvatarUrl())
                          .WithFooter($"You can type {context.server.GetMemory().GetData<CommandSystem, CommandServerData>().commandPrefix}help <command> to see groups' commands and commands' syntaxes.");

            foreach ((var aliases, string description, _) in GetAvailableCommands(context.server, context.socketServerUser, true))
            {
                builder.AddField(string.Join("/", aliases), description);
            }

            await context.socketTextChannel.SendMessageAsync(embed : builder.Build());
        }
Exemplo n.º 10
0
        public async Task ShowEntry(uint entryId)
        {
            var context = Context;
            var data    = context.server.GetMemory().GetData <ChangelogSystem, ChangelogServerData>();
            var entry   = data.entries.FirstOrDefault(i => i.entryId == entryId);

            if (entry == null)
            {
                throw new BotError($"An entry with Id #{entryId} could not be found.");
            }

            var user    = context.user;
            var builder = MopBot.GetEmbedBuilder(context)
                          .WithAuthor($"Requested by {user.GetDisplayName()}", user.GetAvatarUrl())
                          .WithTitle($"Entry #{entry.entryId}")
                          .WithDescription($"**Status:** {(data.entryTypes.TryGetValue(entry.type, out var entryType) ? $"{entryType.discordPrefix} - {entryType.name}" : $"UNKNOWN (`{entry.type}`)")}```\r\n{entry.text}```");
Exemplo n.º 11
0
        public EmbedBuilder ToBuilder(SocketGuild server)
        {
            var builder = MopBot.GetEmbedBuilder(server);

            if (authorName != null)
            {
                builder.WithAuthor(authorName, imageUrl);
            }

            if (description != null)
            {
                builder.WithDescription(description);
            }

            return(builder);
        }
Exemplo n.º 12
0
        public async Task HelpCommand([Remainder] string cmdOrGroup)
        {
            var context = Context;

            cmdOrGroup = cmdOrGroup.Trim().ToLower();

            var match = GroupCommandRegex.Match(cmdOrGroup);

            if (!match.Success)
            {
                throw new BotError($"Invalid input: `{cmdOrGroup}`.");
            }

            string groupA = match.Groups[1].Value;
            string groupB = match.Groups[2].Value;

            var strComparer = MopBot.StrComparerIgnoreCase;
            var cmdPrefix   = context.server.GetMemory().GetData <CommandSystem, CommandServerData>().commandPrefix;

            EmbedBuilder builder = null;

            EmbedBuilder PrepareBuilder() => builder = MopBot.GetEmbedBuilder(context);
Exemplo n.º 13
0
        public override async Task OnMessageReceived(MessageContext message)
        {
            var localServerData = message.server.GetMemory().GetData <ChannelLinkingSystem, ChannelLinkingServerData>();
            var channelLinks    = localServerData.channelLinks;

            if (channelLinks == null)
            {
                return;
            }

            ulong channelId = message.messageChannel.Id;

            if (!channelLinks.TryGetValue(channelId, out ulong linkId))
            {
                return;
            }

            var channelLinkingData = MemorySystem.memory.GetData <ChannelLinkingSystem, ChannelLinkingGlobalData>();

            if (!channelLinkingData.links.TryGetValue(linkId, out var channelLink))
            {
                channelLinks.Remove(channelId);

                return;
            }

            //string inviteUrl = await BotUtils.GetInviteUrl(message.server);
            //string linkedServerName = inviteUrl!=null ? $"({message.server.Name})[{inviteUrl}]" : message.server.Name;

            string authorStr       = $"{message.user.Username}#{message.user.Discriminator} [{message.server.Name}/#{message.Channel.Name}]";
            string authorAvatarUrl = message.user.GetAvatarUrl();

            var builder = MopBot.GetEmbedBuilder(message)
                          .WithColor(message.socketServerUser.Roles.OrderByDescending(r => r.Position).FirstOrDefault(r => !r.Color.ColorEquals(Discord.Color.Default))?.Color ?? Discord.Color.Default)
                          .WithAuthor(authorStr, authorAvatarUrl)       //,$@"https://discordapp.com/channels/@me/{message.user.Id}"
                          .WithDescription(message.content);
Exemplo n.º 14
0
        public override async Task OnUserJoined(SocketGuildUser user)
        {
            var server      = user.Guild;
            var memory      = server.GetMemory();
            var welcomeData = memory.GetData <WelcomeSystem, WelcomeServerData>();

            if (!server.TryGetTextChannel(welcomeData.channel, out var welcomeChannel))
            {
                return;
            }

            string msg;

            if (!memory.GetSubMemories <ServerUserMemory>().Any(p => p.Key == user.Id))
            {
                msg = welcomeData.messageJoin;
            }
            else
            {
                msg = welcomeData.messageRejoin;
            }

            await welcomeChannel.SendMessageAsync(user.Mention, embed : MopBot.GetEmbedBuilder(server).WithDescription(msg).Build());
        }
Exemplo n.º 15
0
        public override async Task ServerUpdate(SocketGuild server)
        {
            var triviaServerData = server.GetMemory().GetData <TriviaSystem, TriviaServerData>();

            if (!triviaServerData.IsReady)
            {
                return;                 //TODO: Let the admins know that this is misconfigured.
            }

            var now = DateTime.Now;

            if ((now - triviaServerData.lastTriviaPost).TotalSeconds <= triviaServerData.postIntervalInSeconds)
            {
                return;
            }

            triviaServerData.lastTriviaPost = now;
            triviaServerData.currentChannel = triviaServerData.triviaChannels[MopBot.Random.Next(triviaServerData.triviaChannels.Count)];

            var channel = server.GetTextChannel(triviaServerData.currentChannel);

            if (channel == null)
            {
                return;                 //TODO: Same as above
            }

            TriviaQuestion[] validQuestions;

            //Find questions we didn't pick yet, handle running out of them.
            while (true)
            {
                lock (triviaServerData.questions) {
                    validQuestions = triviaServerData.questions.Where(q => !q.wasPosted).ToArray();
                }

                if (validQuestions.Length == 0)
                {
                    if (triviaServerData.autoClearCache && triviaServerData.questions.Count > 0)
                    {
                        ClearCache(triviaServerData);

                        continue;
                    }
                    else
                    {
                        await channel.SendMessageAsync($"{server.Owner.Mention} We're out of trivia questions!\r\n\r\nAdd new questions, or..\r\n• Use `!trivia clearcache` to clear list of used questions;\r\n• Use `!trivia autoclearcache true` to automate this process, if you're fully okay with same questions being repeat;");

                        return;
                    }
                }

                break;
            }

            //Set new question
            triviaServerData.currentQuestion           = validQuestions[MopBot.Random.Next(validQuestions.Length)];
            triviaServerData.currentQuestion.wasPosted = true;
            currentQuestionRegex = null;             //This will cause a new one to be made, when needed.

            string     mention             = null;
            SocketRole role                = null;
            bool       disallowRoleMention = false;
            var        currentUser         = server.CurrentUser;

            if (triviaServerData.triviaRole > 0)
            {
                role = server.GetRole(triviaServerData.triviaRole);

                if (role != null)
                {
                    if (!role.IsMentionable && currentUser.HasDiscordPermission(gp => gp.ManageRoles))
                    {
                        await role.ModifyAsync(rp => rp.Mentionable = true);

                        disallowRoleMention = true;
                    }

                    mention = role.Mention;
                }
                else
                {
                    triviaServerData.triviaRole = 0;
                }
            }

            var embedBuilder = MopBot.GetEmbedBuilder(server)
                               .WithAuthor("The next question is...")  //.WithTitle("The next question is...")
                               .WithDescription($"**{triviaServerData.currentQuestion.question}**")
                               .WithFooter("Type your answer right in this channel!");

            if (triviaServerData.thumbnailUrls?.Length > 0 == true)
            {
                try {
                    embedBuilder.WithThumbnailUrl(triviaServerData.thumbnailUrls[MopBot.Random.Next(triviaServerData.thumbnailUrls.Length)]);
                }
                catch {}
            }

            await channel.SendMessageAsync(mention, embed : embedBuilder.Build());

            if (disallowRoleMention)
            {
                await role.ModifyAsync(rp => rp.Mentionable = false);
            }

            if (triviaServerData.lockTriviaChannel && currentUser.HasChannelPermission(channel, DiscordPermission.ManageChannel))
            {
                //Unlock the channel, since there's a question now.

                await channel.ModifyPermissions(server.EveryoneRole, op => op.SendMessages == PermValue.Deny?op.Modify(sendMessages : PermValue.Inherit) : op);
            }
        }
Exemplo n.º 16
0
 private static EmbedBuilder GetUserEmbed(SocketGuild server, IUser user) => MopBot.GetEmbedBuilder(server)
 .WithAuthor(user)
 .WithFooter($"User ID: {user.Id}")
 .WithCurrentTimestamp();