yikes,
This commit is contained in:
@@ -0,0 +1,300 @@
|
||||
using System;
|
||||
using LiteDB;
|
||||
using Vanadium.Classes;
|
||||
using Vanadium.Classes.DBs.DBClasses;
|
||||
using static Vanadium.Classes.DBs.DBClasses.EventDBClasses;
|
||||
|
||||
namespace Vanadium.Classes.DBs
|
||||
{
|
||||
public class EventDB
|
||||
{
|
||||
public static LiteDatabase EventDBFile = new LiteDatabase("Filename=" + Path.Join(Program.dataDir, "DBs", "Events.db") + ";Connection=shared");
|
||||
public static readonly ILiteCollection<PlayerEvent> Events = EventDBFile.GetCollection<PlayerEvent>("PlayerEvents");
|
||||
public static readonly ILiteCollection<PlayerEventRsvp> Responses = EventDBFile.GetCollection<PlayerEventRsvp>("PlayerEventResponses");
|
||||
|
||||
public static void Setup()
|
||||
{
|
||||
Events.EnsureIndex(x => x.CreatorPlayerId);
|
||||
Events.EnsureIndex(x => x.RoomId);
|
||||
Events.EnsureIndex(x => x.StartTime);
|
||||
Responses.EnsureIndex(x => x.PlayerEventId);
|
||||
Responses.EnsureIndex(x => x.PlayerId);
|
||||
}
|
||||
|
||||
private static long GetNextEventId()
|
||||
{
|
||||
if (Events.Count() == 0) return 1;
|
||||
return Events.Max(x => x.PlayerEventId) + 1;
|
||||
}
|
||||
|
||||
private static long GetNextResponseId()
|
||||
{
|
||||
if (Responses.Count() == 0) return 1;
|
||||
return Responses.Max(x => x.PlayerEventResponseId) + 1;
|
||||
}
|
||||
|
||||
public static PlayerEventResponse CreatePlayerEvent(long creatorPlayerId, PlayerEventRequest request)
|
||||
{
|
||||
if (Sanitize.ContainsSwears(request.Name) || Sanitize.ContainsSwears(request.Description))
|
||||
return new PlayerEventResponse { PlayerEvent = null, Result = 14 };
|
||||
try
|
||||
{
|
||||
string imageName = request.ImageName ?? string.Empty;
|
||||
if (string.IsNullOrWhiteSpace(imageName))
|
||||
{
|
||||
var room = RoomDB.Rooms.FindById(request.RoomId);
|
||||
imageName = room?.ImageName ?? string.Empty;
|
||||
}
|
||||
|
||||
var playerEvent = new PlayerEvent
|
||||
{
|
||||
PlayerEventId = GetNextEventId(),
|
||||
CreatorPlayerId = creatorPlayerId,
|
||||
Name = request.Name ?? string.Empty,
|
||||
Description = request.Description ?? string.Empty,
|
||||
Accessibility = request.Accessibility,
|
||||
ClubId = request.ClubId,
|
||||
RoomId = request.RoomId,
|
||||
SubRoomId = request.SubRoomId,
|
||||
StartTime = DateTime.Parse(request.StartTime),
|
||||
EndTime = DateTime.Parse(request.EndTime),
|
||||
ImageName = imageName,
|
||||
State = 0,
|
||||
AttendeeCount = 0,
|
||||
Tags = (request.Tags ?? new List<string>())
|
||||
.Select(t => new PlayerEventTag { Tag = t, Type = 0 })
|
||||
.ToList(),
|
||||
CreatedAt = DateTime.UtcNow,
|
||||
CanRequestBroadcastPermissions = request.CanRequestBroadcastPermissions,
|
||||
DefaultBroadcastPermissions = request.DefaultBroadcastPermissions,
|
||||
IsMultiInstance = request.IsMultiInstance,
|
||||
SupportMultiInstanceRoomChat = request.SupportMultiInstanceRoomChat
|
||||
};
|
||||
|
||||
Events.Insert(playerEvent);
|
||||
|
||||
return new PlayerEventResponse
|
||||
{
|
||||
PlayerEvent = playerEvent,
|
||||
Result = 0
|
||||
};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"[EventDB] Error creating player event: {ex.Message}");
|
||||
return new PlayerEventResponse
|
||||
{
|
||||
PlayerEvent = null,
|
||||
Result = -1
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public static PlayerEventRsvp? SetResponse(long playerEventId, long playerId, int type)
|
||||
{
|
||||
var existing = Responses.FindOne(x => x.PlayerEventId == playerEventId && x.PlayerId == playerId);
|
||||
|
||||
if (existing != null)
|
||||
{
|
||||
existing.Type = type;
|
||||
Responses.Update(existing);
|
||||
return existing;
|
||||
}
|
||||
|
||||
var response = new PlayerEventRsvp
|
||||
{
|
||||
PlayerEventResponseId = GetNextResponseId(),
|
||||
PlayerEventId = playerEventId,
|
||||
PlayerId = playerId,
|
||||
Type = type,
|
||||
CreatedAt = DateTime.UtcNow
|
||||
};
|
||||
|
||||
Responses.Insert(response);
|
||||
|
||||
if (type == (int)PlayerEventResponseType.Yes)
|
||||
{
|
||||
var ev = Events.FindById(playerEventId);
|
||||
if (ev != null)
|
||||
{
|
||||
ev.AttendeeCount++;
|
||||
Events.Update(ev);
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
public static PlayerEventRsvp? GetResponse(long playerEventId, long playerId)
|
||||
{
|
||||
return Responses.FindOne(x => x.PlayerEventId == playerEventId && x.PlayerId == playerId);
|
||||
}
|
||||
|
||||
public static List<PlayerEventRsvp> GetResponsesForEvent(long playerEventId)
|
||||
{
|
||||
return Responses.Find(x => x.PlayerEventId == playerEventId).ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEventRsvp> GetResponsesForPlayer(long playerId)
|
||||
{
|
||||
return Responses.Find(x => x.PlayerId == playerId).ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> GetPlayerEvents(long creatorPlayerId)
|
||||
{
|
||||
return Events.Find(x => x.CreatorPlayerId == creatorPlayerId).ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> GetAttendingEvents(long playerId)
|
||||
{
|
||||
var attendingIds = Responses
|
||||
.Find(x => x.PlayerId == playerId && x.Type == (int)PlayerEventResponseType.Yes)
|
||||
.Select(x => x.PlayerEventId)
|
||||
.ToHashSet();
|
||||
|
||||
return Events
|
||||
.FindAll()
|
||||
.Where(e => attendingIds.Contains(e.PlayerEventId) && e.CreatorPlayerId != playerId)
|
||||
.OrderByDescending(e => e.StartTime)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> GetHostingEvents(long playerId)
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
return Events
|
||||
.Find(x => x.CreatorPlayerId == playerId)
|
||||
.Where(e => e.EndTime >= now)
|
||||
.OrderBy(e => e.StartTime)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> GetEventsByRoomId(long roomId)
|
||||
{
|
||||
return Events
|
||||
.FindAll()
|
||||
.Where(e => e.RoomId == roomId)
|
||||
.OrderByDescending(e => e.StartTime)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public static PlayerEvent? GetPlayerEventById(long eventId)
|
||||
{
|
||||
return Events.FindById(eventId);
|
||||
}
|
||||
|
||||
public static bool DeletePlayerEvent(long eventId, long creatorPlayerId)
|
||||
{
|
||||
var playerEvent = Events.FindById(eventId);
|
||||
if (playerEvent == null || playerEvent.CreatorPlayerId != creatorPlayerId)
|
||||
return false;
|
||||
|
||||
Responses.DeleteMany(x => x.PlayerEventId == eventId);
|
||||
return Events.Delete(eventId);
|
||||
}
|
||||
|
||||
public static PlayerEvent? EditPlayerEvent(long eventId, long editorPlayerId, Action<PlayerEvent> mutate)
|
||||
{
|
||||
var ev = Events.FindById(eventId);
|
||||
if (ev == null || ev.CreatorPlayerId != editorPlayerId)
|
||||
return null;
|
||||
|
||||
mutate(ev);
|
||||
Events.Update(ev);
|
||||
return ev;
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> GetAllEvents()
|
||||
{
|
||||
return Events.FindAll()
|
||||
.OrderByDescending(e => e.StartTime)
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public static List<LivePlayerEvent> GetLiveEvents()
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
return Events.FindAll()
|
||||
.Where(e => e.StartTime <= now && e.EndTime >= now)
|
||||
.OrderByDescending(e => e.AttendeeCount)
|
||||
.Select(e => new LivePlayerEvent
|
||||
{
|
||||
PlayerEventId = e.PlayerEventId,
|
||||
CreatorPlayerId = e.CreatorPlayerId,
|
||||
Name = e.Name,
|
||||
Description = e.Description,
|
||||
Accessibility = e.Accessibility,
|
||||
ClubId = e.ClubId,
|
||||
RoomId = e.RoomId,
|
||||
SubRoomId = e.SubRoomId,
|
||||
StartTime = e.StartTime,
|
||||
EndTime = e.EndTime,
|
||||
ImageName = e.ImageName,
|
||||
State = e.State,
|
||||
AttendeeCount = e.AttendeeCount,
|
||||
CanRequestBroadcastPermissions = e.CanRequestBroadcastPermissions,
|
||||
DefaultBroadcastPermissions = e.DefaultBroadcastPermissions,
|
||||
IsMultiInstance = e.IsMultiInstance,
|
||||
SupportMultiInstanceRoomChat = e.SupportMultiInstanceRoomChat,
|
||||
Tags = e.Tags,
|
||||
IsFull = Sessions.IsInstanceActuallyFull(e.PlayerEventId),
|
||||
PlayerCount = PlayerDB.Players.FindAll()
|
||||
.Count(p => p.Player?.PlayerExtra?.Heartbeat?.roomInstance?.eventId == e.PlayerEventId
|
||||
&& p.Player.PlayerExtra.Heartbeat.isOnline)
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public static List<PlayerEvent> SearchEvents(string? query, string? sort, string? scheduleFilter)
|
||||
{
|
||||
var now = DateTime.UtcNow;
|
||||
var twoWeeks = now.AddDays(14);
|
||||
|
||||
var all = Events.FindAll().AsEnumerable();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(scheduleFilter))
|
||||
{
|
||||
var filter = scheduleFilter.ToLowerInvariant();
|
||||
if (filter == "upcoming")
|
||||
all = all.Where(e => e.StartTime > now && e.StartTime <= twoWeeks);
|
||||
else if (filter == "live")
|
||||
all = all.Where(e => e.StartTime <= now && e.EndTime >= now);
|
||||
else if (filter == "past")
|
||||
all = all.Where(e => e.EndTime < now);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(query))
|
||||
{
|
||||
var q = query.Trim();
|
||||
|
||||
if (q.StartsWith("#"))
|
||||
{
|
||||
var tag = q.Substring(1).ToLowerInvariant();
|
||||
all = all.Where(e => e.Tags != null && e.Tags.Any(t => t.Tag.ToLowerInvariant().Contains(tag)));
|
||||
}
|
||||
else
|
||||
{
|
||||
var ql = q.ToLowerInvariant();
|
||||
all = all.Where(e =>
|
||||
(e.Name ?? "").ToLowerInvariant().Contains(ql) ||
|
||||
(e.Description ?? "").ToLowerInvariant().Contains(ql) ||
|
||||
(e.Tags != null && e.Tags.Any(t => t.Tag.ToLowerInvariant().Contains(ql))));
|
||||
}
|
||||
}
|
||||
|
||||
var results = all.ToList();
|
||||
|
||||
var sortKey = sort?.ToLowerInvariant() ?? "";
|
||||
results = sortKey switch
|
||||
{
|
||||
"starttime" => results.OrderBy(e => e.StartTime).ToList(),
|
||||
"endtime" => results.OrderBy(e => e.EndTime).ToList(),
|
||||
"attendance" => results.OrderByDescending(e => e.AttendeeCount).ToList(),
|
||||
"createdat" => results.OrderByDescending(e => e.CreatedAt).ToList(),
|
||||
_ => results.OrderBy(e => e.StartTime).ToList()
|
||||
};
|
||||
|
||||
return results;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user