mirror of
https://github.com/JogmansonReal/Radicade.git
synced 2026-10-26 23:49:02 -07:00
Radicade Public Code
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
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 });
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user