Files
BuYuHouDuan/FishGameSrc/FishGameService/Subscribers/BackgroundAssetSubscriber.cs
T
2026-10-12 16:22:04 +08:00

60 lines
2.4 KiB
C#

using Common.Redis;
using CommonDomain;
using DotNetCore.CAP;
using FishGameService.GameSend;
using Microsoft.Extensions.Logging;
using RedisHelper;
using RedisService;
namespace FishGameService.Subscribers
{
public class BackgroundAssetSubscriber : ICapSubscribe
{
private readonly IRedisService _redisService;
private readonly IFishingSendService _sendResult;
private readonly IDistributedLock _distributedLock;
public BackgroundAssetSubscriber(
IRedisService redisService,
IFishingSendService sendResult,
IDistributedLock distributedLock)
{
_redisService = redisService;
_sendResult = sendResult;
_distributedLock = distributedLock;
}
[CapSubscribe("BackgroundOperation.NotifyUser")]
public Task HandleNotify(BackgroundOperationNotifyMessage message)
{
if (string.IsNullOrWhiteSpace(message.UserId) || message.CurrencyType != 1 || message.Amount <= 0)
return Task.CompletedTask;
var session = _redisService.GetRedisUserCId(message.UserId);
if (string.IsNullOrWhiteSpace(session?.RoomId) || string.IsNullOrWhiteSpace(session.CId))
return Task.CompletedTask;
var lockKey = $"{RedisKey.DistributedLockPrefix}fish:gold:{session.RoomId}:{message.UserId}";
_ = _distributedLock.TryExecuteAsync(lockKey, () =>
{
var room = _redisService.GetGameRoom(session.RoomId);
var player = room?.Players?.FirstOrDefault(p => p.UserId == message.UserId && !p.IsBot);
if (room == null || player == null)
return Task.CompletedTask;
var changeGold = message.ChangeType == 2 ? -message.Amount : message.Amount;
var beforeGold = player.Gold;
player.Gold = Math.Max(0L, checked(player.Gold + changeGold));
if (player.Gold > player.MaxGold) player.MaxGold = player.Gold;
player.BeginCoin = Math.Max(0L, checked(player.BeginCoin + changeGold));
_redisService.SetGameRoom(room);
_sendResult.SyncPlayerGold(session.CId, player.Gold);
return Task.CompletedTask;
}, expiry: 10, retry: true, retryDelay: 100);
return Task.CompletedTask;
}
}
}