60 lines
2.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|