Radicade Public Code

This commit is contained in:
JogmansonReal
2026-10-16 23:33:13 -07:00
commit 55175acdf6
832 changed files with 363261 additions and 0 deletions
+8
View File
@@ -0,0 +1,8 @@
namespace RadicadeServer.RecNet.Board
{
public class BoardAnnouncement
{
public string Message { get; set; } = null!;
public string MoreInfoUrl { get; set; } = null!;
}
}
+11
View File
@@ -0,0 +1,11 @@
namespace RadicadeServer.RecNet.Board
{
public class BoardVideo
{
public string BlobName { get; set; } = null!;
public string Title { get; set; } = null!;
public string Description { get; set; } = null!;
public string ThumbnailBlobName { get; set; } = null!;
public string SourceUrl { get; set; } = null!;
}
}
+11
View File
@@ -0,0 +1,11 @@
namespace RadicadeServer.RecNet.Board
{
public class CommunityBoard
{
public FeaturedPlayer FeaturedPlayer { get; set; } = null!;
public FeaturedRoomGroup FeaturedRoomGroup { get; set; } = null!;
public BoardAnnouncement CurrentAnnouncement { get; set; } = null!;
public List<InstagramImage> InstagramImages { get; set; } = null!;
public List<BoardVideo> Videos { get; set; } = null!;
}
}
+41
View File
@@ -0,0 +1,41 @@
using RadicadeServer.API.Notifications;
using RadicadeServer.RecNet.Enums.Messages;
using RadicadeServer.RecNet.Notifications;
namespace RadicadeServer.RecNet.Board
{
public static class CommunityBoardBroadcast
{
public const string UpdateNotificationId = "CommunityBoardUpdate";
public static IReadOnlyList<Notification> BuildFrames(CommunityBoard? board)
{
if (board == null)
return Array.Empty<Notification>();
return new List<Notification>
{
new Notification
{
Id = UpdateNotificationId,
Msg = board
},
new Notification
{
Id = NotificationType.CommunityBoardAnnouncementUpdate,
Msg = board.CurrentAnnouncement ?? new BoardAnnouncement
{
Message = string.Empty,
MoreInfoUrl = string.Empty
}
}
};
}
public static async Task PushAsync(CommunityBoard? board)
{
foreach (var frame in BuildFrames(board))
await Notify.SendGlobalNotify(frame);
}
}
}
+94
View File
@@ -0,0 +1,94 @@
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using RadicadeServer.DB;
using RadicadeServer.Extensions;
using RadicadeServer.RecNet.Board;
namespace RadicadeServer.API.Board.V2
{
[Route("api/communityboard/v2")]
public class CommunityBoardV2 : Controller
{
private readonly RecDBContext db;
public CommunityBoardV2(RecDBContext context)
{
db = context;
}
[HttpGet("current")]
public async Task<ActionResult<CommunityBoard>> GetCurrentCommunityBoard()
{
var config = await db.ServerConfig.FirstOrDefaultAsync(x => x.Key == "CommunityBoard");
var board = config?.Value?.FromJson<CommunityBoard>() ?? CreateDefaultBoard();
NormalizeBoard(board);
return Ok(board);
}
private static CommunityBoard CreateDefaultBoard()
{
return new CommunityBoard
{
FeaturedPlayer = new FeaturedPlayer
{
Id = 0,
TitleOverride = string.Empty,
UrlOverride = string.Empty
},
FeaturedRoomGroup = new FeaturedRoomGroup
{
FeaturedRoomGroupId = 0,
Name = string.Empty,
Rooms = new List<FeaturedRoom>()
},
CurrentAnnouncement = new BoardAnnouncement
{
Message = string.Empty,
MoreInfoUrl = string.Empty
},
InstagramImages = new List<InstagramImage>(),
Videos = new List<BoardVideo>()
};
}
private static void NormalizeBoard(CommunityBoard board)
{
board.FeaturedPlayer ??= new FeaturedPlayer
{
Id = 0,
TitleOverride = string.Empty,
UrlOverride = string.Empty
};
board.FeaturedRoomGroup ??= new FeaturedRoomGroup
{
FeaturedRoomGroupId = 0,
Name = string.Empty,
Rooms = new List<FeaturedRoom>()
};
board.FeaturedRoomGroup.Rooms ??= new List<FeaturedRoom>();
board.CurrentAnnouncement ??= new BoardAnnouncement
{
Message = string.Empty,
MoreInfoUrl = string.Empty
};
board.InstagramImages ??= new List<InstagramImage>();
board.Videos ??= new List<BoardVideo>();
foreach (var video in board.Videos)
{
if (string.IsNullOrWhiteSpace(video.SourceUrl) && !string.IsNullOrWhiteSpace(video.BlobName))
video.SourceUrl = $"{DBConfig.ServerUrl}/cdn/video/{video.BlobName.TrimStart('/')}";
}
var playable = board.Videos
.Where(video => !string.IsNullOrWhiteSpace(video.SourceUrl) || !string.IsNullOrWhiteSpace(video.BlobName))
.ToList();
board.Videos = playable;
}
}
}
@@ -0,0 +1,7 @@
namespace RadicadeServer.RecNet.Enums.Board
{
public enum ExternalContentType
{
YouTube
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace RadicadeServer.RecNet.Board
{
public class FeaturedPlayer
{
public int Id { get; set; }
public string TitleOverride { get; set; } = null!;
public string UrlOverride { get; set; } = null!;
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace RadicadeServer.RecNet.Board
{
public class FeaturedRoom
{
public long RoomId { get; set; }
public string RoomName { get; set; } = null!;
public string ImageName { get; set; } = null!;
}
}
+9
View File
@@ -0,0 +1,9 @@
namespace RadicadeServer.RecNet.Board
{
public class FeaturedRoomGroup
{
public long FeaturedRoomGroupId { get; set; }
public string Name { get; set; } = null!;
public List<FeaturedRoom> Rooms { get; set; } = null!;
}
}
+8
View File
@@ -0,0 +1,8 @@
namespace RadicadeServer.RecNet.Board
{
public class InstagramImage
{
public string ImageName { get; set; } = null!;
public string ImageUrl { get; set; } = null!;
}
}