Ejemplo n.º 1
0
 private async Task <UserPlay> GetLastStoredPlay(User user)
 {
     await using var db = new FMBotDbContext(this._connectionString);
     return(await db.UserPlays
            .OrderByDescending(o => o.TimePlayed)
            .FirstOrDefaultAsync(f => f.UserId == user.UserId));
 }
Ejemplo n.º 2
0
        public async Task <DailyOverview> GetDailyOverview(User user, int amountOfDays)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);

            var now     = DateTime.UtcNow;
            var minDate = DateTime.UtcNow.AddDays(-amountOfDays);

            var plays = await db.UserPlays
                        .AsQueryable()
                        .Where(w => w.TimePlayed.Date <= now.Date &&
                               w.TimePlayed.Date > minDate.Date &&
                               w.UserId == user.UserId)
                        .ToListAsync();

            var overview = new DailyOverview
            {
                Days = plays
                       .OrderByDescending(o => o.TimePlayed)
                       .GroupBy(g => g.TimePlayed.Date)
                       .Select(s => new DayOverview
                {
                    Date      = s.Key,
                    Playcount = s.Count(),
                    TopTrack  = GetTopTrackForPlays(s.ToList()),
                    TopAlbum  = GetTopAlbumForPlays(s.ToList()),
                    TopArtist = GetTopArtistForPlays(s.ToList())
                }).ToList(),
                Playcount = plays.Count,
                Uniques   = GetUniqueCount(plays.ToList()),
                AvgPerDay = GetAvgPerDayCount(plays.ToList()),
            };

            return(overview);
        }
Ejemplo n.º 3
0
        // Random user
        public async Task <string> GetRandomLastFMUserAsync()
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var featuredUser = await db.Users
                               .AsQueryable()
                               .FirstOrDefaultAsync(f => f.Featured == true);

            if (featuredUser != null)
            {
                featuredUser.Featured = false;

                db.Entry(featuredUser).State = EntityState.Modified;
            }

            var users = db.Users
                        .AsQueryable()
                        .Where(w => w.Blacklisted != true).ToList();

            var rand = new Random();
            var user = users[rand.Next(users.Count)];

            user.Featured = true;

            db.Entry(user).State = EntityState.Modified;
            await db.SaveChangesAsync();

            return(user.UserNameLastFM);
        }
Ejemplo n.º 4
0
        public async Task StoreGuildUsers(IGuild guild, IReadOnlyCollection <IGuildUser> guildUsers)
        {
            var userIds = guildUsers.Select(s => s.Id).ToList();

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var existingGuild = await db.Guilds
                                .Include(i => i.GuildUsers)
                                .FirstAsync(f => f.DiscordGuildId == guild.Id);

            var users = await db.Users
                        .Include(i => i.Artists)
                        .Where(w => userIds.Contains(w.DiscordUserId))
                        .Select(s => new GuildUser
            {
                GuildId = existingGuild.GuildId,
                UserId  = s.UserId
            })
                        .ToListAsync();

            var connString = db.Database.GetDbConnection().ConnectionString;
            var copyHelper = new PostgreSQLCopyHelper <GuildUser>("public", "guild_users")
                             .MapInteger("guild_id", x => x.GuildId)
                             .MapInteger("user_id", x => x.UserId);

            await using var connection = new NpgsqlConnection(connString);
            connection.Open();

            await using var deleteCurrentArtists = new NpgsqlCommand($"DELETE FROM public.guild_users WHERE guild_id = {existingGuild.GuildId};", connection);
            await deleteCurrentArtists.ExecuteNonQueryAsync().ConfigureAwait(false);

            await copyHelper.SaveAllAsync(connection, users).ConfigureAwait(false);

            Log.Information("Stored guild users for guild with id {guildId}", existingGuild.GuildId);
        }
Ejemplo n.º 5
0
 // Featured
 public async Task <User> GetFeaturedUserAsync()
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Users
            .AsQueryable()
            .FirstOrDefaultAsync(f => f.Featured == true));
 }
Ejemplo n.º 6
0
        // Remove user
        public async Task DeleteUser(int userID)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);

            try
            {
                var user = await db.Users
                           .AsQueryable()
                           .FirstOrDefaultAsync(f => f.UserId == userID);

                this._cache.Remove($"user-settings-{user.DiscordUserId}");
                this._cache.Remove($"user-isRegistered-{user.DiscordUserId}");

                await using var connection = new NpgsqlConnection(ConfigData.Data.Database.ConnectionString);
                connection.Open();

                await using var deleteArtists = new NpgsqlCommand($"DELETE FROM public.user_artists WHERE user_id = {user.UserId};", connection);
                await deleteArtists.ExecuteNonQueryAsync();

                await using var deleteAlbums = new NpgsqlCommand($"DELETE FROM public.user_albums WHERE user_id = {user.UserId};", connection);
                await deleteAlbums.ExecuteNonQueryAsync();

                await using var deleteTracks = new NpgsqlCommand($"DELETE FROM public.user_tracks WHERE user_id = {user.UserId};", connection);
                await deleteTracks.ExecuteNonQueryAsync();

                db.Users.Remove(user);

                await db.SaveChangesAsync();
            }
            catch (Exception e)
            {
                Log.Error(e, "Error while deleting user!");
                throw;
            }
        }
Ejemplo n.º 7
0
        public async Task AddLastFMFriendAsync(ulong discordSenderId, string lastfmusername, int?discordFriendId)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var user = db.Users.FirstOrDefault(f => f.DiscordUserId == discordSenderId);

            if (user == null)
            {
                var newUser = new User
                {
                    DiscordUserId = discordSenderId,
                    UserType      = UserType.User
                };

                await db.Users.AddAsync(newUser);

                user = newUser;
            }

            var friend = new Friend
            {
                User           = user,
                LastFMUserName = lastfmusername,
                FriendUserId   = discordFriendId
            };

            await db.Friends.AddAsync(friend);

            await db.SaveChangesAsync();

            await Task.CompletedTask;
        }
Ejemplo n.º 8
0
 public async Task <int> GetTotalUserCountAsync()
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Users
            .AsQueryable()
            .CountAsync());
 }
Ejemplo n.º 9
0
 // User settings
 public async Task <User> GetUserSettingsAsync(IUser discordUser)
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Users
            .AsQueryable()
            .FirstOrDefaultAsync(f => f.DiscordUserId == discordUser.Id));
 }
Ejemplo n.º 10
0
        public async Task <string[]> AddDisabledCommandAsync(IGuild guild, string command)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var existingGuild = await db.Guilds
                                .AsQueryable()
                                .FirstOrDefaultAsync(f => f.DiscordGuildId == guild.Id);

            if (existingGuild == null)
            {
                var newGuild = new Guild
                {
                    DiscordGuildId   = guild.Id,
                    TitlesEnabled    = true,
                    ChartTimePeriod  = ChartTimePeriod.Monthly,
                    FmEmbedType      = FmEmbedType.embedmini,
                    Name             = guild.Name,
                    DisabledCommands = new[] { command }
                };

                await db.Guilds.AddAsync(newGuild);

                await db.SaveChangesAsync();

                return(newGuild.DisabledCommands);
            }
            else
            {
                if (existingGuild.DisabledCommands != null && existingGuild.DisabledCommands.Length > 0)
                {
                    var newDisabledCommands = existingGuild.DisabledCommands;
                    Array.Resize(ref newDisabledCommands, newDisabledCommands.Length + 1);
                    newDisabledCommands[^ 1]       = command;
Ejemplo n.º 11
0
        public async Task <IReadOnlyList <ListArtist> > GetTopArtistsForGuild(IReadOnlyList <User> guildUsers,
                                                                              OrderType orderType)
        {
            var userIds = guildUsers.Select(s => s.UserId);

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var query = db.UserArtists
                        .AsQueryable()
                        .Where(w => userIds.Contains(w.UserId))
                        .GroupBy(o => o.Name);

            query = orderType == OrderType.Playcount ?
                    query.OrderByDescending(o => o.Sum(s => s.Playcount)) :
                    query.OrderByDescending(o => o.Count());

            return(await query
                   .Take(14)
                   .Select(s => new ListArtist
            {
                ArtistName = s.Key,
                Playcount = s.Sum(su => su.Playcount),
                ListenerCount = s.Count()
            })
                   .ToListAsync());
        }
Ejemplo n.º 12
0
        // TODO: figure out how to do this
        public async Task <int> GetWeekArtistListenerCountForGuildAsync(IEnumerable <User> guildUsers, string artistName)
        {
            var now     = DateTime.UtcNow;
            var minDate = DateTime.UtcNow.AddDays(-7);

            var userIds = guildUsers.Select(s => s.UserId);


            try
            {
                await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
                return(await db.UserPlays
                       .AsQueryable()
                       .Where(w => w.TimePlayed.Date <= now.Date &&
                              w.TimePlayed.Date > minDate.Date &&
                              w.ArtistName.ToLower() == artistName.ToLower() &&
                              userIds.Contains(w.UserId))
                       .GroupBy(x => new { x.UserId, x.ArtistName, x.UserPlayId })
                       .CountAsync());
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Ejemplo n.º 13
0
 // User settings
 public async Task <bool> UserRegisteredAsync(IUser discordUser)
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Users
            .AsQueryable()
            .AnyAsync(f => f.DiscordUserId == discordUser.Id));
 }
Ejemplo n.º 14
0
        public async Task SetGuildPrefixAsync(IGuild guild, string prefix)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var existingGuild = await db.Guilds
                                .AsQueryable()
                                .FirstOrDefaultAsync(f => f.DiscordGuildId == guild.Id);

            if (existingGuild == null)
            {
                var newGuild = new Guild
                {
                    DiscordGuildId  = guild.Id,
                    TitlesEnabled   = true,
                    ChartTimePeriod = ChartTimePeriod.Monthly,
                    FmEmbedType     = FmEmbedType.embedmini,
                    Name            = guild.Name,
                    Prefix          = prefix
                };

                await db.Guilds.AddAsync(newGuild);

                await db.SaveChangesAsync();
            }
            else
            {
                existingGuild.Prefix = prefix;
                existingGuild.Name   = guild.Name;

                db.Entry(existingGuild).State = EntityState.Modified;

                await db.SaveChangesAsync();
            }
        }
Ejemplo n.º 15
0
        public async Task <string[]> GetDisabledCommandsForGuild(IGuild guild)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var existingGuild = await db.Guilds
                                .AsQueryable()
                                .FirstOrDefaultAsync(f => f.DiscordGuildId == guild.Id);

            return(existingGuild?.DisabledCommands);
        }
Ejemplo n.º 16
0
        // User settings
        public async Task <bool> UserHasSessionAsync(IUser discordUser)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var user = await db.Users
                       .AsQueryable()
                       .FirstOrDefaultAsync(f => f.DiscordUserId == discordUser.Id);

            return(!string.IsNullOrEmpty(user.SessionKeyLastFm));
        }
Ejemplo n.º 17
0
 // User settings
 public async Task <User> GetFullUserAsync(IUser discordUser)
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Users
            .Include(i => i.Artists)
            .Include(i => i.Friends)
            .Include(i => i.FriendedByUsers)
            .FirstOrDefaultAsync(f => f.DiscordUserId == discordUser.Id));
 }
Ejemplo n.º 18
0
 public async Task <Guild> GetGuildAsync(ulong guildId)
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Guilds
            .AsQueryable()
            .Include(i => i.GuildUsers)
            .ThenInclude(t => t.User)
            .FirstOrDefaultAsync(f => f.DiscordGuildId == guildId));
 }
Ejemplo n.º 19
0
        public async Task ResetChartTimerAsync(User user)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            user.LastGeneratedChartDateTimeUtc = DateTime.Now;

            db.Entry(user).State = EntityState.Modified;

            await db.SaveChangesAsync();
        }
Ejemplo n.º 20
0
        /// <inheritdoc />
        public async Task LoadAllDisabledCommands()
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var servers = await db.Guilds.Where(w => w.DisabledCommands != null).ToListAsync();

            foreach (var server in servers)
            {
                StoreDisabledCommands(server.DisabledCommands, server.DiscordGuildId);
            }
        }
Ejemplo n.º 21
0
 public async Task <IReadOnlyList <User> > GetOutdatedUsers(DateTime timeLastUpdated)
 {
     await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
     return(await db.Users
            .AsQueryable()
            .Where(f => f.LastIndexed != null &&
                   f.LastUpdated != null &&
                   f.LastUpdated <= timeLastUpdated)
            .ToListAsync());
 }
Ejemplo n.º 22
0
        /// <inheritdoc />
        public async Task LoadAllPrefixes()
        {
            using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var servers = await db.Guilds.Where(w => w.Prefix != null).ToListAsync();

            foreach (var server in servers)
            {
                StorePrefix(server.Prefix, server.DiscordGuildId);
            }
        }
Ejemplo n.º 23
0
        public async Task <IReadOnlyList <User> > GetUsersToIndex(IReadOnlyCollection <IGuildUser> guildUsers)
        {
            var userIds = guildUsers.Select(s => s.Id).ToList();

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            return(await db.Users
                   .Include(i => i.Artists)
                   .Where(w => userIds.Contains(w.DiscordUserId) &&
                          (w.LastIndexed == null || w.LastUpdated == null))
                   .ToListAsync());
        }
Ejemplo n.º 24
0
        public async Task <int> GetIndexedUsersCount(IReadOnlyCollection <IGuildUser> guildUsers)
        {
            var userIds = guildUsers.Select(s => s.Id).ToList();

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            return(await db.Users
                   .AsQueryable()
                   .Where(w => userIds.Contains(w.DiscordUserId) &&
                          w.LastIndexed != null)
                   .CountAsync());
        }
Ejemplo n.º 25
0
        // Remove user
        public async Task DeleteUser(int userID)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var user = await db.Users
                       .AsQueryable()
                       .FirstOrDefaultAsync(f => f.UserId == userID);

            db.Users.Remove(user);

            await db.SaveChangesAsync();
        }
Ejemplo n.º 26
0
        public async Task <int> GetArtistListenerCountForServer(IReadOnlyList <User> guildUsers, string artistName)
        {
            var userIds = guildUsers.Select(s => s.UserId);

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            return(await db.UserArtists
                   .AsQueryable()
                   .Where(w => w.Name.ToLower() == artistName.ToLower() &&
                          userIds.Contains(w.UserId))
                   .CountAsync());
        }
Ejemplo n.º 27
0
        public static async Task <UserSettingsModel> GetUser(
            string[] extraOptions,
            string username,
            ICommandContext context)
        {
            var settingsModel = new UserSettingsModel
            {
                DifferentUser  = false,
                UserNameLastFm = username,
                DiscordUserId  = context.User.Id,
            };

            foreach (var extraOption in extraOptions)
            {
                if (!extraOption.Contains("<@") && extraOption.Length != 18)
                {
                    continue;
                }

                var id = extraOption.Trim('@', '!', '<', '>');

                if (!ulong.TryParse(id, out var discordUserId))
                {
                    continue;
                }
                if (context.Guild == null)
                {
                    continue;
                }
                var guildUser = await context.Guild.GetUserAsync(discordUserId);

                if (guildUser == null)
                {
                    continue;
                }

                await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
                var user = await db.Users
                           .AsQueryable()
                           .FirstOrDefaultAsync(f => f.DiscordUserId == discordUserId);

                if (user == null)
                {
                    continue;
                }

                settingsModel.DifferentUser  = true;
                settingsModel.DiscordUserId  = discordUserId;
                settingsModel.UserNameLastFm = user.UserNameLastFM;
            }

            return(settingsModel);
        }
Ejemplo n.º 28
0
        public async Task RemoveAllFriendsAsync(int userId)
        {
            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            var friends = db.Friends
                          .AsQueryable()
                          .Where(f => f.UserId == userId).ToList();

            if (friends.Count > 0)
            {
                db.Friends.RemoveRange(friends);
                await db.SaveChangesAsync();
            }
        }
Ejemplo n.º 29
0
        public async Task <IReadOnlyList <User> > GetUsersToIndex(IReadOnlyCollection <IGuildUser> guildUsers)
        {
            var userIds = guildUsers.Select(s => s.Id).ToList();

            var tooRecent = DateTime.UtcNow.Add(-Constants.GuildIndexCooldown);

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            return(await db.Users
                   .Include(i => i.Artists)
                   .Where(w => userIds.Contains(w.DiscordUserId) &&
                          (w.LastIndexed == null || w.LastIndexed <= tooRecent))
                   .ToListAsync());
        }
Ejemplo n.º 30
0
        public async Task <int> GetWeekArtistPlaycountAsync(int userId, string artistName)
        {
            var now     = DateTime.UtcNow;
            var minDate = DateTime.UtcNow.AddDays(-7);

            await using var db = new FMBotDbContext(ConfigData.Data.Database.ConnectionString);
            return(await db.UserPlays
                   .AsQueryable()
                   .CountAsync(a => a.TimePlayed.Date <= now.Date &&
                               a.TimePlayed.Date > minDate.Date &&
                               a.ArtistName.ToLower() == artistName.ToLower() &&
                               a.UserId == userId));
        }