mirror of
https://github.com/JogmansonReal/Radicade.git
synced 2026-10-25 15:09:26 -07:00
123 lines
3.8 KiB
C#
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 });
|
|
}
|
|
}
|
|
}
|