using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using RadicadeServer.API.Notifications; using RadicadeServer.DB; using RadicadeServer.Extensions; using RadicadeServer.RecNet.Enums.Messages; using RadicadeServer.RecNet.Messages; using RadicadeServer.RecNet.Responses; namespace RadicadeServer.API.Messages { [Route("api/messages/")] public class MessagesAPI : Controller { RecDBContext db; public MessagesAPI(RecDBContext context) { this.db = context; } [HttpGet("v1/favoriteFriendOnlineStatus"), Authorize] public async Task NotifyFavoriteFriends() { var userId = User.GetUserId(); var favoritedUsers = await db.Relationships.Where(x => x.AccountId == userId && x.Favorited != RecNet.Relationships.ReciprocalStatus.None).ToListAsync(); foreach (var favorited in favoritedUsers) { var presence = await db.Presences.FirstOrDefaultAsync(x => x.isOnline && x.playerId == favorited.PlayerId); if (presence != null) await Notify.SendMessage(favorited.AccountId, new Message { FromPlayerId = (long)userId!, Type = MessageType.FriendStatusOnline }); } return new Success(true, null, null); } [HttpGet("v2/get"), Authorize] public async Task?> GetMessages() { var userId = User.GetUserId(); return await db.Messages.Where(x => x.ToPlayerId == userId && !x.IsDismissed).ToListAsync(); } [HttpPost("v3/delete"), Authorize] public async Task DeleteMessage([FromBody] DeleteMessageRequestDTO req) { var userId = User.GetUserId(); if (req.MessageIds == null || req.MessageIds.Count == 0) return new Success(false, "Invalid Ids", null); int deleted = 0; foreach (var id in req.MessageIds) { var msg = await db.Messages.FirstOrDefaultAsync(x => x.Id == id && x.ToPlayerId == userId); if (msg == null) { continue; } if (msg.Type == MessageType.GameInviteV2 || msg.Type == MessageType.GameInvite) msg.IsDismissed = true; else db.Messages.Remove(msg); deleted++; } await db.SaveChangesAsync(); return new Success(true, null, null); } [HttpPost("v2/send"), Authorize] public async Task SendMessage([FromForm] long ToPlayerId, [FromForm] MessageType Type, [FromForm] string? Data, [FromForm] long? RoomId) { var userId = User.GetUserId(); await Notify.SendMessage(ToPlayerId, new Message { FromPlayerId = (long)userId!, Type = Type, Data = Data ?? "", RoomId = RoomId }); return new Success(true, null, null); } [HttpPost("v1/sendMultiple"), Authorize] public async Task SendMultipleMessages([FromBody] SendMultipleMessagesRequestDTO req) { var userId = User.GetUserId(); if (userId == null) return new Success(false, "Not signed in", null); var recipients = (req.ToPlayerIds ?? new List()) .Where(id => id > 0) .Distinct() .ToList(); if (recipients.Count == 0) return new Success(false, "ToPlayerIds is required", null); foreach (var toPlayerId in recipients) await Notify.SendMessage(toPlayerId, new Message { FromPlayerId = userId.Value, Type = req.Type, Data = req.Data ?? "" }); return new Success(true, null, null); } [HttpPost("v1/friendOnlineStatus"), Authorize] public async Task FriendOnlineStatus() { var userId = User.GetUserId(); if (userId == null) return new Success(false, "Not signed in", null); var friendIds = await db.Relationships.AsNoTracking() .Where(x => x.AccountId == userId && x.RelationshipType == RecNet.Relationships.RelationshipType.Friend) .Select(x => x.PlayerId) .ToListAsync(); var onlineCount = friendIds.Count == 0 ? 0 : await db.Presences.AsNoTracking() .CountAsync(p => friendIds.Contains(p.playerId) && p.isOnline); return new Success(true, null, new { FriendsOnlineCount = onlineCount }); } } }