TOS
Bugfix stream editor
This commit is contained in:
@ -61,8 +61,7 @@ public class StreamEventBuilder
|
||||
tags.Add(new("recording", new Uri(_config.DataHost, $"recording/{stream.Id}.m3u8").ToString()));
|
||||
}
|
||||
|
||||
foreach (var tag in !string.IsNullOrEmpty(user.Tags) ?
|
||||
user.Tags.Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) : Array.Empty<string>())
|
||||
foreach (var tag in user.SplitTags())
|
||||
{
|
||||
tags.Add(new("t", tag));
|
||||
}
|
||||
|
@ -9,6 +9,12 @@ public interface IStreamManager
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
UserStream GetStream();
|
||||
|
||||
/// <summary>
|
||||
/// Test if streaming is allowed for this user, otherwise throw
|
||||
/// </summary>
|
||||
/// <exception cref="Exception">Throws if cant stream</exception>
|
||||
void TestCanStream();
|
||||
|
||||
/// <summary>
|
||||
/// Stream ingress check on srs-edge
|
||||
@ -35,17 +41,6 @@ public interface IStreamManager
|
||||
/// <returns></returns>
|
||||
Task ConsumeQuota(double duration);
|
||||
|
||||
/// <summary>
|
||||
/// Update stream details
|
||||
/// </summary>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="summary"></param>
|
||||
/// <param name="image"></param>
|
||||
/// <param name="tags"></param>
|
||||
/// <param name="contentWarning"></param>
|
||||
/// <returns></returns>
|
||||
Task PatchEvent(string? title, string? summary, string? image, string[]? tags, string? contentWarning);
|
||||
|
||||
/// <summary>
|
||||
/// Update viewer count
|
||||
/// </summary>
|
||||
|
@ -1,4 +1,3 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Newtonsoft.Json;
|
||||
using Nostr.Client.Json;
|
||||
@ -14,15 +13,16 @@ public class NostrStreamManager : IStreamManager
|
||||
private readonly StreamEventBuilder _eventBuilder;
|
||||
private readonly IDvrStore _dvrStore;
|
||||
private readonly ThumbnailService _thumbnailService;
|
||||
private readonly Config _config;
|
||||
|
||||
public NostrStreamManager(ILogger<NostrStreamManager> logger, StreamManagerContext context,
|
||||
StreamEventBuilder eventBuilder, IDvrStore dvrStore, ThumbnailService thumbnailService)
|
||||
public NostrStreamManager(ILogger<NostrStreamManager> logger, StreamManagerContext context, IServiceProvider serviceProvider)
|
||||
{
|
||||
_logger = logger;
|
||||
_context = context;
|
||||
_eventBuilder = eventBuilder;
|
||||
_dvrStore = dvrStore;
|
||||
_thumbnailService = thumbnailService;
|
||||
_eventBuilder = serviceProvider.GetRequiredService<StreamEventBuilder>();
|
||||
_dvrStore = serviceProvider.GetRequiredService<IDvrStore>();
|
||||
_thumbnailService = serviceProvider.GetRequiredService<ThumbnailService>();
|
||||
_config = serviceProvider.GetRequiredService<Config>();
|
||||
}
|
||||
|
||||
public UserStream GetStream()
|
||||
@ -30,13 +30,22 @@ public class NostrStreamManager : IStreamManager
|
||||
return _context.UserStream;
|
||||
}
|
||||
|
||||
public Task<List<string>> OnForward()
|
||||
public void TestCanStream()
|
||||
{
|
||||
if (_context.User.Balance <= 0)
|
||||
{
|
||||
throw new LowBalanceException("User balance empty");
|
||||
}
|
||||
|
||||
if (_context.User.TosAccepted == null || _context.User.TosAccepted < _config.TosDate)
|
||||
{
|
||||
throw new Exception("TOS not accepted");
|
||||
}
|
||||
}
|
||||
|
||||
public Task<List<string>> OnForward()
|
||||
{
|
||||
TestCanStream();
|
||||
return Task.FromResult(new List<string>
|
||||
{
|
||||
$"rtmp://127.0.0.1:1935/{_context.UserStream.Endpoint.App}/{_context.User.StreamKey}?vhost={_context.UserStream.Endpoint.Forward}"
|
||||
@ -46,12 +55,7 @@ public class NostrStreamManager : IStreamManager
|
||||
public async Task StreamStarted()
|
||||
{
|
||||
_logger.LogInformation("Stream started for: {pubkey}", _context.User.PubKey);
|
||||
|
||||
if (_context.User.Balance <= 0)
|
||||
{
|
||||
throw new Exception("User balance empty");
|
||||
}
|
||||
|
||||
TestCanStream();
|
||||
await UpdateStreamState(UserStreamState.Live);
|
||||
|
||||
#pragma warning disable CS4014
|
||||
@ -95,31 +99,6 @@ public class NostrStreamManager : IStreamManager
|
||||
}
|
||||
}
|
||||
|
||||
public async Task PatchEvent(string? title, string? summary, string? image, string[]? tags, string? contentWarning)
|
||||
{
|
||||
var user = _context.User;
|
||||
|
||||
await _context.Db.Users
|
||||
.Where(a => a.PubKey == _context.User.PubKey)
|
||||
.ExecuteUpdateAsync(o => o.SetProperty(v => v.Title, title)
|
||||
.SetProperty(v => v.Summary, summary)
|
||||
.SetProperty(v => v.Image, image)
|
||||
.SetProperty(v => v.Tags, tags != null ? string.Join(",", tags) : null)
|
||||
.SetProperty(v => v.ContentWarning, contentWarning));
|
||||
|
||||
user.Title = title;
|
||||
user.Summary = summary;
|
||||
user.Image = image;
|
||||
user.Tags = tags != null ? string.Join(",", tags) : null;
|
||||
user.ContentWarning = contentWarning;
|
||||
|
||||
var ev = _eventBuilder.CreateStreamEvent(user, _context.UserStream);
|
||||
await _context.Db.Streams.Where(a => a.Id == _context.UserStream.Id)
|
||||
.ExecuteUpdateAsync(o => o.SetProperty(v => v.Event, JsonConvert.SerializeObject(ev, NostrSerializer.Settings)));
|
||||
|
||||
_eventBuilder.BroadcastEvent(ev);
|
||||
}
|
||||
|
||||
public async Task AddGuest(string pubkey, string role, decimal zapSplit)
|
||||
{
|
||||
_context.Db.Guests.Add(new()
|
||||
|
@ -2,7 +2,6 @@ using Microsoft.EntityFrameworkCore;
|
||||
using Newtonsoft.Json;
|
||||
using Nostr.Client.Json;
|
||||
using NostrStreamer.Database;
|
||||
using NostrStreamer.Services.Dvr;
|
||||
|
||||
namespace NostrStreamer.Services.StreamManager;
|
||||
|
||||
@ -12,18 +11,16 @@ public class StreamManagerFactory
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
private readonly StreamEventBuilder _eventBuilder;
|
||||
private readonly IServiceProvider _serviceProvider;
|
||||
private readonly IDvrStore _dvrStore;
|
||||
private readonly ThumbnailService _thumbnailService;
|
||||
private readonly Config _config;
|
||||
|
||||
public StreamManagerFactory(StreamerContext db, ILoggerFactory loggerFactory, StreamEventBuilder eventBuilder,
|
||||
IServiceProvider serviceProvider, IDvrStore dvrStore, ThumbnailService thumbnailService)
|
||||
IServiceProvider serviceProvider, Config config)
|
||||
{
|
||||
_db = db;
|
||||
_loggerFactory = loggerFactory;
|
||||
_eventBuilder = eventBuilder;
|
||||
_serviceProvider = serviceProvider;
|
||||
_dvrStore = dvrStore;
|
||||
_thumbnailService = thumbnailService;
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public async Task<IStreamManager> CreateStream(StreamInfo info)
|
||||
@ -47,7 +44,12 @@ public class StreamManagerFactory
|
||||
|
||||
if (user.Balance <= 0)
|
||||
{
|
||||
throw new Exception("Cannot start stream with empty balance");
|
||||
throw new LowBalanceException("Cannot start stream with empty balance");
|
||||
}
|
||||
|
||||
if (user.TosAccepted == null || user.TosAccepted < _config.TosDate)
|
||||
{
|
||||
throw new Exception("TOS not accepted");
|
||||
}
|
||||
|
||||
var stream = new UserStream
|
||||
@ -82,7 +84,7 @@ public class StreamManagerFactory
|
||||
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
|
||||
};
|
||||
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
|
||||
}
|
||||
|
||||
public async Task<IStreamManager> ForStream(Guid id)
|
||||
@ -102,7 +104,7 @@ public class StreamManagerFactory
|
||||
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
|
||||
};
|
||||
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
|
||||
}
|
||||
|
||||
public async Task<IStreamManager> ForCurrentStream(string pubkey)
|
||||
@ -122,7 +124,7 @@ public class StreamManagerFactory
|
||||
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
|
||||
};
|
||||
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
|
||||
}
|
||||
|
||||
public async Task<IStreamManager> ForStream(StreamInfo info)
|
||||
@ -150,6 +152,6 @@ public class StreamManagerFactory
|
||||
EdgeApi = new SrsApi(_serviceProvider.GetRequiredService<HttpClient>(), new Uri($"http://{stream.EdgeIp}:1985"))
|
||||
};
|
||||
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _eventBuilder, _dvrStore, _thumbnailService);
|
||||
return new NostrStreamManager(_loggerFactory.CreateLogger<NostrStreamManager>(), ctx, _serviceProvider);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Nostr.Client.Utils;
|
||||
using NostrStreamer.ApiModel;
|
||||
using NostrStreamer.Database;
|
||||
|
||||
namespace NostrStreamer.Services;
|
||||
@ -69,4 +70,23 @@ public class UserService
|
||||
return await _db.Users.AsNoTracking()
|
||||
.SingleOrDefaultAsync(a => a.PubKey.Equals(pubkey));
|
||||
}
|
||||
|
||||
public async Task AcceptTos(string pubkey)
|
||||
{
|
||||
var change = await _db.Users.Where(a => a.PubKey.Equals(pubkey))
|
||||
.ExecuteUpdateAsync(o => o.SetProperty(v => v.TosAccepted, DateTime.UtcNow));
|
||||
|
||||
if (change != 1) throw new Exception($"Failed to accept TOS, {change} rows updated.");
|
||||
}
|
||||
|
||||
public async Task UpdateStreamInfo(string pubkey, PatchEvent req)
|
||||
{
|
||||
await _db.Users
|
||||
.Where(a => a.PubKey == pubkey)
|
||||
.ExecuteUpdateAsync(o => o.SetProperty(v => v.Title, req.Title)
|
||||
.SetProperty(v => v.Summary, req.Summary)
|
||||
.SetProperty(v => v.Image, req.Image)
|
||||
.SetProperty(v => v.Tags, req.Tags.Length > 0 ? string.Join(",", req.Tags) : null)
|
||||
.SetProperty(v => v.ContentWarning, req.ContentWarning));
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user