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?> loadLandNFT() { var err_msg = string.Empty; try { var mysql_token_infos = new List(); 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?)> getLandNFTs(string eoa) { var err_msg = string.Empty; try { var mysql_token_infos = new List(); 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>(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); } } }