From d05c196b7cc71cd4ebdddf73be0c51df435d9b76 Mon Sep 17 00:00:00 2001 From: qhy040404 Date: Sun, 16 Jun 2024 19:04:51 +0800 Subject: [PATCH] apply changes --- ...40616104646_UidProfilePicture.Designer.cs} | 58 +++++++++---------- ...cs => 20240616104646_UidProfilePicture.cs} | 11 ++-- .../Migrations/AppDbContextModelSnapshot.cs | 54 ++++++++--------- .../Model/Entity/Database/AppDbContext.cs | 4 +- ...ProfilePicture.cs => UidProfilePicture.cs} | 10 ++-- .../User/IUidProfilePictureDbService.cs | 16 +++++ .../Service/User/IUserGameRoleDbService.cs | 18 ------ .../User/IUserInitializationService.cs | 2 +- .../Snap.Hutao/Service/User/IUserService.cs | 2 +- .../User/UidProfilePictureDbService.cs | 32 ++++++++++ .../Service/User/UserGameRoleDbService.cs | 37 ------------ .../Service/User/UserInitializationService.cs | 26 ++++----- .../Snap.Hutao/Service/User/UserService.cs | 4 +- .../ViewModel/User/UserViewModel.cs | 2 +- 14 files changed, 133 insertions(+), 143 deletions(-) rename src/Snap.Hutao/Snap.Hutao/Migrations/{20240613144942_UserGameRoleProfilePicture.Designer.cs => 20240616104646_UidProfilePicture.Designer.cs} (98%) rename src/Snap.Hutao/Snap.Hutao/Migrations/{20240613144942_UserGameRoleProfilePicture.cs => 20240616104646_UidProfilePicture.cs} (75%) rename src/Snap.Hutao/Snap.Hutao/Model/Entity/{UserGameRoleProfilePicture.cs => UidProfilePicture.cs} (71%) create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/User/IUidProfilePictureDbService.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Service/User/IUserGameRoleDbService.cs create mode 100644 src/Snap.Hutao/Snap.Hutao/Service/User/UidProfilePictureDbService.cs delete mode 100644 src/Snap.Hutao/Snap.Hutao/Service/User/UserGameRoleDbService.cs diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20240613144942_UserGameRoleProfilePicture.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20240616104646_UidProfilePicture.Designer.cs similarity index 98% rename from src/Snap.Hutao/Snap.Hutao/Migrations/20240613144942_UserGameRoleProfilePicture.Designer.cs rename to src/Snap.Hutao/Snap.Hutao/Migrations/20240616104646_UidProfilePicture.Designer.cs index 3e6db24b..26aa2963 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20240613144942_UserGameRoleProfilePicture.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20240616104646_UidProfilePicture.Designer.cs @@ -11,8 +11,8 @@ using Snap.Hutao.Model.Entity.Database; namespace Snap.Hutao.Migrations { [DbContext(typeof(AppDbContext))] - [Migration("20240613144942_UserGameRoleProfilePicture")] - partial class UserGameRoleProfilePicture + [Migration("20240616104646_UidProfilePicture")] + partial class UidProfilePicture { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -469,6 +469,33 @@ namespace Snap.Hutao.Migrations b.ToTable("spiral_abysses"); }); + modelBuilder.Entity("Snap.Hutao.Model.Entity.UidProfilePicture", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AvatarId") + .HasColumnType("INTEGER"); + + b.Property("CostumeId") + .HasColumnType("INTEGER"); + + b.Property("ProfilePictureId") + .HasColumnType("INTEGER"); + + b.Property("RefreshTime") + .HasColumnType("TEXT"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("uid_profile_pictures"); + }); + modelBuilder.Entity("Snap.Hutao.Model.Entity.User", b => { b.Property("InnerId") @@ -518,33 +545,6 @@ namespace Snap.Hutao.Migrations b.ToTable("users"); }); - modelBuilder.Entity("Snap.Hutao.Model.Entity.UserGameRoleProfilePicture", b => - { - b.Property("InnerId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("AvatarId") - .HasColumnType("INTEGER"); - - b.Property("CostumeId") - .HasColumnType("INTEGER"); - - b.Property("LastUpdateTime") - .HasColumnType("TEXT"); - - b.Property("ProfilePictureId") - .HasColumnType("INTEGER"); - - b.Property("Uid") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("InnerId"); - - b.ToTable("profile_pictures"); - }); - modelBuilder.Entity("Snap.Hutao.Model.Entity.Achievement", b => { b.HasOne("Snap.Hutao.Model.Entity.AchievementArchive", "Archive") diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/20240613144942_UserGameRoleProfilePicture.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/20240616104646_UidProfilePicture.cs similarity index 75% rename from src/Snap.Hutao/Snap.Hutao/Migrations/20240613144942_UserGameRoleProfilePicture.cs rename to src/Snap.Hutao/Snap.Hutao/Migrations/20240616104646_UidProfilePicture.cs index 84e5271f..0c323d59 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/20240613144942_UserGameRoleProfilePicture.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/20240616104646_UidProfilePicture.cs @@ -1,4 +1,5 @@ // +using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable @@ -6,13 +7,13 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace Snap.Hutao.Migrations { /// - public partial class UserGameRoleProfilePicture : Migration + public partial class UidProfilePicture : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( - name: "profile_pictures", + name: "uid_profile_pictures", columns: table => new { InnerId = table.Column(type: "TEXT", nullable: false), @@ -20,11 +21,11 @@ namespace Snap.Hutao.Migrations ProfilePictureId = table.Column(type: "INTEGER", nullable: false), AvatarId = table.Column(type: "INTEGER", nullable: false), CostumeId = table.Column(type: "INTEGER", nullable: false), - LastUpdateTime = table.Column(type: "TEXT", nullable: false) + RefreshTime = table.Column(type: "TEXT", nullable: false) }, constraints: table => { - table.PrimaryKey("PK_profile_pictures", x => x.InnerId); + table.PrimaryKey("PK_uid_profile_pictures", x => x.InnerId); }); } @@ -32,7 +33,7 @@ namespace Snap.Hutao.Migrations protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( - name: "profile_pictures"); + name: "uid_profile_pictures"); } } } diff --git a/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs b/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs index 3be71058..03413381 100644 --- a/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs +++ b/src/Snap.Hutao/Snap.Hutao/Migrations/AppDbContextModelSnapshot.cs @@ -466,6 +466,33 @@ namespace Snap.Hutao.Migrations b.ToTable("spiral_abysses"); }); + modelBuilder.Entity("Snap.Hutao.Model.Entity.UidProfilePicture", b => + { + b.Property("InnerId") + .ValueGeneratedOnAdd() + .HasColumnType("TEXT"); + + b.Property("AvatarId") + .HasColumnType("INTEGER"); + + b.Property("CostumeId") + .HasColumnType("INTEGER"); + + b.Property("ProfilePictureId") + .HasColumnType("INTEGER"); + + b.Property("RefreshTime") + .HasColumnType("TEXT"); + + b.Property("Uid") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("InnerId"); + + b.ToTable("uid_profile_pictures"); + }); + modelBuilder.Entity("Snap.Hutao.Model.Entity.User", b => { b.Property("InnerId") @@ -515,33 +542,6 @@ namespace Snap.Hutao.Migrations b.ToTable("users"); }); - modelBuilder.Entity("Snap.Hutao.Model.Entity.UserGameRoleProfilePicture", b => - { - b.Property("InnerId") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("AvatarId") - .HasColumnType("INTEGER"); - - b.Property("CostumeId") - .HasColumnType("INTEGER"); - - b.Property("LastUpdateTime") - .HasColumnType("TEXT"); - - b.Property("ProfilePictureId") - .HasColumnType("INTEGER"); - - b.Property("Uid") - .IsRequired() - .HasColumnType("TEXT"); - - b.HasKey("InnerId"); - - b.ToTable("profile_pictures"); - }); - modelBuilder.Entity("Snap.Hutao.Model.Entity.Achievement", b => { b.HasOne("Snap.Hutao.Model.Entity.AchievementArchive", "Archive") diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs index 8e6f5a16..47cfeb54 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/Database/AppDbContext.cs @@ -25,7 +25,7 @@ internal sealed class AppDbContext : DbContext public AppDbContext(DbContextOptions options) : base(options) { - logger = this.GetService>(); + //logger = this.GetService>(); logger?.LogColorizedInformation("{Name}[{Id}] {Action}", nameof(AppDbContext), (ContextId, ConsoleColor.DarkCyan), ("created", ConsoleColor.Green)); } @@ -65,7 +65,7 @@ internal sealed class AppDbContext : DbContext public DbSet SpiralAbysses { get; set; } = default!; - public DbSet UserGameRoleProfilePictures { get; set; } = default!; + public DbSet UidProfilePictures { get; set; } = default!; public static AppDbContext Create(IServiceProvider serviceProvider, string sqlConnectionString) { diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/UserGameRoleProfilePicture.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/UidProfilePicture.cs similarity index 71% rename from src/Snap.Hutao/Snap.Hutao/Model/Entity/UserGameRoleProfilePicture.cs rename to src/Snap.Hutao/Snap.Hutao/Model/Entity/UidProfilePicture.cs index 21bc9372..729df91c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/UserGameRoleProfilePicture.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/UidProfilePicture.cs @@ -9,9 +9,9 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Snap.Hutao.Model.Entity; -[Table("profile_pictures")] +[Table("uid_profile_pictures")] [SuppressMessage("", "SH002")] -internal sealed class UserGameRoleProfilePicture : IMappingFrom +internal sealed class UidProfilePicture : IMappingFrom { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -25,9 +25,9 @@ internal sealed class UserGameRoleProfilePicture : IMappingFrom +{ + ValueTask SingleUidProfilePictureOrDefaultByUidAsync(string uid, CancellationToken token = default); + + ValueTask UpdateUidProfilePictureAsync(UidProfilePicture profilePicture, CancellationToken token = default); + + ValueTask DeleteUidProfilePictureByUidAsync(string uid, CancellationToken token = default); +} diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/IUserGameRoleDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/IUserGameRoleDbService.cs deleted file mode 100644 index 217af9a2..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/IUserGameRoleDbService.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Snap.Hutao.Model.Entity; -using Snap.Hutao.Service.Abstraction; - -namespace Snap.Hutao.Service.User; - -internal interface IUserGameRoleDbService : IAppDbService -{ - ValueTask ContainsUidAsync(string uid, CancellationToken token = default); - - ValueTask GetUserGameRoleProfilePictureByUidAsync(string uid, CancellationToken token = default); - - ValueTask UpdateUserGameRoleProfilePictureAsync(UserGameRoleProfilePicture profilePicture, CancellationToken token = default); - - ValueTask DeleteUserGameRoleProfilePictureByUidAsync(string uid, CancellationToken token = default); -} diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/IUserInitializationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/IUserInitializationService.cs index 5509609e..edbc98af 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/IUserInitializationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/IUserInitializationService.cs @@ -11,5 +11,5 @@ internal interface IUserInitializationService ValueTask ResumeUserAsync(Model.Entity.User inner, CancellationToken token = default(CancellationToken)); - ValueTask RefreshUserGameRolesProfilePictureAsync(UserGameRole userGameRole, CancellationToken token = default); + ValueTask RefreshUidProfilePictureAsync(UserGameRole userGameRole, CancellationToken token = default); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/IUserService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/IUserService.cs index 08e1fd87..9a11eb7e 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/IUserService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/IUserService.cs @@ -54,5 +54,5 @@ internal interface IUserService /// 任务 ValueTask RemoveUserAsync(BindingUser user); - ValueTask RefreshUserGameRoleProfilePictureAsync(UserGameRole userGameRole); + ValueTask RefreshUidProfilePictureAsync(UserGameRole userGameRole); } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UidProfilePictureDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UidProfilePictureDbService.cs new file mode 100644 index 00000000..5622be01 --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UidProfilePictureDbService.cs @@ -0,0 +1,32 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Microsoft.EntityFrameworkCore; +using Snap.Hutao.Model.Entity; +using Snap.Hutao.Service.Abstraction; + +namespace Snap.Hutao.Service.User; + +[ConstructorGenerated] +[Injection(InjectAs.Singleton, typeof(IUidProfilePictureDbService))] +internal sealed partial class UidProfilePictureDbService : IUidProfilePictureDbService +{ + private readonly IServiceProvider serviceProvider; + + public IServiceProvider ServiceProvider { get => serviceProvider; } + + public ValueTask SingleUidProfilePictureOrDefaultByUidAsync(string uid, CancellationToken token = default) + { + return this.QueryAsync(query => query.SingleOrDefaultAsync(n => n.Uid == uid)); + } + + public async ValueTask UpdateUidProfilePictureAsync(UidProfilePicture profilePicture, CancellationToken token = default) + { + await this.UpdateAsync(profilePicture, token).ConfigureAwait(false); + } + + public async ValueTask DeleteUidProfilePictureByUidAsync(string uid, CancellationToken token = default) + { + await this.DeleteAsync(profilePicture => profilePicture.Uid == uid, token).ConfigureAwait(false); + } +} diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserGameRoleDbService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserGameRoleDbService.cs deleted file mode 100644 index 09ef97f4..00000000 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserGameRoleDbService.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) DGP Studio. All rights reserved. -// Licensed under the MIT license. - -using Microsoft.EntityFrameworkCore; -using Snap.Hutao.Model.Entity; -using Snap.Hutao.Service.Abstraction; - -namespace Snap.Hutao.Service.User; - -[ConstructorGenerated] -[Injection(InjectAs.Singleton, typeof(IUserGameRoleDbService))] -internal sealed partial class UserGameRoleDbService : IUserGameRoleDbService -{ - private readonly IServiceProvider serviceProvider; - - public IServiceProvider ServiceProvider { get => serviceProvider; } - - public ValueTask ContainsUidAsync(string uid, CancellationToken token = default) - { - return this.QueryAsync(query => query.AnyAsync(n => n.Uid == uid)); - } - - public ValueTask GetUserGameRoleProfilePictureByUidAsync(string uid, CancellationToken token = default) - { - return this.QueryAsync(query => query.FirstAsync(n => n.Uid == uid)); - } - - public async ValueTask UpdateUserGameRoleProfilePictureAsync(UserGameRoleProfilePicture profilePicture, CancellationToken token = default) - { - await this.UpdateAsync(profilePicture, token).ConfigureAwait(false); - } - - public async ValueTask DeleteUserGameRoleProfilePictureByUidAsync(string uid, CancellationToken token = default) - { - await this.DeleteAsync(profilePicture => profilePicture.Uid == uid, token).ConfigureAwait(false); - } -} diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserInitializationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserInitializationService.cs index eb2fd95a..e2868bf1 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserInitializationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UserInitializationService.cs @@ -23,7 +23,7 @@ namespace Snap.Hutao.Service.User; internal sealed partial class UserInitializationService : IUserInitializationService { private readonly IUserFingerprintService userFingerprintService; - private readonly IUserGameRoleDbService userGameRoleDbService; + private readonly IUidProfilePictureDbService uidProfilePictureDbService; private readonly IServiceProvider serviceProvider; public async ValueTask ResumeUserAsync(Model.Entity.User inner, CancellationToken token = default) @@ -63,7 +63,7 @@ internal sealed partial class UserInitializationService : IUserInitializationSer } } - public async ValueTask RefreshUserGameRolesProfilePictureAsync(UserGameRole userGameRole, CancellationToken token = default) + public async ValueTask RefreshUidProfilePictureAsync(UserGameRole userGameRole, CancellationToken token = default) { EnkaResponse? enkaResponse; using (IServiceScope scope = serviceProvider.CreateScope()) @@ -78,12 +78,12 @@ internal sealed partial class UserInitializationService : IUserInitializationSer if (enkaResponse is { PlayerInfo: { } playerInfo }) { - UserGameRoleProfilePicture profilePicture = UserGameRoleProfilePicture.From(userGameRole, playerInfo.ProfilePicture); + UidProfilePicture profilePicture = UidProfilePicture.From(userGameRole, playerInfo.ProfilePicture); - await userGameRoleDbService.DeleteUserGameRoleProfilePictureByUidAsync(userGameRole.GameUid, token).ConfigureAwait(false); - await userGameRoleDbService.UpdateUserGameRoleProfilePictureAsync(profilePicture, token).ConfigureAwait(false); + await uidProfilePictureDbService.DeleteUidProfilePictureByUidAsync(userGameRole.GameUid, token).ConfigureAwait(false); + await uidProfilePictureDbService.UpdateUidProfilePictureAsync(profilePicture, token).ConfigureAwait(false); - await SetUserGameRolesProfilePictureCoreAsync(userGameRole, profilePicture, token).ConfigureAwait(false); + await SetUserGameRoleProfilePictureCoreAsync(userGameRole, profilePicture, token).ConfigureAwait(false); } } @@ -255,25 +255,21 @@ internal sealed partial class UserInitializationService : IUserInitializationSer { foreach (UserGameRole userGameRole in user.UserGameRoles) { - if (await userGameRoleDbService.ContainsUidAsync(userGameRole.GameUid, token).ConfigureAwait(false)) + if (await uidProfilePictureDbService.SingleUidProfilePictureOrDefaultByUidAsync(userGameRole.GameUid, token).ConfigureAwait(false) is { } profilePicture) { - UserGameRoleProfilePicture savedProfilePicture = await userGameRoleDbService - .GetUserGameRoleProfilePictureByUidAsync(userGameRole.GameUid, token) - .ConfigureAwait(false); - - if (await SetUserGameRolesProfilePictureCoreAsync(userGameRole, savedProfilePicture, token).ConfigureAwait(false)) + if (await SetUserGameRoleProfilePictureCoreAsync(userGameRole, profilePicture, token).ConfigureAwait(false)) { continue; } } - await RefreshUserGameRolesProfilePictureAsync(userGameRole, token).ConfigureAwait(false); + await RefreshUidProfilePictureAsync(userGameRole, token).ConfigureAwait(false); } } - private async ValueTask SetUserGameRolesProfilePictureCoreAsync(UserGameRole userGameRole, UserGameRoleProfilePicture profilePicture, CancellationToken token = default) + private async ValueTask SetUserGameRoleProfilePictureCoreAsync(UserGameRole userGameRole, UidProfilePicture profilePicture, CancellationToken token = default) { - if (profilePicture.LastUpdateTime.AddDays(15) < DateTimeOffset.Now) + if (profilePicture.RefreshTime.AddDays(15) < DateTimeOffset.Now) { return false; } diff --git a/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs b/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs index 6766ad1e..4daf87ae 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/User/UserService.cs @@ -123,8 +123,8 @@ internal sealed partial class UserService : IUserService, IUserServiceUnsafe return true; } - public async ValueTask RefreshUserGameRoleProfilePictureAsync(UserGameRole userGameRole) + public async ValueTask RefreshUidProfilePictureAsync(UserGameRole userGameRole) { - await userInitializationService.RefreshUserGameRolesProfilePictureAsync(userGameRole).ConfigureAwait(false); + await userInitializationService.RefreshUidProfilePictureAsync(userGameRole).ConfigureAwait(false); } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs index fc8d7b59..33ee5655 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/User/UserViewModel.cs @@ -302,6 +302,6 @@ internal sealed partial class UserViewModel : ObservableObject [Command("RefreshUserGameRoleProfilePictureCommand")] private void RefreshUserGameRoleProfilePicture(UserGameRole userGameRole) { - userService.RefreshUserGameRoleProfilePictureAsync(userGameRole).SafeForget(); + userService.RefreshUidProfilePictureAsync(userGameRole).SafeForget(); } } \ No newline at end of file