using System.Globalization; using System.Threading.Tasks; using Jellyfin.Data.Entities; using MediaBrowser.Controller.Plugins; using MediaBrowser.Controller.Session; using MediaBrowser.Model.Activity; using MediaBrowser.Model.Globalization; namespace Emby.Server.Implementations.Activity { /// /// Entry point for the activity logger. /// public sealed class ActivityLogEntryPoint : IServerEntryPoint { private readonly ISessionManager _sessionManager; private readonly IActivityManager _activityManager; private readonly ILocalizationManager _localization; /// /// Initializes a new instance of the class. /// /// The session manager. /// The activity manager. /// The localization manager. public ActivityLogEntryPoint( ISessionManager sessionManager, IActivityManager activityManager, ILocalizationManager localization) { _sessionManager = sessionManager; _activityManager = activityManager; _localization = localization; } /// public Task RunAsync() { _sessionManager.SessionEnded += OnSessionEnded; return Task.CompletedTask; } private async void OnSessionEnded(object sender, SessionEventArgs e) { var session = e.SessionInfo; if (string.IsNullOrEmpty(session.UserName)) { return; } await CreateLogEntry(new ActivityLog( string.Format( CultureInfo.InvariantCulture, _localization.GetLocalizedString("UserOfflineFromDevice"), session.UserName, session.DeviceName), "SessionEnded", session.UserId) { ShortOverview = string.Format( CultureInfo.InvariantCulture, _localization.GetLocalizedString("LabelIpAddressValue"), session.RemoteEndPoint), }).ConfigureAwait(false); } private async Task CreateLogEntry(ActivityLog entry) => await _activityManager.CreateAsync(entry).ConfigureAwait(false); /// public void Dispose() { _sessionManager.SessionEnded -= OnSessionEnded; } } }