From dbee25cbc9695dffc9dc629a6fb72a2099aac7e9 Mon Sep 17 00:00:00 2001 From: NianChen Date: Wed, 19 Oct 2022 16:42:09 +0800 Subject: [PATCH] v0.2 --- AiPrompt/AiPrompt.csproj | 25 ++-- AiPrompt/Data/BaseModel.cs | 14 ++ AiPrompt/Data/Config.cs | 12 ++ AiPrompt/Data/Prompt.cs | 18 ++- AiPrompt/MauiProgram.cs | 7 +- AiPrompt/Pages/CopyComponent.razor | 17 ++- AiPrompt/Pages/ListItemComponent.razor | 4 +- AiPrompt/Pages/PromptList.razor | 9 +- .../Platforms/Windows/Package.appxmanifest | 2 +- AiPrompt/Resources/AppIcon/aiprompt.svg | 8 ++ AiPrompt/Service/IConfigService.cs | 10 ++ AiPrompt/Service/ISourceService.cs | 4 +- AiPrompt/Service/Impl/ConfigService.cs | 44 ++++++ AiPrompt/Service/Impl/PromptService.cs | 3 +- AiPrompt/Service/Impl/SourceService.cs | 131 ++++++++++++------ AiPrompt/Shared/MainLayout.razor | 102 +++++++++++--- AiPrompt/Shared/SourceSelect.razor | 27 ++-- ...0\257\235\347\232\204tag\351\233\206.xlsx" | Bin 63561 -> 0 bytes ...\257\235\347\232\204tag\351\233\2062.xlsx" | Bin 8458 -> 0 bytes AiPrompt/Util/Db.cs | 33 +++++ AiPrompt/Util/DbConstants.cs | 18 +++ AiPrompt/{Service => Util}/StateContainer.cs | 15 +- AiPrompt/wwwroot/favicon.ico | Bin 5430 -> 2641 bytes AiPrompt/wwwroot/index.html | 2 - 24 files changed, 393 insertions(+), 112 deletions(-) create mode 100644 AiPrompt/Data/BaseModel.cs create mode 100644 AiPrompt/Data/Config.cs create mode 100644 AiPrompt/Resources/AppIcon/aiprompt.svg create mode 100644 AiPrompt/Service/IConfigService.cs create mode 100644 AiPrompt/Service/Impl/ConfigService.cs delete mode 100644 "AiPrompt/Sources/\350\265\233\345\215\232\350\220\250\346\273\241\345\277\205\344\277\256\357\274\232\344\270\216AI\345\257\271\350\257\235\347\232\204tag\351\233\206.xlsx" delete mode 100644 "AiPrompt/Sources/\350\265\233\345\215\232\350\220\250\346\273\241\345\277\205\344\277\256\357\274\232\344\270\216AI\345\257\271\350\257\235\347\232\204tag\351\233\2062.xlsx" create mode 100644 AiPrompt/Util/Db.cs create mode 100644 AiPrompt/Util/DbConstants.cs rename AiPrompt/{Service => Util}/StateContainer.cs (58%) diff --git a/AiPrompt/AiPrompt.csproj b/AiPrompt/AiPrompt.csproj index 64598ca..67410eb 100644 --- a/AiPrompt/AiPrompt.csproj +++ b/AiPrompt/AiPrompt.csproj @@ -16,7 +16,7 @@ AiPrompt - com.companyname.aiprompt + com.xueque.aiprompt 5FBB22BC-690D-4055-91AE-385FF906F628 @@ -30,34 +30,41 @@ 10.0.17763.0 6.5 10 + False + True + EA74CA5ABC054780009410D9CBCB64B048E72F85 + SHA256 + False + False + True + 0 - + - + + - + - - - - - + + + diff --git a/AiPrompt/Data/BaseModel.cs b/AiPrompt/Data/BaseModel.cs new file mode 100644 index 0000000..f8d4566 --- /dev/null +++ b/AiPrompt/Data/BaseModel.cs @@ -0,0 +1,14 @@ +using SQLite; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AiPrompt.Data; + +public class BaseModel +{ + [PrimaryKey] + public string Id { get; set; } +} diff --git a/AiPrompt/Data/Config.cs b/AiPrompt/Data/Config.cs new file mode 100644 index 0000000..5867eb8 --- /dev/null +++ b/AiPrompt/Data/Config.cs @@ -0,0 +1,12 @@ +using SQLite; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AiPrompt.Data; + +public class Config:BaseModel{ + public string SourcePath { get; set; } +} diff --git a/AiPrompt/Data/Prompt.cs b/AiPrompt/Data/Prompt.cs index 85eff56..144739e 100644 --- a/AiPrompt/Data/Prompt.cs +++ b/AiPrompt/Data/Prompt.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -11,8 +12,23 @@ namespace AiPrompt.Data; public class Prompt{ public string Key { get; set; } public string Name { get; set; } - public string Image { get; set; } + + private string image; + public string Image { get=> image; set{ + image = LocalFile2Base64(value); + }} + + private string LocalFile2Base64(string value) + { + if (!File.Exists(value)){ + return value; + } + string base64 = $"data:image/png;base64,{Convert.ToBase64String(File.ReadAllBytes(value))}"; + return base64; + } + public bool Active { get; set; } + } diff --git a/AiPrompt/MauiProgram.cs b/AiPrompt/MauiProgram.cs index 584c388..0be68b7 100644 --- a/AiPrompt/MauiProgram.cs +++ b/AiPrompt/MauiProgram.cs @@ -1,6 +1,6 @@ using AiPrompt.Service; using AiPrompt.Service.Impl; -using Microsoft.AspNetCore.Components.WebView.Maui; +using AiPrompt.Util; namespace AiPrompt; @@ -27,9 +27,10 @@ public static MauiApp CreateMauiApp() options.Primary = "#7160E8"; }); }); - - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); return builder.Build(); diff --git a/AiPrompt/Pages/CopyComponent.razor b/AiPrompt/Pages/CopyComponent.razor index 09180b0..baad093 100644 --- a/AiPrompt/Pages/CopyComponent.razor +++ b/AiPrompt/Pages/CopyComponent.razor @@ -1,6 +1,6 @@  - mdi-note-multiple-outline @@ -12,16 +12,23 @@ 已复制到剪切板 - - Close + 关闭 @code { + private string text; [Parameter] - public string Text { get; set; } + public string Text { get{ + if (!text.EndsWith(",")) + { + return $"{text},"; + } + return text; + } set=>text=value; } private bool open = false; } diff --git a/AiPrompt/Pages/ListItemComponent.razor b/AiPrompt/Pages/ListItemComponent.razor index a9f9627..ef303ff 100644 --- a/AiPrompt/Pages/ListItemComponent.razor +++ b/AiPrompt/Pages/ListItemComponent.razor @@ -1,4 +1,5 @@ @using AiPrompt.Data +@using System.Net @Prompt.Name @@ -17,5 +18,6 @@ public EventCallback PromptChanged { get; set; } + private string defaultImage = "data:image/png;base64,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"; -} +} \ No newline at end of file diff --git a/AiPrompt/Pages/PromptList.razor b/AiPrompt/Pages/PromptList.razor index b55f770..373c7c6 100644 --- a/AiPrompt/Pages/PromptList.razor +++ b/AiPrompt/Pages/PromptList.razor @@ -1,15 +1,14 @@ @page "/{Key}" @using AiPrompt.Data @using AiPrompt.Service +@using AiPrompt.Util @inject StateContainer stateContainer @inject IPromptService promptService @implements IDisposable - - - - - + + + diff --git a/AiPrompt/Platforms/Windows/Package.appxmanifest b/AiPrompt/Platforms/Windows/Package.appxmanifest index 2bcb11e..7e50e9f 100644 --- a/AiPrompt/Platforms/Windows/Package.appxmanifest +++ b/AiPrompt/Platforms/Windows/Package.appxmanifest @@ -5,7 +5,7 @@ xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap rescap"> - + $placeholder$ diff --git a/AiPrompt/Resources/AppIcon/aiprompt.svg b/AiPrompt/Resources/AppIcon/aiprompt.svg new file mode 100644 index 0000000..8f84506 --- /dev/null +++ b/AiPrompt/Resources/AppIcon/aiprompt.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/AiPrompt/Service/IConfigService.cs b/AiPrompt/Service/IConfigService.cs new file mode 100644 index 0000000..d1abdd8 --- /dev/null +++ b/AiPrompt/Service/IConfigService.cs @@ -0,0 +1,10 @@ +using AiPrompt.Data; + +namespace AiPrompt.Service; + +public interface IConfigService +{ + public Task SaveConfig(Config config); + public Task GetConfig(); + +} diff --git a/AiPrompt/Service/ISourceService.cs b/AiPrompt/Service/ISourceService.cs index 0d93e6c..933ea34 100644 --- a/AiPrompt/Service/ISourceService.cs +++ b/AiPrompt/Service/ISourceService.cs @@ -19,7 +19,9 @@ public interface ISourceService{ public Task> ReadCategoriesAsync(); - public Task> AllSourceAsync(); + public Task> AllSourceAsync(); + + public Task GetSourcePathAsync(); public IEnumerable ReadPrefabPrompts(string key); public Task> ReadPrefabPromptsAsync(string key); diff --git a/AiPrompt/Service/Impl/ConfigService.cs b/AiPrompt/Service/Impl/ConfigService.cs new file mode 100644 index 0000000..d3e17bc --- /dev/null +++ b/AiPrompt/Service/Impl/ConfigService.cs @@ -0,0 +1,44 @@ +using AiPrompt.Data; +using AiPrompt.Util; + +namespace AiPrompt.Service.Impl; + +public class ConfigService : IConfigService{ + public ConfigService(Db db) + { + this.db = db; + } + private readonly Db db; + + private string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.json"); + + + public async Task SaveConfig(Config config) + { + config.Id = nameof(config); + await db.SaveAsync(config); + //using(var fs = new FileStream(path, FileMode.Create, FileAccess.Write)) + //{ + // try + // { + // await JsonSerializer.SerializeAsync(fs, config,new JsonSerializerOptions(){ WriteIndented = true }); + // } + // catch { } + //} + } + + public async Task GetConfig() + { + return await db.GetAsync(); + //using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) + //{ + // try + // { + // var config = await JsonSerializer.DeserializeAsync(fs); + // return config; + // } + // catch { return null; } + + //} + } +} diff --git a/AiPrompt/Service/Impl/PromptService.cs b/AiPrompt/Service/Impl/PromptService.cs index 2ac2291..a46e53f 100644 --- a/AiPrompt/Service/Impl/PromptService.cs +++ b/AiPrompt/Service/Impl/PromptService.cs @@ -1,6 +1,5 @@ using AiPrompt.Data; -using OfficeOpenXml; -using System.Linq; +using AiPrompt.Util; namespace AiPrompt.Service.Impl; diff --git a/AiPrompt/Service/Impl/SourceService.cs b/AiPrompt/Service/Impl/SourceService.cs index a2684bb..58a1579 100644 --- a/AiPrompt/Service/Impl/SourceService.cs +++ b/AiPrompt/Service/Impl/SourceService.cs @@ -1,15 +1,17 @@ using AiPrompt.Data; +using AiPrompt.Util; using OfficeOpenXml; -using OneOf.Types; namespace AiPrompt.Service.Impl; internal class SourceService : ISourceService{ - public SourceService(StateContainer stateContainer){ + public SourceService(StateContainer stateContainer,IConfigService configService){ this.stateContainer = stateContainer; + this.configService = configService; } private readonly StateContainer stateContainer; + private readonly IConfigService configService; /// /// 获取目录下所有文件 @@ -18,16 +20,25 @@ public SourceService(StateContainer stateContainer){ /// /// private async Task FillDirectoryAllSource(string dir, List list){ + if (dir is null) return; await Task.Run(async () =>{ DirectoryInfo d = new (dir); - FileInfo[] files = d.GetFiles();//文件 - DirectoryInfo[] directs = d.GetDirectories();//文件夹 - foreach (FileInfo f in files){ - list.Add(new(f.Name, f.FullName));//添加文件名到列表中 - } - //获取子文件夹内的文件列表,递归遍历 - foreach (DirectoryInfo dd in directs){ - await FillDirectoryAllSource(dd.FullName, list); + if (d.Exists) + { + FileInfo[] files = d.GetFiles();//文件 + DirectoryInfo[] directs = d.GetDirectories();//文件夹 + foreach (FileInfo f in files) + { + if (f.Extension is ".xlsx" or ".xls") + { + list.Add(new(f.Name, f.FullName));//添加文件名到列表中 + } + } + //获取子文件夹内的文件列表,递归遍历 + foreach (DirectoryInfo dd in directs) + { + await FillDirectoryAllSource(dd.FullName, list); + } } }); } @@ -35,12 +46,17 @@ await Task.Run(async () =>{ /// 获取所有咒语书 /// /// - public async Task> AllSourceAsync(){ + public async Task> AllSourceAsync(){ List sources = new (); - var path = Path.Combine(AppContext.BaseDirectory,"Sources"); + var path = await GetSourcePathAsync(); await FillDirectoryAllSource(path, sources); return sources; } + + public async Task GetSourcePathAsync(){ + Config config = await configService.GetConfig(); + return config?.SourcePath; + } /// /// 读取咒语 /// @@ -49,25 +65,35 @@ public async Task> AllSourceAsync(){ public IEnumerable ReadPrompts(string categoryKey){ ExcelPackage.LicenseContext = LicenseContext.NonCommercial; List list = new (); - using (ExcelPackage excelPackage = new (stateContainer.Source?.Path)){ - try{ - ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[0]; - for (int i = 1; i <= excelWorksheet.Dimension?.End.Column; i++){ - if (i % 3 == 1){ - string category = excelWorksheet.Cells[1, i].GetCellValue(); - if (category.Equals(categoryKey)){ - for (int j = 2; j <= excelWorksheet.Dimension?.End.Row; j++){ - string key = excelWorksheet.Cells[j, i].GetCellValue(); - if (string.IsNullOrEmpty(key)) break; - string name = excelWorksheet.Cells[j, i + 1].GetCellValue(); - string image = excelWorksheet.Cells[j, i + 2].GetCellValue(); - list.Add(new () { Name = name, Key = key, Image = image }); + if (stateContainer.Source is not null) + { + using (ExcelPackage excelPackage = new(stateContainer.Source.Path)) + { + try + { + ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[0]; + for (int i = 1; i <= excelWorksheet.Dimension?.End.Column; i++) + { + if (i % 3 == 1) + { + string category = excelWorksheet.Cells[1, i].GetCellValue(); + if (category.Equals(categoryKey)) + { + for (int j = 2; j <= excelWorksheet.Dimension?.End.Row; j++) + { + string key = excelWorksheet.Cells[j, i].GetCellValue(); + if (string.IsNullOrEmpty(key)) break; + string name = excelWorksheet.Cells[j, i + 1].GetCellValue(); + string image = excelWorksheet.Cells[j, i + 2].GetCellValue(); + list.Add(new() { Name = name, Key = key, Image = image }); + } + break; } - break; } } } - }catch{ } + catch { } + } } return list; } @@ -88,16 +114,24 @@ public async Task> ReadCategoriesAsync(){ public IEnumerable ReadCategories(){ ExcelPackage.LicenseContext = LicenseContext.NonCommercial; List list = new (); - using (ExcelPackage excelPackage = new (stateContainer.Source?.Path)){ - try{ - ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[0]; - for (int i = 1; i <= excelWorksheet.Dimension?.End.Column; i++){ - if (i % 3 == 1){ - string key = excelWorksheet.Cells[1, i].GetCellValue(); - list.Add(new () { Name = key, Key = key }); + if (stateContainer.Source is not null) + { + using (ExcelPackage excelPackage = new(stateContainer.Source.Path)) + { + try + { + ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[0]; + for (int i = 1; i <= excelWorksheet.Dimension?.End.Column; i++) + { + if (i % 3 == 1) + { + string key = excelWorksheet.Cells[1, i].GetCellValue(); + list.Add(new() { Name = key, Key = key }); + } } } - }catch{ } + catch { } + } } return list; } @@ -113,16 +147,23 @@ public void SetSource(Source source){ public IEnumerable ReadPrefabPrompts(string key){ ExcelPackage.LicenseContext = LicenseContext.NonCommercial; List list = new (); - using (ExcelPackage excelPackage = new (stateContainer.Source?.Path)){ - try { - ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[1]; - for (int i = 1; i <= excelWorksheet?.Dimension?.End.Row; i++){ - string prompts = excelWorksheet.Cells[i, 1].GetCellValue(); - string name = excelWorksheet.Cells[i, 2].GetCellValue(); - string image = excelWorksheet.Cells[i, 3].GetCellValue(); - list.Add(new () { Name = name, Key = prompts, Image = image }); + if (stateContainer.Source is not null) + { + using (ExcelPackage excelPackage = new(stateContainer.Source.Path)) + { + try + { + ExcelWorksheet excelWorksheet = excelPackage.Workbook.Worksheets[1]; + for (int i = 1; i <= excelWorksheet.Dimension?.End.Row; i++) + { + string prompts = excelWorksheet.Cells[i, 1].GetCellValue(); + string name = excelWorksheet.Cells[i, 2].GetCellValue(); + string image = excelWorksheet.Cells[i, 3].GetCellValue(); + list.Add(new() { Name = name, Key = prompts, Image = image }); + } } - }catch{ } + catch { } + } } return list; } @@ -130,4 +171,6 @@ public IEnumerable ReadPrefabPrompts(string key){ public async Task> ReadPrefabPromptsAsync(string key){ return await Task.Run(() => { return ReadPrefabPrompts(key); }); } + + } diff --git a/AiPrompt/Shared/MainLayout.razor b/AiPrompt/Shared/MainLayout.razor index 1b21df8..1f5112a 100644 --- a/AiPrompt/Shared/MainLayout.razor +++ b/AiPrompt/Shared/MainLayout.razor @@ -1,15 +1,19 @@ @using AiPrompt.Data @using AiPrompt.Service +@using AiPrompt.Util @using BlazorComponent @inherits LayoutComponentBase + @inject IPromptService promptService +@inject ISourceService sourceService +@inject IConfigService configService @inject NavigationManager navigationManager @inject StateContainer stateContainer @implements IDisposable - +

AI-Prompt

@@ -36,44 +40,104 @@ - - mdi-magnify - + + + + mdi-cog + + + + + + 设置 + + + + + + + + + + (((((pussy)))))!!! + + + + + 关闭 + + + 保存 + + + + + - - - - @Body - - - + + @Body +
+ @code { private bool drawer = false; + private bool setting = false; + + private Config Config { get; set; } = new(); + private List Sources { get; set; } = new(); + private IEnumerable promps = new List(); + private StringNumber selected = 0; - public string QueryString { get; set; } - void Query(){ - stateContainer.Query = QueryString; + private string queryString; + public string QueryString{ + get => queryString; + set { + queryString = value; + stateContainer.Query = value; + } } - IEnumerable promps = new List(); + async void OpenSetting(){ + Config.SourcePath = await sourceService.GetSourcePathAsync(); + setting = !setting; + StateHasChanged(); + } + async void SaveSetting (){ + await configService.SaveConfig(Config); + Sources = await sourceService.AllSourceAsync(); + setting = false; + StateHasChanged(); + } //切换咒语书时拉取分类 - protected async void OnSourceChanged(){ + async void OnSourceChanged(){ promps = await promptService.CategoriesAsync(); StateHasChanged(); } - protected override void OnInitialized(){ + protected override async Task OnInitializedAsync() + { + Config.SourcePath = await sourceService.GetSourcePathAsync(); + Sources = await sourceService.AllSourceAsync(); + } + + protected override void OnInitialized() + { stateContainer.OnSourceChanged += OnSourceChanged; navigationManager.NavigateTo("prefab"); } @@ -81,6 +145,4 @@ public void Dispose(){ stateContainer.OnSourceChanged -= OnSourceChanged; } - - } \ No newline at end of file diff --git a/AiPrompt/Shared/SourceSelect.razor b/AiPrompt/Shared/SourceSelect.razor index 9188c24..69b0ab2 100644 --- a/AiPrompt/Shared/SourceSelect.razor +++ b/AiPrompt/Shared/SourceSelect.razor @@ -7,15 +7,16 @@ @bind-Value="Selected" ItemText="u => u.Name" ItemValue="u => u" - Label="Source"> + Label="咒语书"> @data.Item.Name - + @code { - List Sources{ get; set; } + [Parameter] + public List Sources { get; set; } = new(); private Source selected; public Source Selected @@ -26,11 +27,21 @@ sourceService.SetSource(value); } } - protected override async Task OnInitializedAsync(){ - IEnumerable sources = await sourceService.AllSourceAsync(); - Sources = sources.ToList(); - Selected = Sources?[0]; - } + void SetDefault(){ + if (Sources?.Count > 0) + { + Selected = Sources[0]; + } + } + protected override Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + { + SetDefault(); + } + return base.OnAfterRenderAsync(firstRender); + } + } diff --git "a/AiPrompt/Sources/\350\265\233\345\215\232\350\220\250\346\273\241\345\277\205\344\277\256\357\274\232\344\270\216AI\345\257\271\350\257\235\347\232\204tag\351\233\206.xlsx" "b/AiPrompt/Sources/\350\265\233\345\215\232\350\220\250\346\273\241\345\277\205\344\277\256\357\274\232\344\270\216AI\345\257\271\350\257\235\347\232\204tag\351\233\206.xlsx" deleted file mode 100644 index a9ce584163f1f2ae99c8ef6602a501eedcdbb491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63561 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%0Dus>H?zl8WE+@2k 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 diff --git a/AiPrompt/Util/Db.cs b/AiPrompt/Util/Db.cs new file mode 100644 index 0000000..64bbe6d --- /dev/null +++ b/AiPrompt/Util/Db.cs @@ -0,0 +1,33 @@ +using AiPrompt.Data; +using SQLite; + +namespace AiPrompt.Util; + +public class Db +{ + private SQLiteAsyncConnection Database; + async Task Init() + { + if (Database is not null) + return; + + Database = new SQLiteAsyncConnection(DbConstants.DatabasePath, DbConstants.Flags); + var result = await Database.CreateTableAsync(); + } + + public async Task GetAsync() where T : BaseModel, new() + { + await Init(); + return await Database.Table().FirstOrDefaultAsync(); + } + + public async Task SaveAsync(T t) where T : BaseModel,new() + { + await Init(); + var exsist = await Database.Table().FirstOrDefaultAsync(); + if (string.Equals(t?.Id,exsist?.Id)) + return await Database.UpdateAsync(t); + else + return await Database.InsertAsync(t); + } +} diff --git a/AiPrompt/Util/DbConstants.cs b/AiPrompt/Util/DbConstants.cs new file mode 100644 index 0000000..503f019 --- /dev/null +++ b/AiPrompt/Util/DbConstants.cs @@ -0,0 +1,18 @@ + +namespace AiPrompt.Util; + +public static class DbConstants +{ + public const string DatabaseFilename = "AiPrompt.db3"; + + public const SQLite.SQLiteOpenFlags Flags = + // open the database in read/write mode + SQLite.SQLiteOpenFlags.ReadWrite | + // create the database if it doesn't exist + SQLite.SQLiteOpenFlags.Create | + // enable multi-threaded database access + SQLite.SQLiteOpenFlags.SharedCache; + + public static string DatabasePath => + Path.Combine(FileSystem.AppDataDirectory, DatabaseFilename); +} \ No newline at end of file diff --git a/AiPrompt/Service/StateContainer.cs b/AiPrompt/Util/StateContainer.cs similarity index 58% rename from AiPrompt/Service/StateContainer.cs rename to AiPrompt/Util/StateContainer.cs index b26c89a..bd633e0 100644 --- a/AiPrompt/Service/StateContainer.cs +++ b/AiPrompt/Util/StateContainer.cs @@ -1,15 +1,10 @@ using AiPrompt.Data; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -namespace AiPrompt.Service; +namespace AiPrompt.Util; public class StateContainer { - private string? query; + private string query; public string Query { @@ -20,10 +15,10 @@ public string Query OnQueryChanged?.Invoke(); } } - public event Action? OnQueryChanged; + public event Action OnQueryChanged; - private Source? source; + private Source source; public Source Source { get => source; @@ -33,6 +28,6 @@ public Source Source OnSourceChanged?.Invoke(); } } - public event Action? OnSourceChanged; + public event Action OnSourceChanged; } \ No newline at end of file diff --git a/AiPrompt/wwwroot/favicon.ico b/AiPrompt/wwwroot/favicon.ico index 63e859b476eff5055e0e557aaa151ca8223fbeef..a4b7a41a84a4af4187f234a3a3df26206dc817c3 100644 GIT binary patch literal 2641 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 Q%f)nC9#fi`7PLG3cVDi({Qv*} literal 5430 zcmc&&Yj2xp8Fqnv;>&(QB_ve7>^E#o2mu=cO~A%R>DU-_hfbSRv1t;m7zJ_AMrntN zy0+^f&8be>q&YYzH%(88lQ?#KwiCzaCO*ZEo%j&v;<}&Lj_stKTKK>#U3nin@AF>w zb3ONSAFR{u(S1d?cdw53y}Gt1b-Hirbh;;bm(Rcbnoc*%@jiaXM|4jU^1WO~`TYZ~ zC-~jh9~b-f?fX`DmwvcguQzn*uV}c^Vd&~?H|RUs4Epv~gTAfR(B0lT&?RWQOtduM z^1vUD9{HQsW!{a9|0crA34m7Z6lpG^}f6f?={zD+ zXAzk^i^aKN_}s2$eX81wjSMONE#WVdzf|MT)Ap*}Vsn!XbvsI#6o&ij{87^d%$|A{ z=F{KB%)g%@z76yBzbb7seW**Ju8r4e*Z3PWNX3_tTDgzZatz7)Q6ytwB%@&@A|XT; zecM`Snxx5po$C)%yCP!KEtos~eOS)@2=kX-RIm)4glMCoagTEFxrBeSX%Euz734Fk z%7)x(k~T!@Hbg_37NSQL!vlTBXoURSzt~I**Zw`&F24fH*&kx=%nvZv|49SC*daD( zIw<~%#=lk8{2-l(BcIjy^Q$Q&m#KlWL9?UG{b8@qhlD z;umc+6p%|NsAT~0@DgV4-NKgQuWPWrmPIK&&XhV&n%`{l zOl^bbWYjQNuVXTXESO)@|iUKVmErPUDfz2Wh`4dF@OFiaCW|d`3paV^@|r^8T_ZxM)Z+$p5qx# z#K=z@%;aBPO=C4JNNGqVv6@UGolIz;KZsAro``Rz8X%vq_gpi^qEV&evgHb_=Y9-l z`)imdx0UC>GWZYj)3+3aKh?zVb}=@%oNzg7a8%kfVl)SV-Amp1Okw&+hEZ3|v(k8vRjXW9?ih`&FFM zV$~{j3IzhtcXk?Mu_!12;=+I7XK-IR2>Yd%VB^?oI9c^E&Chb&&je$NV0P-R;ujkP z;cbLCCPEF6|22NDj=S`F^2e~XwT1ZnRX8ra0#DaFa9-X|8(xNW_+JhD75WnSd7cxo z2>I_J5{c|WPfrgl7E2R)^c}F7ry()Z>$Jhk9CzZxiPKL#_0%`&{MX>P_%b~Dx0D^S z7xP1(DQ!d_Icpk!RN3I1w@~|O1ru#CO==h#9M~S4Chx*@?=EKUPGBv$tmU+7Zs_al z`!jR?6T&Z7(%uVq>#yLu`abWk!FBlnY{RFNHlj~6zh*;@u}+}viRKsD`IIxN#R-X3 z@vxu#EA_m}I503U(8Qmx^}u;)KfGP`O9E1H1Q|xeeksX8jC%@!{YT1)!lWgO=+Y3*jr=iSxvOW1}^HSy=y){tOMQJ@an>sOl4FYniE z;GOxd7AqxZNbYFNqobpv&HVO$c-w!Y*6r;$2oJ~h(a#(Bp<-)dg*mNigX~9rPqcHv z^;c*|Md?tD)$y?6FO$DWl$jUGV`F1G_^E&E>sY*YnA~ruv3=z9F8&&~Xpm<<75?N3 z>x~`I&M9q)O1=zWZHN9hZWx>RQ}zLP+iL57Q)%&_^$Sme^^G7;e-P~CR?kqU#Io#( z(nH1Wn*Ig)|M>WLGrxoU?FZrS`4GO&w;+39A3f8w{{Q7eg|$+dIlNFPAe+tN=FOYU z{A&Fg|H73+w1IK(W=j*L>JQgz$g0 z7JpKXLHIh}#$wm|N`s}o-@|L_`>*(gTQ~)wr3Eap7g%PVNisKw82im;Gdv#85x#s+ zoqqtnwu4ycd>cOQgRh-=aEJbnvVK`}ja%+FZx}&ehtX)n(9nVfe4{mn0bgijUbNr7Tf5X^$*{qh2%`?--%+sbSrjE^;1e3>% zqa%jdY16{Y)a1hSy*mr0JGU05Z%=qlx5vGvTjSpTt6k%nR06q}1DU`SQh_ZAeJ}A@`hL~xvv05U?0%=spP`R>dk?cOWM9^KNb7B?xjex>OZo%JMQQ1Q zB|q@}8RiP@DWn-(fB;phPaIOP2Yp)XN3-Fsn)S3w($4&+p8f5W_f%gac}QvmkHfCj$2=!t`boCvQ zCW;&Dto=f8v##}dy^wg3VNaBy&kCe3N;1|@n@pUaMPT?(aJ9b*(gJ28$}(2qFt$H~u5z94xcIQkcOI++)*exzbrk?WOOOf*|%k5#KV zL=&ky3)Eirv$wbRJ2F2s_ILQY--D~~7>^f}W|Aw^e7inXr#WLI{@h`0|jHud2Y~cI~Yn{r_kU^Vo{1gja AiPrompt - -