Files
LightlessServer/LightlessSyncServer/LightlessSyncServer/Hubs/MareHub.Permissions.cs
2025-08-27 03:02:29 +02:00

173 lines
8.8 KiB
C#

using LightlessSync.API.Data.Enum;
using LightlessSync.API.Dto;
using LightlessSync.API.Dto.Group;
using LightlessSync.API.Dto.User;
using LightlessSync.API.Data.Extensions;
using LightlessSyncServer.Utils;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using Microsoft.EntityFrameworkCore;
namespace LightlessSyncServer.Hubs;
public partial class LightlessHub
{
[Authorize(Policy = "Authenticated")]
public async Task UserUpdateDefaultPermissions(DefaultPermissionsDto defaultPermissions)
{
_logger.LogCallInfo(LightlessHubLogger.Args(defaultPermissions));
var permissions = await DbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false);
permissions.DisableGroupAnimations = defaultPermissions.DisableGroupAnimations;
permissions.DisableGroupSounds = defaultPermissions.DisableGroupSounds;
permissions.DisableGroupVFX = defaultPermissions.DisableGroupVFX;
permissions.DisableIndividualAnimations = defaultPermissions.DisableIndividualAnimations;
permissions.DisableIndividualSounds = defaultPermissions.DisableIndividualSounds;
permissions.DisableIndividualVFX = defaultPermissions.DisableIndividualVFX;
permissions.IndividualIsSticky = defaultPermissions.IndividualIsSticky;
DbContext.Update(permissions);
await DbContext.SaveChangesAsync().ConfigureAwait(false);
await Clients.Caller.Client_UserUpdateDefaultPermissions(defaultPermissions).ConfigureAwait(false);
}
[Authorize(Policy = "Identified")]
public async Task SetBulkPermissions(BulkPermissionsDto dto)
{
_logger.LogCallInfo(LightlessHubLogger.Args(
"Individual", string.Join(';', dto.AffectedUsers.Select(g => g.Key + ":" + g.Value)),
"Group", string.Join(';', dto.AffectedGroups.Select(g => g.Key + ":" + g.Value))));
// remove self
dto.AffectedUsers.Remove(UserUID, out _);
if (!dto.AffectedUsers.Any() && !dto.AffectedGroups.Any()) return;
// get all current pairs in any form
var allUsers = await GetAllPairInfo(UserUID).ConfigureAwait(false);
var ownDefaultPerms = await DbContext.UserDefaultPreferredPermissions.SingleAsync(u => u.UserUID == UserUID).ConfigureAwait(false);
foreach (var user in dto.AffectedUsers)
{
bool setSticky = false;
var newPerm = user.Value;
if (!allUsers.TryGetValue(user.Key, out var pairData)) continue;
if (!pairData.OwnPermissions.Sticky && !newPerm.IsSticky())
{
setSticky = ownDefaultPerms.IndividualIsSticky;
}
var pauseChange = pairData.OwnPermissions.IsPaused != newPerm.IsPaused();
var prevPermissions = await DbContext.Permissions.SingleAsync(u => u.UserUID == UserUID && u.OtherUserUID == user.Key).ConfigureAwait(false);
prevPermissions.IsPaused = newPerm.IsPaused();
prevPermissions.DisableAnimations = newPerm.IsDisableAnimations();
prevPermissions.DisableSounds = newPerm.IsDisableSounds();
prevPermissions.DisableVFX = newPerm.IsDisableVFX();
prevPermissions.Sticky = newPerm.IsSticky() || setSticky;
DbContext.Update(prevPermissions);
// send updated data to pair
var permCopy = newPerm;
permCopy.SetSticky(newPerm.IsSticky() || setSticky);
var permToOther = permCopy;
permToOther.SetSticky(false);
await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(new(new(user.Key), permCopy)).ConfigureAwait(false);
if (pairData.OtherPermissions == null) continue;
await Clients.User(user.Key).Client_UserUpdateOtherPairPermissions(new(new(UserUID), permToOther)).ConfigureAwait(false);
// check if pause change and send online or offline respectively
if (pauseChange && !pairData.OtherPermissions.IsPaused)
{
var otherCharaIdent = await GetUserIdent(user.Key).ConfigureAwait(false);
if (UserCharaIdent == null || otherCharaIdent == null) continue;
if (newPerm.IsPaused())
{
await Clients.User(UserUID).Client_UserSendOffline(new(new(user.Key))).ConfigureAwait(false);
await Clients.User(user.Key).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false);
}
else
{
await Clients.User(UserUID).Client_UserSendOnline(new(new(user.Key), otherCharaIdent)).ConfigureAwait(false);
await Clients.User(user.Key).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false);
}
}
}
foreach (var group in dto.AffectedGroups)
{
var (inGroup, groupPair) = await TryValidateUserInGroup(group.Key).ConfigureAwait(false);
if (!inGroup) continue;
var groupPreferredPermissions = await DbContext.GroupPairPreferredPermissions
.SingleAsync(u => u.UserUID == UserUID && u.GroupGID == group.Key).ConfigureAwait(false);
var wasPaused = groupPreferredPermissions.IsPaused;
groupPreferredPermissions.DisableSounds = group.Value.IsDisableSounds();
groupPreferredPermissions.DisableAnimations = group.Value.IsDisableAnimations();
groupPreferredPermissions.IsPaused = group.Value.IsPaused();
groupPreferredPermissions.DisableVFX = group.Value.IsDisableVFX();
var nonStickyPairs = allUsers.Where(u => !u.Value.OwnPermissions.Sticky).ToList();
var affectedGroupPairs = nonStickyPairs.Where(u => u.Value.GIDs.Contains(group.Key, StringComparer.Ordinal)).ToList();
var groupUserUids = affectedGroupPairs.Select(g => g.Key).ToList();
var affectedPerms = await DbContext.Permissions.Where(u => u.UserUID == UserUID
&& groupUserUids.Any(c => c == u.OtherUserUID))
.ToListAsync().ConfigureAwait(false);
foreach (var perm in affectedPerms)
{
perm.DisableSounds = groupPreferredPermissions.DisableSounds;
perm.DisableAnimations = groupPreferredPermissions.DisableAnimations;
perm.IsPaused = groupPreferredPermissions.IsPaused;
perm.DisableVFX = groupPreferredPermissions.DisableVFX;
}
UserPermissions permissions = UserPermissions.NoneSet;
permissions.SetPaused(groupPreferredPermissions.IsPaused);
permissions.SetDisableAnimations(groupPreferredPermissions.DisableAnimations);
permissions.SetDisableSounds(groupPreferredPermissions.DisableSounds);
permissions.SetDisableVFX(groupPreferredPermissions.DisableVFX);
await Clients.Users(affectedGroupPairs
.Select(k => k.Key))
.Client_UserUpdateOtherPairPermissions(new(new(UserUID), permissions)).ConfigureAwait(false);
await Clients.User(UserUID).Client_GroupChangeUserPairPermissions(new GroupPairUserPermissionDto(new(group.Key), new(UserUID), group.Value)).ConfigureAwait(false);
foreach (var item in affectedGroupPairs.Select(k => k.Key))
{
await Clients.User(UserUID).Client_UserUpdateSelfPairPermissions(new(new(item), permissions)).ConfigureAwait(false);
}
if (wasPaused == groupPreferredPermissions.IsPaused) continue;
foreach (var groupUserPair in affectedGroupPairs)
{
var groupUserIdent = await GetUserIdent(groupUserPair.Key).ConfigureAwait(false);
if (!string.IsNullOrEmpty(groupUserIdent) && !groupUserPair.Value.OtherPermissions.IsPaused)
{
// if we changed to paused and other was not paused before, we send offline
if (groupPreferredPermissions.IsPaused)
{
await Clients.User(UserUID).Client_UserSendOffline(new(new(groupUserPair.Key, groupUserPair.Value.Alias))).ConfigureAwait(false);
await Clients.User(groupUserPair.Key).Client_UserSendOffline(new(new(UserUID))).ConfigureAwait(false);
}
// if we changed to unpaused and other was not paused either we send online
else
{
await Clients.User(UserUID).Client_UserSendOnline(new(new(groupUserPair.Key, groupUserPair.Value.Alias), groupUserIdent)).ConfigureAwait(false);
await Clients.User(groupUserPair.Key).Client_UserSendOnline(new(new(UserUID), UserCharaIdent)).ConfigureAwait(false);
}
}
}
}
await DbContext.SaveChangesAsync().ConfigureAwait(false);
}
}