Files
Moonlight/Moonlight/Shared/Views/Admin/Users/Sessions.razor
Marcel Baumgartner a480b35fe6 Added session system
2023-03-06 18:36:00 +01:00

185 lines
6.5 KiB
Plaintext

@page "/admin/users/sessions"
@using Moonlight.Shared.Components.Navigations
@using Moonlight.App.Services.Sessions
@using BlazorTable
@using Logging.Net
@using Moonlight.App.Helpers
@using Moonlight.App.Models.Misc
@using Moonlight.App.Services
@using Moonlight.App.Services.Interop
@inject SessionService SessionService
@inject SmartTranslateService SmartTranslateService
@inject AlertService AlertService
<OnlyAdmin>
<AdminSessionNavigation Index="1"/>
<div class="card card-body">
<LazyLoader Load="Load">
<button class="btn btn-primary mb-3" @onclick="Refresh">
<TL>Refresh</TL>
</button>
<button class="btn btn-warning mb-3" @onclick="MessageAll">
<TL>Send a message to all users</TL>
</button>
@if (AllSessions == null)
{
<div class="alert alert-info">
<span class="spinner-border spinner-border-sm align-middle me-2"></span>
<TL>Loading sessions</TL>
</div>
}
else
{
<Table TableItem="Session" Items="AllSessions" PageSize="25" TableHeadClass="border-bottom border-gray-200 fs-6 text-gray-600 fw-bold bg-light bg-opacity-75">
<Column TableItem="Session" Title="@(SmartTranslateService.Translate("Email"))" Field="@(x => x.User.Id)" Sortable="true" Filterable="true" Width="20%">
<Template>
<span>@(context.User == null ? "" : context.User.Email)</span>
</Template>
</Column>
<Column TableItem="Session" Title="@(SmartTranslateService.Translate("IP"))" Field="@(x => x.Ip)" Sortable="true" Filterable="true" Width="10%"/>
<Column TableItem="Session" Title="@(SmartTranslateService.Translate("URL"))" Field="@(x => x.Url)" Sortable="true" Filterable="true" Width="10%"/>
<Column TableItem="Session" Title="@(SmartTranslateService.Translate("Device"))" Field="@(x => x.Device)" Sortable="true" Filterable="true" Width="10%"/>
<Column TableItem="Session" Title="@(SmartTranslateService.Translate("Time"))" Field="@(x => x.CreatedAt)" Sortable="true" Filterable="true" Width="10%">
<Template>
@{
var time = Formatter.FormatUptime((DateTime.Now - context.CreatedAt).TotalMilliseconds);
}
<span>@(time)</span>
</Template>
</Column>
<Column TableItem="Session" Title="@(SmartTranslateService.Translate("Actions"))" Field="@(x => x.Ip)" Sortable="false" Filterable="false" Width="10%">
<Template>
<button @onclick="() => Navigate(context)" class="btn btn-primary">
<TL>Change url</TL>
</button>
</Template>
</Column>
<Column TableItem="Session" Title="" Field="@(x => x.Ip)" Sortable="false" Filterable="false" Width="10%">
<Template>
<button @onclick="() => Message(context)" class="btn btn-warning">
<TL>Message</TL>
</button>
</Template>
</Column>
<Pager ShowPageNumber="true" ShowTotalCount="true"/>
</Table>
}
</LazyLoader>
</div>
</OnlyAdmin>
@code
{
private Session[]? AllSessions;
private Task Load(LazyLoader arg)
{
AllSessions = SessionService.GetAll();
Task.Run(async () =>
{
while (true)
{
try
{
await Refresh();
await Task.Delay(1000);
}
catch (Exception e)
{
Logger.Warn("Error autorefreshing sessions");
Logger.Warn(e);
}
}
});
return Task.CompletedTask;
}
private async Task Refresh()
{
AllSessions = SessionService.GetAll();
await InvokeAsync(StateHasChanged);
}
private async Task Navigate(Session session)
{
var url = await AlertService.Text("URL", SmartTranslateService.Translate("Enter url"), "");
if(url == null)
return;
if (url == "")
return;
if (url == "null")
return;
session.Navigation.NavigateTo(url, true);
}
private async Task MessageAll()
{
var message = await AlertService.Text(
SmartTranslateService.Translate("Enter message"),
SmartTranslateService.Translate("Enter the message to send"),
""
);
var b = await AlertService.YesNo(
SmartTranslateService.Translate("Confirm"),
SmartTranslateService.Translate("Are you sure?"),
SmartTranslateService.Translate("Yes"),
SmartTranslateService.Translate("No")
);
if (b)
{
foreach (var session in SessionService.GetAll())
{
try
{
await session.AlertService.Warning("Admin Message", message);
}
catch (Exception e)
{
Logger.Warn("Error sending user a alert");
Logger.Warn(e);
}
}
}
}
private async Task Message(Session session)
{
var message = await AlertService.Text(
SmartTranslateService.Translate("Enter message"),
SmartTranslateService.Translate("Enter the message to send"),
""
);
var b = await AlertService.YesNo(
SmartTranslateService.Translate("Confirm"),
SmartTranslateService.Translate("Are you sure?"),
SmartTranslateService.Translate("Yes"),
SmartTranslateService.Translate("No")
);
if (b)
{
try
{
await session.AlertService.Warning("Admin Message", message);
}
catch (Exception e)
{
Logger.Warn("Error sending user a alert");
Logger.Warn(e);
}
}
}
}