Compare commits
	
		
			2 Commits
		
	
	
		
			8e6e3e6289
			...
			7383a5cff8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 7383a5cff8 | |||
| 49fe70b0aa | 
| @@ -38,7 +38,7 @@ public class AccountCurrentController( | |||||||
|             .Include(e => e.Profile) |             .Include(e => e.Profile) | ||||||
|             .Where(e => e.Id == userId) |             .Where(e => e.Id == userId) | ||||||
|             .FirstOrDefaultAsync(); |             .FirstOrDefaultAsync(); | ||||||
|          |  | ||||||
|         var perk = await subscriptions.GetPerkSubscriptionAsync(account!.Id); |         var perk = await subscriptions.GetPerkSubscriptionAsync(account!.Id); | ||||||
|         account.PerkSubscription = perk?.ToReference(); |         account.PerkSubscription = perk?.ToReference(); | ||||||
|  |  | ||||||
| @@ -120,6 +120,7 @@ public class AccountCurrentController( | |||||||
|             ); |             ); | ||||||
|             profile.Picture = CloudFileReferenceObject.FromProtoValue(file); |             profile.Picture = CloudFileReferenceObject.FromProtoValue(file); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (request.BackgroundId is not null) |         if (request.BackgroundId is not null) | ||||||
|         { |         { | ||||||
|             var file = await files.GetFileAsync(new GetFileRequest { Id = request.BackgroundId }); |             var file = await files.GetFileAsync(new GetFileRequest { Id = request.BackgroundId }); | ||||||
| @@ -255,13 +256,27 @@ public class AccountCurrentController( | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     [HttpPost("check-in")] |     [HttpPost("check-in")] | ||||||
|     public async Task<ActionResult<CheckInResult>> DoCheckIn([FromBody] string? captchaToken) |     public async Task<ActionResult<CheckInResult>> DoCheckIn( | ||||||
|  |         [FromBody] string? captchaToken, | ||||||
|  |         [FromQuery] Instant? backdated = null | ||||||
|  |     ) | ||||||
|     { |     { | ||||||
|         if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); |         if (HttpContext.Items["CurrentUser"] is not Account currentUser) return Unauthorized(); | ||||||
|  |  | ||||||
|         var isAvailable = await events.CheckInDailyIsAvailable(currentUser); |         if (backdated is null) | ||||||
|         if (!isAvailable) |         { | ||||||
|             return BadRequest("Check-in is not available for today."); |             var isAvailable = await events.CheckInDailyIsAvailable(currentUser); | ||||||
|  |             if (!isAvailable) | ||||||
|  |                 return BadRequest("Check-in is not available for today."); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |         { | ||||||
|  |             if (currentUser.PerkSubscription is null) | ||||||
|  |                 return StatusCode(403, "You need to have a subscription to check-in backdated."); | ||||||
|  |             var isAvailable = await events.CheckInBackdatedIsAvailable(currentUser, backdated.Value); | ||||||
|  |             if (!isAvailable) | ||||||
|  |                 return BadRequest("Check-in is not available for this date."); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         try |         try | ||||||
|         { |         { | ||||||
| @@ -269,9 +284,10 @@ public class AccountCurrentController( | |||||||
|             return needsCaptcha switch |             return needsCaptcha switch | ||||||
|             { |             { | ||||||
|                 true when string.IsNullOrWhiteSpace(captchaToken) => StatusCode(423, |                 true when string.IsNullOrWhiteSpace(captchaToken) => StatusCode(423, | ||||||
|                     "Captcha is required for this check-in."), |                     "Captcha is required for this check-in." | ||||||
|  |                 ), | ||||||
|                 true when !await auth.ValidateCaptcha(captchaToken!) => BadRequest("Invalid captcha token."), |                 true when !await auth.ValidateCaptcha(captchaToken!) => BadRequest("Invalid captcha token."), | ||||||
|                 _ => await events.CheckInDaily(currentUser) |                 _ => await events.CheckInDaily(currentUser, backdated) | ||||||
|             }; |             }; | ||||||
|         } |         } | ||||||
|         catch (InvalidOperationException ex) |         catch (InvalidOperationException ex) | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ using DysonNetwork.Shared.Proto; | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.Extensions.Localization; | using Microsoft.Extensions.Localization; | ||||||
| using NodaTime; | using NodaTime; | ||||||
|  | using NodaTime.Extensions; | ||||||
|  |  | ||||||
| namespace DysonNetwork.Pass.Account; | namespace DysonNetwork.Pass.Account; | ||||||
|  |  | ||||||
| @@ -166,7 +167,7 @@ public class AccountEventService( | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     private const int FortuneTipCount = 14; // This will be the max index for each type (positive/negative) |     private const int FortuneTipCount = 14; // This will be the max index for each type (positive/negative) | ||||||
|     private const string CaptchaCacheKey = "CheckInCaptcha_"; |     private const string CaptchaCacheKey = "checkin:captcha:"; | ||||||
|     private const int CaptchaProbabilityPercent = 20; |     private const int CaptchaProbabilityPercent = 20; | ||||||
|  |  | ||||||
|     public async Task<bool> CheckInDailyDoAskCaptcha(Account user) |     public async Task<bool> CheckInDailyDoAskCaptcha(Account user) | ||||||
| @@ -198,9 +199,55 @@ public class AccountEventService( | |||||||
|         return lastDate < currentDate; |         return lastDate < currentDate; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     public const string CheckInLockKey = "CheckInLock_"; |     public async Task<bool> CheckInBackdatedIsAvailable(Account user, Instant backdated) | ||||||
|  |     { | ||||||
|  |         var aDay = Duration.FromDays(1); | ||||||
|  |         var backdatedStart = backdated.ToDateTimeUtc().Date.ToInstant(); | ||||||
|  |         var backdatedEnd = backdated.Plus(aDay).ToDateTimeUtc().Date.ToInstant(); | ||||||
|  |  | ||||||
|     public async Task<CheckInResult> CheckInDaily(Account user) |         var backdatedDate = backdated.ToDateTimeUtc(); | ||||||
|  |         var backdatedMonthStart = new DateTime( | ||||||
|  |             backdatedDate.Year, | ||||||
|  |             backdatedDate.Month, | ||||||
|  |             1, | ||||||
|  |             0, | ||||||
|  |             0, | ||||||
|  |             0 | ||||||
|  |         ).ToInstant(); | ||||||
|  |         var backdatedMonthEnd = | ||||||
|  |             new DateTime( | ||||||
|  |                 backdatedDate.Year, | ||||||
|  |                 backdatedDate.Month, | ||||||
|  |                 DateTime.DaysInMonth( | ||||||
|  |                     backdatedDate.Year, | ||||||
|  |                     backdatedDate.Month | ||||||
|  |                 ), | ||||||
|  |                 23, | ||||||
|  |                 59, | ||||||
|  |                 59 | ||||||
|  |             ).ToInstant(); | ||||||
|  |  | ||||||
|  |         // The first check, if that day already has a check-in | ||||||
|  |         var lastCheckIn = await db.AccountCheckInResults | ||||||
|  |             .Where(x => x.AccountId == user.Id) | ||||||
|  |             .Where(x => x.CreatedAt >= backdatedStart && x.CreatedAt < backdatedEnd) | ||||||
|  |             .OrderByDescending(x => x.CreatedAt) | ||||||
|  |             .FirstOrDefaultAsync(); | ||||||
|  |         if (lastCheckIn is not null) return false; | ||||||
|  |  | ||||||
|  |         // The second check, is the user reached the max backdated check-ins limit, | ||||||
|  |         // which is once a week, which is 4 times a month | ||||||
|  |         var backdatedCheckInMonths = await db.AccountCheckInResults | ||||||
|  |             .Where(x => x.AccountId == user.Id) | ||||||
|  |             .Where(x => x.CreatedAt >= backdatedMonthStart && x.CreatedAt < backdatedMonthEnd) | ||||||
|  |             .Where(x => x.BackdatedFrom != null) | ||||||
|  |             .CountAsync(); | ||||||
|  |         return backdatedCheckInMonths < 4; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     public const string CheckInLockKey = "checkin:lock:"; | ||||||
|  |  | ||||||
|  |     public async Task<CheckInResult> CheckInDaily(Account user, Instant? backdated = null) | ||||||
|     { |     { | ||||||
|         var lockKey = $"{CheckInLockKey}{user.Id}"; |         var lockKey = $"{CheckInLockKey}{user.Id}"; | ||||||
|  |  | ||||||
| @@ -254,7 +301,9 @@ public class AccountEventService( | |||||||
|             Level = (CheckInResultLevel)Random.Next(Enum.GetValues<CheckInResultLevel>().Length), |             Level = (CheckInResultLevel)Random.Next(Enum.GetValues<CheckInResultLevel>().Length), | ||||||
|             AccountId = user.Id, |             AccountId = user.Id, | ||||||
|             RewardExperience = 100, |             RewardExperience = 100, | ||||||
|             RewardPoints = 10, |             RewardPoints = backdated.HasValue ? null : 10, | ||||||
|  |             BackdatedFrom = backdated.HasValue ? SystemClock.Instance.GetCurrentInstant() : null, | ||||||
|  |             CreatedAt = backdated ?? SystemClock.Instance.GetCurrentInstant(), | ||||||
|         }; |         }; | ||||||
|  |  | ||||||
|         var now = SystemClock.Instance.GetCurrentInstant().InUtc().Date; |         var now = SystemClock.Instance.GetCurrentInstant().InUtc().Date; | ||||||
| @@ -298,7 +347,7 @@ public class AccountEventService( | |||||||
|  |  | ||||||
|         var statuses = await db.AccountStatuses |         var statuses = await db.AccountStatuses | ||||||
|             .AsNoTracking() |             .AsNoTracking() | ||||||
|             .TagWith("GetEventCalendar_Statuses") |             .TagWith("eventcal:statuses") | ||||||
|             .Where(x => x.AccountId == user.Id && x.CreatedAt >= startOfMonth && x.CreatedAt < endOfMonth) |             .Where(x => x.AccountId == user.Id && x.CreatedAt >= startOfMonth && x.CreatedAt < endOfMonth) | ||||||
|             .Select(x => new Status |             .Select(x => new Status | ||||||
|             { |             { | ||||||
| @@ -316,7 +365,7 @@ public class AccountEventService( | |||||||
|  |  | ||||||
|         var checkIn = await db.AccountCheckInResults |         var checkIn = await db.AccountCheckInResults | ||||||
|             .AsNoTracking() |             .AsNoTracking() | ||||||
|             .TagWith("GetEventCalendar_CheckIn") |             .TagWith("eventcal:checkin") | ||||||
|             .Where(x => x.AccountId == user.Id && x.CreatedAt >= startOfMonth && x.CreatedAt < endOfMonth) |             .Where(x => x.AccountId == user.Id && x.CreatedAt >= startOfMonth && x.CreatedAt < endOfMonth) | ||||||
|             .ToListAsync(); |             .ToListAsync(); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -46,6 +46,8 @@ public class CheckInResult : ModelBase | |||||||
|      |      | ||||||
|     public Guid AccountId { get; set; } |     public Guid AccountId { get; set; } | ||||||
|     public Account Account { get; set; } = null!; |     public Account Account { get; set; } = null!; | ||||||
|  |      | ||||||
|  |     public Instant? BackdatedFrom { get; set; } | ||||||
| } | } | ||||||
|  |  | ||||||
| public class FortuneTip | public class FortuneTip | ||||||
|   | |||||||
| @@ -19,7 +19,7 @@ public class AuthController( | |||||||
|     IConfiguration configuration |     IConfiguration configuration | ||||||
| ) : ControllerBase | ) : ControllerBase | ||||||
| { | { | ||||||
|     private readonly string CookieDomain = configuration["AuthToken:CookieDomain"]!; |     private readonly string _cookieDomain = configuration["AuthToken:CookieDomain"]!; | ||||||
|      |      | ||||||
|     public class ChallengeRequest |     public class ChallengeRequest | ||||||
|     { |     { | ||||||
| @@ -257,7 +257,7 @@ public class AuthController( | |||||||
|                     HttpOnly = true, |                     HttpOnly = true, | ||||||
|                     Secure = true, |                     Secure = true, | ||||||
|                     SameSite = SameSiteMode.Lax, |                     SameSite = SameSiteMode.Lax, | ||||||
|                     Domain = CookieDomain, |                     Domain = _cookieDomain, | ||||||
|                     Expires = DateTime.UtcNow.AddDays(30) |                     Expires = DateTime.UtcNow.AddDays(30) | ||||||
|                 }); |                 }); | ||||||
|  |  | ||||||
| @@ -281,7 +281,7 @@ public class AuthController( | |||||||
|     { |     { | ||||||
|         Response.Cookies.Delete(AuthConstants.CookieTokenName, new CookieOptions |         Response.Cookies.Delete(AuthConstants.CookieTokenName, new CookieOptions | ||||||
|         { |         { | ||||||
|             Domain = CookieDomain, |             Domain = _cookieDomain, | ||||||
|             HttpOnly = true, |             HttpOnly = true, | ||||||
|             Secure = true, |             Secure = true, | ||||||
|             SameSite = SameSiteMode.Lax |             SameSite = SameSiteMode.Lax | ||||||
|   | |||||||
| @@ -119,7 +119,8 @@ public class PostController( | |||||||
|             var friendsResponse = await accounts.ListFriendsAsync(new ListRelationshipSimpleRequest |             var friendsResponse = await accounts.ListFriendsAsync(new ListRelationshipSimpleRequest | ||||||
|                 { AccountId = currentUser.Id }); |                 { AccountId = currentUser.Id }); | ||||||
|             userFriends = friendsResponse.AccountsId.Select(Guid.Parse).ToList(); |             userFriends = friendsResponse.AccountsId.Select(Guid.Parse).ToList(); | ||||||
|         }  |         } | ||||||
|  |  | ||||||
|         var userPublishers = currentUser is null ? [] : await pub.GetUserPublishers(Guid.Parse(currentUser.Id)); |         var userPublishers = currentUser is null ? [] : await pub.GetUserPublishers(Guid.Parse(currentUser.Id)); | ||||||
|  |  | ||||||
|         var queryable = db.Posts |         var queryable = db.Posts | ||||||
| @@ -150,6 +151,22 @@ public class PostController( | |||||||
|         return Ok(posts); |         return Ok(posts); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     [HttpGet("{id:guid}/replies/featured")] | ||||||
|  |     public async Task<ActionResult<Post>> GetFeaturedReply(Guid id) | ||||||
|  |     { | ||||||
|  |         var now = SystemClock.Instance.GetCurrentInstant(); | ||||||
|  |         var post = await db.Posts | ||||||
|  |             .Where(e => e.RepliedPostId == id) | ||||||
|  |             .OrderByDescending(p => | ||||||
|  |                 p.Upvotes * 2 - | ||||||
|  |                 p.Downvotes + | ||||||
|  |                 ((p.CreatedAt - now).TotalMinutes < 60 ? 5 : 0) | ||||||
|  |             ) | ||||||
|  |             .FirstOrDefaultAsync(); | ||||||
|  |         if (post is null) return NotFound(); | ||||||
|  |         return await ps.LoadPostInfo(post); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     [HttpGet("{id:guid}/replies")] |     [HttpGet("{id:guid}/replies")] | ||||||
|     public async Task<ActionResult<List<Post>>> ListReplies(Guid id, [FromQuery] int offset = 0, |     public async Task<ActionResult<List<Post>>> ListReplies(Guid id, [FromQuery] int offset = 0, | ||||||
|         [FromQuery] int take = 20) |         [FromQuery] int take = 20) | ||||||
|   | |||||||
| @@ -27,6 +27,7 @@ | |||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACorsPolicyBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F051ad509d0504b7ca10dedd9c2cabb9914200_003F8e_003Fb28257cb_003FCorsPolicyBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ACorsPolicyBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F051ad509d0504b7ca10dedd9c2cabb9914200_003F8e_003Fb28257cb_003FCorsPolicyBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADailyTimeIntervalScheduleBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F929ef51651404d13aacd3eb8198d2961e4800_003F2b_003Ff86eadcb_003FDailyTimeIntervalScheduleBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADailyTimeIntervalScheduleBuilder_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F929ef51651404d13aacd3eb8198d2961e4800_003F2b_003Ff86eadcb_003FDailyTimeIntervalScheduleBuilder_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADailyTimeIntervalTriggerBuilderExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F929ef51651404d13aacd3eb8198d2961e4800_003F5c_003F297b8312_003FDailyTimeIntervalTriggerBuilderExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADailyTimeIntervalTriggerBuilderExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F929ef51651404d13aacd3eb8198d2961e4800_003F5c_003F297b8312_003FDailyTimeIntervalTriggerBuilderExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
|  | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADateTime_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fe6898c1ddf974e16b95b114722270029e55000_003Fd6_003Fd0d63431_003FDateTime_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADbContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fa0b45f29f34f594814a7b1fbc25fe5ef3c18257956ed4f4fbfa68717db58_003FDbContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADbContext_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FSourcesCache_003Fa0b45f29f34f594814a7b1fbc25fe5ef3c18257956ed4f4fbfa68717db58_003FDbContext_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADbFunctionsExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fc1c46ed28c61e1caa79185e4375a8ae7cd11cd5ba8853dcb37577f93f2ca8d5_003FDbFunctionsExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADbFunctionsExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003Fc1c46ed28c61e1caa79185e4375a8ae7cd11cd5ba8853dcb37577f93f2ca8d5_003FDbFunctionsExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADiagnosticServiceCollectionExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F47e01f36dea14a23aaea6e0391c1347ace00_003F3c_003F140e6d8b_003FDiagnosticServiceCollectionExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ADiagnosticServiceCollectionExtensions_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F47e01f36dea14a23aaea6e0391c1347ace00_003F3c_003F140e6d8b_003FDiagnosticServiceCollectionExtensions_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| @@ -84,6 +85,7 @@ | |||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AKestrelServerLimits_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1e2e5dfcafad4407b569dd5df56a2fbf274e00_003Fa4_003F39445f62_003FKestrelServerLimits_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AKestrelServerLimits_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1e2e5dfcafad4407b569dd5df56a2fbf274e00_003Fa4_003F39445f62_003FKestrelServerLimits_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AKnownResamplers_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fef3339e864a448e2b1ec6fa7bbf4c6661fee00_003Fb3_003Fcdb3e080_003FKnownResamplers_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AKnownResamplers_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fef3339e864a448e2b1ec6fa7bbf4c6661fee00_003Fb3_003Fcdb3e080_003FKnownResamplers_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ALivekitRoom_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F82666257d5ad47354add7af860f66dd85df55ec93e92e8a45891b9bff7bf80ac_003FLivekitRoom_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ALivekitRoom_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F82666257d5ad47354add7af860f66dd85df55ec93e92e8a45891b9bff7bf80ac_003FLivekitRoom_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
|  | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ALocalDate_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FSourcesCache_003F9bab6c3f4ee252ba1a9d0707f963a846da4f248fa52e9ff43e789149728a4_003FLocalDate_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMailboxAddress_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8e03e47c46b7469f97abc40667cbcf9b133000_003Fa6_003F83324248_003FMailboxAddress_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMailboxAddress_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2025_002E1_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8e03e47c46b7469f97abc40667cbcf9b133000_003Fa6_003F83324248_003FMailboxAddress_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMediaAnalysis_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffef366b36a224d469ff150d30f9a866d23c00_003Fd7_003F5c138865_003FMediaAnalysis_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMediaAnalysis_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Ffef366b36a224d469ff150d30f9a866d23c00_003Fd7_003F5c138865_003FMediaAnalysis_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
| 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMicrosoftDependencyInjectionJobFactory_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1edbd6e24d7b430fabce72177269baa19200_003Fa8_003F91b091de_003FMicrosoftDependencyInjectionJobFactory_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | 	<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AMicrosoftDependencyInjectionJobFactory_002Ecs_002Fl_003A_002E_002E_003F_002E_002E_003F_002E_002E_003FLibrary_003FApplication_0020Support_003FJetBrains_003FRider2024_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F1edbd6e24d7b430fabce72177269baa19200_003Fa8_003F91b091de_003FMicrosoftDependencyInjectionJobFactory_002Ecs/@EntryIndexedValue">ForceIncluded</s:String> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user