초기커밋
This commit is contained in:
260
ServerCommon/Cache/FriendReqCacheRequest.cs
Normal file
260
ServerCommon/Cache/FriendReqCacheRequest.cs
Normal file
@@ -0,0 +1,260 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
using StackExchange.Redis;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace ServerCommon;
|
||||
|
||||
public class FriendRequestCache : CacheBase
|
||||
{
|
||||
[JsonProperty("sender_guid")]
|
||||
public string m_sender_guid { get; set; } = string.Empty;
|
||||
[JsonProperty("receiver_guid")]
|
||||
public string m_receiver_guid { get; set; } = string.Empty;
|
||||
[JsonProperty("is_new")]
|
||||
public Int32 m_is_new { get; set; } = 0;
|
||||
[JsonProperty("request_time")]
|
||||
public DateTime m_request_time { get; set; } = new();
|
||||
|
||||
public FriendRequestCache(string sender, string receiver, bool isNew, DateTime requestTime)
|
||||
{
|
||||
m_sender_guid = sender;
|
||||
m_receiver_guid = receiver;
|
||||
m_is_new = isNew ? 1: 0;
|
||||
m_request_time = requestTime;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class FriendReqCacheRequest : RedisRequestPrivateBase
|
||||
{
|
||||
private string m_guid = string.Empty;
|
||||
private string m_friend_guid = string.Empty;
|
||||
|
||||
public FriendReqCacheRequest(UserBase owner, string myGuid, string friendGuid, RedisConnector redisConnector)
|
||||
: base(owner, redisConnector)
|
||||
{
|
||||
m_guid = myGuid;
|
||||
m_friend_guid = friendGuid;
|
||||
}
|
||||
|
||||
public FriendReqCacheRequest(UserBase owner, string myGuid, RedisConnector redisConnector)
|
||||
: base(owner, redisConnector)
|
||||
{
|
||||
m_guid = myGuid;
|
||||
m_friend_guid = string.Empty;
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"SendedFriendRequestCache: In:m_guid:{m_guid}";
|
||||
}
|
||||
|
||||
protected override string onMakeKey()
|
||||
{
|
||||
return $"friendrequest:{m_guid}";
|
||||
}
|
||||
|
||||
private string makeSendKey(string guid)
|
||||
{
|
||||
return $"sendedfriendrequest:{guid}";
|
||||
}
|
||||
|
||||
private string makeRecvKey(string guid)
|
||||
{
|
||||
return $"receivedfriendrequest:{guid}";
|
||||
}
|
||||
|
||||
public async Task<List<FriendRequestCache>> getSendedFriendRequests()
|
||||
{
|
||||
var database = getDatabase();
|
||||
|
||||
string key = makeSendKey(m_guid);
|
||||
|
||||
List<FriendRequestCache> sendedFriendRequests = new();
|
||||
try
|
||||
{
|
||||
var hashes = await database.HashGetAllAsync(key, CommandFlags.PreferReplica);
|
||||
|
||||
//여기서 가져와서 RequestList로 만들어줘야 한다.
|
||||
foreach (var entry in hashes)
|
||||
{
|
||||
// RedisValue를 문자열로 변환하여 JSON 디시리얼라이즈
|
||||
var value_string = entry.Value.ToString();
|
||||
var obj = JsonConvert.DeserializeObject<FriendRequestCache>(value_string);
|
||||
if(obj == null)
|
||||
{
|
||||
string err_msg = $"Failed to get FriendCache from Redis !!! : : value_string:{entry.Value} - {getOwner().toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
continue;
|
||||
}
|
||||
|
||||
var is_active = await deleteOldRequest(obj.m_request_time, obj.m_sender_guid, obj.m_receiver_guid);
|
||||
if (is_active)
|
||||
{
|
||||
sendedFriendRequests.Add(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
string err_msg = $"Failed to get FriendCache from Redis !!! : : errMsg:{e.Message} - {getOwner().toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return new();
|
||||
|
||||
}
|
||||
|
||||
return sendedFriendRequests;
|
||||
}
|
||||
|
||||
public async Task<List<FriendRequestCache>> getReceivedFriendRequests()
|
||||
{
|
||||
var database = getDatabase();
|
||||
|
||||
string key = makeRecvKey(m_guid);
|
||||
List<FriendRequestCache> recvedFriendRequests = new();
|
||||
try
|
||||
{
|
||||
var hashes = await database.HashGetAllAsync(key, CommandFlags.PreferReplica);
|
||||
|
||||
//여기서 가져와서 RequestList로 만들어줘야 한다.
|
||||
foreach (var entry in hashes)
|
||||
{
|
||||
var value_string = entry.Value.ToString();
|
||||
var obj = JsonConvert.DeserializeObject<FriendRequestCache>(value_string);
|
||||
if (obj == null)
|
||||
{
|
||||
string err_msg = $"Failed to get FriendCache from Redis !!! : : value_string:{value_string} - {getOwner().toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
continue;
|
||||
}
|
||||
var is_active = await deleteOldRequest(obj.m_request_time, obj.m_sender_guid, obj.m_receiver_guid);
|
||||
if (is_active)
|
||||
{
|
||||
recvedFriendRequests.Add(obj);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string err_msg = $"Exception !!!, Failed to get FriendCache from Redis !!! : exception:{e} - {getOwner().toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return new();
|
||||
}
|
||||
|
||||
return recvedFriendRequests;
|
||||
}
|
||||
|
||||
private async Task<bool> deleteOldRequest(DateTime requestTime, string sender, string receiver)
|
||||
{
|
||||
var now = DateTimeHelper.Current;
|
||||
|
||||
var expire_time = requestTime.AddSeconds(MetaHelper.GameConfigMeta.SentFriendRequestValidTime);
|
||||
if (now > expire_time)
|
||||
{
|
||||
await deleteCache(sender, receiver);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<Result> addFriendRequest(string senderGuid, string receiverGuid, DateTime now)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var database = getDatabase();
|
||||
var tran = database.CreateTransaction();
|
||||
{
|
||||
FriendRequestCache send_req_cache = new FriendRequestCache(senderGuid, receiverGuid, true, now);
|
||||
FriendRequestCache receuve_req_cache = new FriendRequestCache(senderGuid, receiverGuid, true, now);
|
||||
await database.HashSetAsync(makeSendKey(senderGuid), receiverGuid, JsonConvert.SerializeObject(send_req_cache));
|
||||
await database.HashSetAsync(makeRecvKey(receiverGuid), senderGuid, JsonConvert.SerializeObject(receuve_req_cache));
|
||||
}
|
||||
bool ret = tran.Execute();
|
||||
if (false == ret)
|
||||
{
|
||||
string err_msg = $"Failed to RedisHashSets Set Failed to Redis !!! : : senderGuid:{senderGuid}, receiverGuid:{receiverGuid}";
|
||||
result.setFail(ServerErrorCode.RedisHashesWriteFailed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> confirmReceivedFriendRequest()
|
||||
{
|
||||
var result = new Result();
|
||||
var database = getDatabase();
|
||||
|
||||
var redis_value = await database.HashGetAsync(makeRecvKey(m_guid), m_friend_guid, CommandFlags.PreferReplica);
|
||||
var value_string = redis_value.ToString();
|
||||
|
||||
var cache = JsonConvert.DeserializeObject<FriendRequestCache>(value_string);
|
||||
if (cache == null)
|
||||
{
|
||||
string err_msg = $"Failed to get FriendCache from Redis !!! : : redis_value:{redis_value} - {getOwner().toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
result.setFail(ServerErrorCode.RedisHashesReadFailed, err_msg);
|
||||
return result;
|
||||
}
|
||||
cache.m_is_new = 0;
|
||||
|
||||
await database.HashSetAsync(makeRecvKey(m_guid), m_friend_guid, JsonConvert.SerializeObject(cache));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> deleteFriendByReply()
|
||||
{
|
||||
var result = await deleteCache(m_friend_guid, m_guid);//수락은은 요청 받은 사람이 하는 것이므로 sender가 friendGuid
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> cancelFriendRequest()
|
||||
{
|
||||
var result = await deleteCache(m_guid, m_friend_guid);
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> refuseFriendRequest()
|
||||
{
|
||||
var result = await deleteCache(m_friend_guid, m_guid);//거절은 요청 받은 사람이 하는 것이므로 sender가 friendGuid
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> deleteCache(string senderGuid, string receiverGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var database = getDatabase();
|
||||
|
||||
var tran = database.CreateTransaction();
|
||||
{
|
||||
await database.HashDeleteAsync(makeSendKey(senderGuid), receiverGuid);
|
||||
await database.HashDeleteAsync(makeRecvKey(receiverGuid), senderGuid);
|
||||
}
|
||||
bool ret = tran.Execute();
|
||||
if (false == ret)
|
||||
{
|
||||
string err_msg = $"Failed to RedisHashSets delete Failed to Redis !!! : : senderGuid:{senderGuid}, receiverGuid:{receiverGuid}";
|
||||
result.setFail(ServerErrorCode.RedisHashesWriteFailed, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user