using Microsoft.Data.Sqlite; namespace OF_DL.Services; public class CajetanDbService(IConfigService configService) : DbService(configService), ICajetanDbService { public async Task InitializeUserInfoTablesAsync() { await using SqliteConnection connection = new($"Data Source={Directory.GetCurrentDirectory()}/users.db"); connection.Open(); using (SqliteCommand cmdInfo = new("CREATE TABLE IF NOT EXISTS user_info (user_id INTEGER NOT NULL, name VARCHAR NOT NULL, about VARCHAR NULL, expires_on TIMESTAMP NULL, photo_count INT NOT NULL, video_count INT NOT NULL, PRIMARY KEY(user_id));", connection)) { await cmdInfo.ExecuteNonQueryAsync(); } using (SqliteCommand cmdInfo = new("CREATE TABLE IF NOT EXISTS user_info_blob (user_id INTEGER NOT NULL, name VARCHAR NOT NULL, blob TEXT NULL, PRIMARY KEY(user_id));", connection)) { await cmdInfo.ExecuteNonQueryAsync(); } using (SqliteCommand cmdNonNude = new("CREATE TABLE IF NOT EXISTS user_non_nude (user_id INTEGER NOT NULL, name VARCHAR NOT NULL, PRIMARY KEY(user_id)", connection)) { await cmdNonNude.ExecuteNonQueryAsync(); } } public async Task> GetUsersAsync() { await using SqliteConnection connection = new($"Data Source={Directory.GetCurrentDirectory()}/users.db"); using SqliteCommand cmd = new("SELECT user_id, username FROM users", connection); using SqliteDataReader reader = cmd.ExecuteReader(); Dictionary result = new(StringComparer.OrdinalIgnoreCase); while (reader.Read()) { long userId = reader.GetInt64(0); string username = reader.GetString(1); result[username] = userId; } return result; } public async Task UpdateUserInfoAsync(UserEntities.UserInfo? userInfo) { if (userInfo?.Id is null || userInfo?.Username is null) return; await using SqliteConnection connection = new($"Data Source={Directory.GetCurrentDirectory()}/users.db"); Log.Debug("Database data source: " + connection.DataSource); await UpdateAsync(); await UpdateBlobAsync(); async Task UpdateAsync() { using SqliteCommand cmdInfo = new( "INSERT OR REPLACE INTO user_info (user_id, name, about, expires_on, photo_count, video_count) " + "VALUES (@userId, @name, @about, @expiresOn, @photoCount, @videoCount);", connection ); cmdInfo.Parameters.AddWithValue("@userId", userInfo.Id); cmdInfo.Parameters.AddWithValue("@name", userInfo.Name ?? userInfo.Username); cmdInfo.Parameters.AddWithValue("@about", userInfo.About); cmdInfo.Parameters.AddWithValue("@expiresOn", userInfo.SubscribedByExpireDate); cmdInfo.Parameters.AddWithValue("@photoCount", userInfo.PhotosCount ?? 0); cmdInfo.Parameters.AddWithValue("@videoCount", userInfo.VideosCount ?? 0); try { await cmdInfo.ExecuteNonQueryAsync(); Log.Debug("Inserted or updated creator info: {Username:l}", userInfo.Username); } catch (Exception ex) { Log.Warning(ex, "Failed to update User Info for: {Username:l}", userInfo.Username); } } async Task UpdateBlobAsync() { using SqliteCommand cmdInfo = new( "INSERT OR REPLACE INTO user_info_blob (user_id, name, blob) " + "VALUES (@userId, @name, @blob);", connection ); cmdInfo.Parameters.AddWithValue("@userId", userInfo.Id); cmdInfo.Parameters.AddWithValue("@name", userInfo.Name ?? userInfo.Username); cmdInfo.Parameters.AddWithValue("@blob", JsonConvert.SerializeObject(userInfo)); try { await cmdInfo.ExecuteNonQueryAsync(); Log.Debug("Inserted or updated creator blob: {Username:l}", userInfo.Username); } catch (Exception ex) { Log.Warning(ex, "Failed to update User Info Blob for: {Username:l}", userInfo.Username); } } } public async Task UpdateNonNudeCollectionAsync(Dictionary usersInNonNudeLists) { if (usersInNonNudeLists.Count == 0) return; await using SqliteConnection connection = new($"Data Source={Directory.GetCurrentDirectory()}/users.db"); Log.Debug("Database data source: " + connection.DataSource); foreach ((string username, long userId) in usersInNonNudeLists) { using SqliteCommand cmdInfo = new( "INSERT OR REPLACE INTO user_non_nude (user_id, name) " + "VALUES (@userId, @name);", connection ); cmdInfo.Parameters.AddWithValue("@userId", userId); cmdInfo.Parameters.AddWithValue("@name", username); try { await cmdInfo.ExecuteNonQueryAsync(); Log.Debug("Updating Non-Nude collection with: {Username:l}", username); } catch (Exception ex) { Log.Warning(ex, "Failed to update Non-Nude collection with: {Username:l}", username); } } } }