Exemplo n.º 1
0
        public async Task <IActionResult> CreateCurrencyAsync(Currency currency)
        {
            await _currencyService.AddCurrencyAsync(currency);

            return(Ok(currency.Id));
        }
Exemplo n.º 2
0
        private async Task UpdateXp(SocketMessage message, IGuildChannel channel)
        {
            if (!await _config.XpGainEnabled(channel.Id))
            {
                return;
            }

            using IServiceScope scope = _scopeFactory.CreateScope();
            var context = scope.ServiceProvider.GetRequiredService <RokiContext>();

            GuildConfig guildConfig = await _config.GetGuildConfigAsync(channel.GuildId);

            UserData data = await context.UserData.AsQueryable().Where(x => x.UserId == message.Author.Id && x.GuildId == channel.GuildId).SingleOrDefaultAsync();

            if (data == null)
            {
                if (await context.Users.AsNoTracking().AnyAsync(x => x.Id == message.Author.Id))
                {
                    data = new UserData(message.Author.Id, channel.GuildId);
                }
                else
                {
                    data = new UserData(message.Author.Id, channel.GuildId)
                    {
                        User = new User(message.Author.Username, message.Author.Discriminator, message.Author.AvatarId)
                    };
                }

                await context.UserData.AddAsync(data);
            }

            // temp
            // these are always false
            bool doubleXp = data.Xp < 0;
            bool fastXp   = data.Xp < 0;

            var oldXp = new XpLevel(data.Xp);

            DateTime now = DateTime.UtcNow;

            if (fastXp && now - data.LastXpGain >= TimeSpan.FromSeconds(guildConfig.XpFastCooldown))
            {
                data.Xp += doubleXp ? guildConfig.XpPerMessage * 2 : guildConfig.XpPerMessage;
            }
            else if (DateTime.UtcNow - data.LastXpGain >= TimeSpan.FromSeconds(guildConfig.XpCooldown))
            {
                data.Xp += doubleXp ? guildConfig.XpPerMessage * 2 : guildConfig.XpPerMessage;
            }
            else
            {
                return;
            }

            data.LastXpGain = now;
            var newXp = new XpLevel(data.Xp);

            if (oldXp.Level == newXp.Level)
            {
                await context.SaveChangesAsync();

                return;
            }

            data.LastLevelUp = now;

            await SendNotification(data, message, newXp.Level).ConfigureAwait(false);

            List <XpReward> rewards = await context.XpRewards.AsNoTracking().Where(x => x.GuildId == channel.GuildId && x.Level == newXp.Level).ToListAsync();

            if (rewards.Count > 0)
            {
                var sb = new StringBuilder();
                foreach (XpReward reward in rewards)
                {
                    string[] parsed = reward.Details.Split(';');
                    if (parsed.Length < 2)
                    {
                        continue;
                    }

                    switch (parsed[0])
                    {
                    case "currency":
                    {
                        long amount = long.Parse(parsed[1]);
                        await _currency.AddCurrencyAsync(data.UserId, data.GuildId, channel.Id, message.Id, $"#{reward.Id} XP Level {reward.Level} Reward", amount);

                        sb.AppendLine($"+ `{amount:N0}` {guildConfig.CurrencyIcon}");
                        break;
                    }

                    case "role":
                    {
                        SocketRole role = (channel.Guild as SocketGuild)?.GetRole(ulong.Parse(parsed[1]));
                        if (role == null)
                        {
                            continue;
                        }
                        var guildUser = (IGuildUser)message.Author;
                        await guildUser.AddRoleAsync(role).ConfigureAwait(false);

                        sb.AppendLine(reward.Description);
                        break;
                    }
                    }
                }

                IDMChannel dm = await message.Author.GetOrCreateDMChannelAsync().ConfigureAwait(false);

                try
                {
                    await dm.EmbedAsync(new EmbedBuilder().WithOkColor()
                                        .WithTitle($"Level `{newXp.Level}` Rewards - {channel.Guild.Name}")
                                        .WithDescription("Here are your rewards:\n" + sb))
                    .ConfigureAwait(false);

                    await dm.CloseAsync().ConfigureAwait(false);
                }
                catch
                {
                    // unable to send dm to user
                    // ignored
                }
            }

            await context.SaveChangesAsync();
        }