초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,385 @@
using System.ComponentModel;
using ServerCore; using ServerBase;
using StackExchange.Redis;
using USER_GUID = System.String;
namespace ServerCommon.Cache;
public class CaliumConverterManageCacheRequest : RedisRequestSharedBase
{
private const int DefaultManageExpireMinute = 1;
private const string LastDateKey = "lastdate";
private const string CaliumKey = "calium";
// in
// out
public CaliumConverterManageCacheRequest(RedisConnector redisConnector) : base("CaliumConverterManage", redisConnector)
{
}
protected override string onMakeKey() => "caliumConverter:manage";
private string getStartRunningKey() => $"{onMakeKey()}:start";
private string getDailyCaliumForUserKey(int day)
{
var base_key = $"{onMakeKey()}:daily";
base_key = $"{base_key}:{day}";
return base_key;
}
public override string toBasicString() => "CaliumConverterManageCacheRequest";
public async Task<bool> startCaliumConverterManage()
{
var result = new Result();
try
{
result = await onPrepareRequest();
if (result.isFail()) return false;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var redis_value = await database.StringSetAsync(getStartRunningKey(), DateTimeHelper.Current.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(DefaultManageExpireMinute), When.NotExists);
if (false == redis_value) return false;
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return false;
}
return true;
}
public async Task<DateTime?> getLastFillUpDailyCaliumDate()
{
var result = new Result();
var last_fill_up_date = DateTimeHelper.MinTime;
try
{
result = await onPrepareRequest();
if (result.isFail()) return null;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var redis_value = await database.HashGetAsync(onMakeKey(), LastDateKey);
if (redis_value.IsNullOrEmpty) return null;
DateTime.TryParse(redis_value, out last_fill_up_date);
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return null;
}
return last_fill_up_date;
}
public async Task<Result> setLastFillUpDailyCaliumDate(string lastRunningDate)
{
var result = new Result();
try
{
result = await onPrepareRequest();
if (result.isFail()) return result;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
_ = await database.HashSetAsync(onMakeKey(), LastDateKey, lastRunningDate);
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
}
return result;
}
public async Task<double> fillUpDailyCalium(double fillUpCalium)
{
var result = new Result();
var is_first = false;
// 1. Last fill up daily date 체크
var last_date = await getLastFillUpDailyCaliumDate();
if (null == last_date) is_first = true;
if (fillUpCalium == 0 && !is_first) return 0;
if(is_first) fillUpCalium += (double)MetaHelper.GameConfigMeta.CaliumConverterInitialValue;
// 2. fill up calium
result = await changeTotalCaliumAsync(fillUpCalium);
if (result.isFail()) return -1;
return fillUpCalium;
}
public async Task<Result> changeTotalCaliumAsync(double calium)
{
var result = new Result();
try
{
result = await onPrepareRequest();
if (result.isFail()) return result;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var redis_value = await database.HashIncrementAsync(onMakeKey(), CaliumKey, calium);
if (redis_value < 0)
{
var err_msg = $"fail to change daily cailum : change calium - {calium}";
result.setFail(ServerErrorCode.RedisHashesWriteFailed, err_msg);
Log.getLogger().error(err_msg);
return result;
}
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
}
return result;
}
public async Task<bool> isExist(bool isTotal, int day)
{
var result = new Result();
try
{
result = await onPrepareRequest();
if (result.isFail()) return false;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var key = (isTotal) ? onMakeKey() : getDailyCaliumForUserKey(day);
var redis_value = await database.KeyExistsAsync(key);
return redis_value;
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get exist key !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return false;
}
}
public async Task<decimal> getTotalCaliumAsync()
{
var result = new Result();
decimal calium;
try
{
result = await onPrepareRequest();
if (result.isFail()) return -1;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var redis_value = await database.HashGetAsync(onMakeKey(), CaliumKey);
if (redis_value.IsNullOrEmpty) return -1;
redis_value.ToString().toDecimal(out calium);
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return -1;
}
return calium;
}
public async Task<Result> changeCaliumForUserPerDailyAsync(USER_GUID userGuid, double calium, int day)
{
var result = new Result();
try
{
result = await onPrepareRequest();
if (result.isFail())
{
result.setFail(ServerErrorCode.RedisHashesWriteFailed, $"failed to prepare request for redis: {nameof(changeCaliumForUserPerDailyAsync)}");
return result;
};
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var key = getDailyCaliumForUserKey(day);
var redis_value = await database.HashIncrementAsync(key, userGuid, calium);
await setTtlCaliumForUserPerDailyAsync(key);
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg = $"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
}
return result;
}
public async Task<Dictionary<USER_GUID, double>?> getCaliumForUserPerDailyCountAsync(int day)
{
var result = new Result();
var list = new Dictionary<USER_GUID, double>();
try
{
result = await onPrepareRequest();
if (result.isFail()) return null;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var key = getDailyCaliumForUserKey(day);
var redis_values = await database.HashGetAllAsync(key);
foreach (var value in redis_values)
{
value.Value.ToString().toDecimal(out var calium);
var user_guid = value.Name.ToString();
list.Add(user_guid, (double)calium);
}
return list;
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg =
$"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return null;
}
}
public async Task<double> getCaliumForUserPerDailyAsync(USER_GUID userGuid, int day)
{
var result = new Result();
double daily_calium;
try
{
result = await onPrepareRequest();
if (result.isFail()) return 0;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
var key = getDailyCaliumForUserKey(day);
var redis_value = await database.HashGetAsync(key, userGuid);
if (redis_value.IsNullOrEmpty)
{
daily_calium = (double)MetaHelper.GameConfigMeta.CaliumConverterLimitPerPerson;
_ = await database.HashSetAsync(key, userGuid, daily_calium);
await setTtlCaliumForUserPerDailyAsync(key);
}
else
{
redis_value.TryParse(out daily_calium);
}
if (daily_calium < 0) daily_calium = 0;
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg =
$"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
return -1;
}
return daily_calium;
}
private async Task<Result> setTtlCaliumForUserPerDailyAsync(string key)
{
var result = new Result();
try
{
result = await onPrepareRequest();
if (result.isFail()) return result;
var database = getDatabase();
NullReferenceCheckHelper.throwIfNull(database, () => $"database is null !!!");
// 1. 현재 ttl 설정 확인
var redis_value = await database.KeyTimeToLiveAsync(key);
if (null != redis_value)
{
return result;
}
// 2. ttl 시간 생성
var current = DateTimeHelper.Current;
var base_time = new DateTime(current.Year, current.Month, current.Day,
MetaHelper.GameConfigMeta.CaliumConverterPivotTime, 0, 0);
TimeSpan check;
if (current < base_time) check = base_time - current;
else check = base_time.AddDays(1) - current;
// 3. ttl 설정
_ = await database.KeyExpireAsync(key, check);
}
catch (Exception e)
{
var error_code = ServerErrorCode.TryCatchException;
var err_msg =
$"Failed to get CaliumConverterManageCache from Redis !!! : : errorCode{error_code}, errMsg:{e.Message}";
result.setFail(error_code, err_msg);
Log.getLogger().error(result.toBasicString());
}
return result;
}
}