Files
2025-05-01 07:20:41 +09:00

200 lines
8.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using MySqlConnector;
using ServerCore; using ServerBase;
using ServerCommon;
using GameServer;
using GameServer.NFT;
namespace GameServer
{
public static class NFTHelper
{
public static async Task<(ServerErrorCode, string)> getEOA(string accountGuid)
{
var err_msg = string.Empty;
try
{
string eoa = string.Empty;
var read_func = delegate (MySqlDataReader dataReader)
{
eoa = dataReader.GetString("eoa");
return ServerErrorCode.Success;
};
var server_logic = GameServerApp.getServerLogic();
var result = await MySqlConnectorHelper.simpleQueryExecuteForReaderAsync( $"SELECT * FROM wallet_user WHERE id = '{accountGuid}'"
, read_func
, server_logic.getServerConfig().AccountNftDb );
if(result.isFail())
{
err_msg = $"Failed to simpleQueryExecuteForReaderAsync() !!! : {result.toBasicString()} - accountId:{accountGuid}";
Log.getLogger().error($"{err_msg}");
return (result.getErrorCode(), "");
}
return (ServerErrorCode.Success, eoa);
}
catch (Exception e)
{
Log.getLogger().error($"Exception !!! : {e}");
return (ServerErrorCode.MySqlDbQueryException, string.Empty);
}
}
public static async Task<List<MySqlTokenInfo>?> loadLandNFT()
{
var err_msg = string.Empty;
try
{
var mysql_token_infos = new List<MySqlTokenInfo>();
var read_func = delegate (MySqlDataReader dataReader)
{
var mysql_token_info = new MySqlTokenInfo();
mysql_token_info.contract_address = dataReader.GetString("contract_address");
mysql_token_info.token_id = dataReader.GetInt32("token_id");
mysql_token_info.owner = dataReader.GetString("owner");
mysql_token_info.staker = dataReader.IsDBNull("staker") ? string.Empty : dataReader.GetString("staker");
mysql_token_info.is_staked = dataReader.GetInt32("is_staked");
mysql_token_info.updated_at = dataReader.GetDateTime("updated_at");
mysql_token_infos.Add(mysql_token_info);
return ServerErrorCode.Success;
};
var server_logic = GameServerApp.getServerLogic();
var result = await MySqlConnectorHelper.simpleQueryExecuteForReaderAsync( $"SELECT * FROM wallet_user WHERE contract_address = '{ServerCommon.Constant.LAND_NFT_CONTRACT_ADDRESS}'"
, read_func
, server_logic.getServerConfig().AccountNftDb );
if(result.isFail())
{
err_msg = $"Failed to simpleQueryExecuteForReaderAsync() !!! : {result.toBasicString()}";
Log.getLogger().error($"{err_msg}");
return null;
}
return mysql_token_infos;
}
catch (Exception e)
{
Log.getLogger().error($"{e}");
return null;
}
}
public static async Task<(ServerErrorCode, List<MySqlTokenInfo>?)> getLandNFTs(string eoa)
{
var err_msg = string.Empty;
try
{
var mysql_token_infos = new List<MySqlTokenInfo>();
var read_func = delegate (MySqlDataReader dataReader)
{
var mysql_token_info = new MySqlTokenInfo();
mysql_token_info.contract_address = dataReader.GetString("contract_address");
mysql_token_info.token_id = dataReader.GetInt32("token_id");
mysql_token_info.owner = dataReader.GetString("owner");
mysql_token_info.staker = dataReader.IsDBNull("staker") ? string.Empty : dataReader.GetString("staker");
mysql_token_info.is_staked = dataReader.GetInt32("is_staked");
mysql_token_info.updated_at = dataReader.GetDateTime("updated_at");
mysql_token_infos.Add(mysql_token_info);
return ServerErrorCode.Success;
};
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!!");
var result = await MySqlConnectorHelper.simpleQueryExecuteForReaderAsync( $"SELECT * FROM wallet_user WHERE contract_address = '{ServerCommon.Constant.LAND_NFT_CONTRACT_ADDRESS}'"
, read_func
, server_logic.getServerConfig().AccountNftDb );
if(result.isFail())
{
err_msg = $"Failed to simpleQueryExecuteForReaderAsync() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
}
return (ServerErrorCode.Success, mysql_token_infos);
}
catch (Exception e)
{
Log.getLogger().error($"Exception !!! : {e}");
return (ServerErrorCode.MySqlDbQueryException, null);
}
}
static public async Task<(Result, bool)> hasStakedNft(string? jwt)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => "server_logic is null !!!");
var server_config = server_logic.getServerConfig();
NullReferenceCheckHelper.throwIfNull(server_config, () => "server_config is null !!!");
if (server_config.OfflineMode == true)
{
result.setFail(ServerErrorCode.ServerOfflineModeEnable);
return (result, false);
}
var full_url = server_config.NftRule.CPNftForOwnerAllGetUrl;
(bool isSuccess, string resMsg) = await HttpClientHelper.sendHttpRequest("GET"
, full_url, jwt, null
, "application/json"
, "caliverse", "1.0" );
if (isSuccess == false)
{
err_msg = $"Failed to sendWebServer() !!!, in getCPNftForOwnerAll() : resMsg:{resMsg}, targetUrl:{full_url}, jwt:{jwt}";
result.setFail(ServerErrorCode.NftForOwnerAllGetFailed, err_msg);
Log.getLogger().error(err_msg);
return (result, false);
}
var nft_infos = JsonConvert.DeserializeObject<List<NFTInfo>>(resMsg);
NullReferenceCheckHelper.throwIfNull(nft_infos, () => $"nft_infos is null !!!");
var is_found = nft_infos.Any(nft => nft.IsStaked == 1);
if (false == is_found)
{
err_msg = $"Not found Staked NFT !!!, in getCPNftForOwnerAll() : targetUrl:{full_url}, jwt:{jwt}";
Log.getLogger().warn(err_msg);
return (result, false);
}
return (result, true);
}
}
}