Files
2026-10-16 23:33:13 -07:00

123 lines
3.8 KiB
C#

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<Success> 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<List<Message>?> GetMessages()
{
var userId = User.GetUserId();
return await db.Messages.Where(x => x.ToPlayerId == userId && !x.IsDismissed).ToListAsync();
}
[HttpPost("v3/delete"), Authorize]
public async Task<Success?> 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<Success> 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<Success> 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<long>())
.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<Success> 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 });
}
}
}