2021-01-04 04:26:10 +00:00
using MySql.Data.MySqlClient ;
using Nini.Config ;
using OpenMetaverse ;
using OpenSim.Framework ;
using OpenSim.Services.Interfaces ;
using System ;
using System.Collections.Generic ;
using System.Diagnostics ;
using System.IO ;
using System.Linq ;
using System.Net ;
using System.Text ;
using System.Threading.Tasks ;
using static OpenMetaverse . Primitive ;
namespace GetRegionTextures
{
class GetRegionTextures
{
private static MySqlConnection m_mySQLConnection = null ;
2021-01-04 04:48:33 +00:00
private static String m_assetURL = "http://127.0.0.1:8002/assets/" ;
2021-01-04 04:26:10 +00:00
private static List < UUID > m_assets = new List < UUID > ( ) ;
private static List < MySQLPrimObject > getAllScenePrims ( String regionID )
{
List < MySQLPrimObject > returnData = new List < MySQLPrimObject > ( ) ;
MySqlCommand _mysqlCommand = m_mySQLConnection . CreateCommand ( ) ;
_mysqlCommand . CommandTimeout = int . MaxValue ;
_mysqlCommand . CommandText = "SELECT prims.Name,prims.UUID,primshapes.Texture FROM prims LEFT JOIN primshapes ON prims.UUID = primshapes.UUID WHERE RegionUUID = ?RegionUUID" ;
_mysqlCommand . Parameters . AddWithValue ( "RegionUUID" , regionID ) ;
MySqlDataReader _commandReader = _mysqlCommand . ExecuteReader ( ) ;
while ( _commandReader . Read ( ) )
returnData . Add ( new MySQLPrimObject ( _commandReader . GetString ( 0 ) , _commandReader . GetString ( 1 ) , ( byte [ ] ) _commandReader [ "Texture" ] ) ) ;
_commandReader . Close ( ) ;
return returnData ;
}
private static List < String > getAllRegionIDsFromStorage ( )
{
List < String > returnData = new List < String > ( ) ;
MySqlCommand _mysqlCommand = m_mySQLConnection . CreateCommand ( ) ;
_mysqlCommand . CommandTimeout = int . MaxValue ;
_mysqlCommand . CommandText = "SELECT RegionUUID FROM terrain" ;
MySqlDataReader _commandReader = _mysqlCommand . ExecuteReader ( ) ;
while ( _commandReader . Read ( ) )
returnData . Add ( _commandReader . GetString ( 0 ) ) ;
_commandReader . Close ( ) ;
return returnData ;
}
2021-01-04 04:48:33 +00:00
public static Stream GenerateStreamFromString ( string s )
{
var stream = new MemoryStream ( ) ;
var writer = new StreamWriter ( stream ) ;
writer . Write ( s ) ;
writer . Flush ( ) ;
stream . Position = 0 ;
return stream ;
}
2021-01-04 04:26:10 +00:00
static void Main ( string [ ] args )
{
2021-01-04 04:48:33 +00:00
if ( File . Exists ( "ffmpeg.exe" ) )
{
Console . WriteLine ( "Cant find ffmpeg.exe" ) ;
Console . ReadLine ( ) ;
2021-01-04 04:26:10 +00:00
return ;
2021-01-04 04:48:33 +00:00
}
String config = "" ;
2021-01-04 04:26:10 +00:00
2021-01-04 04:48:33 +00:00
if ( File . Exists ( "OpenSim.ini" ) )
config + = File . ReadAllText ( "OpenSim.ini" ) + "\n" ;
if ( File . Exists ( "config-include/GridCommon.ini" ) )
config + = File . ReadAllText ( "config-include/GridCommon.ini" ) + "\n" ;
IConfigSource source = new IniConfigSource ( GenerateStreamFromString ( config ) ) ;
source . ExpandKeyValues ( ) ;
2021-01-04 04:26:10 +00:00
if ( source . Configs [ "DatabaseService" ] = = null )
return ;
2021-01-04 04:48:33 +00:00
if ( source . Configs [ "HGAssetService" ] = = null )
return ;
2021-01-04 04:26:10 +00:00
if ( source . Configs [ "DatabaseService" ] . GetString ( "ConnectionString" , null ) = = null )
return ;
2021-01-04 04:48:33 +00:00
if ( source . Configs [ "HGAssetService" ] . GetString ( "HomeURI" , "http://127.0.0.1:8002" ) = = null )
return ;
m_assetURL = source . Configs [ "HGAssetService" ] . GetString ( "HomeURI" , "http://127.0.0.1:8002" ) + "/assets/" ;
Console . WriteLine ( "AssetServer URL: " + m_assetURL ) ;
2021-01-04 04:26:10 +00:00
m_mySQLConnection = new MySqlConnection ( source . Configs [ "DatabaseService" ] . GetString ( "ConnectionString" , null ) ) ;
m_mySQLConnection . Open ( ) ;
if ( ! Directory . Exists ( "RegionData" ) )
Directory . CreateDirectory ( "RegionData" ) ;
List < String > allRegionIDs = getAllRegionIDsFromStorage ( ) ;
foreach ( String regionID in allRegionIDs )
{
Console . WriteLine ( "Start with region '" + regionID + "'" ) ;
if ( ! Directory . Exists ( "RegionData/" + regionID ) )
Directory . CreateDirectory ( "RegionData/" + regionID ) ;
if ( ! Directory . Exists ( "RegionData/assets" ) )
Directory . CreateDirectory ( "RegionData/assets" ) ;
if ( ! Directory . Exists ( "RegionData/" + regionID + "/images" ) )
Directory . CreateDirectory ( "RegionData/" + regionID + "/images" ) ;
List < MySQLPrimObject > prims = getAllScenePrims ( regionID ) ;
int primCounter = 0 ;
foreach ( MySQLPrimObject prim in prims )
{
Console . WriteLine ( " [" + + + primCounter + " / " + prims . Count + "]Start with scene object '" + prim . Name + "'" ) ;
Primitive . TextureEntry textureEntry = new Primitive . TextureEntry ( prim . RawTextueData , 0 , prim . RawTextueData . Length ) ;
foreach ( TextureEntryFace faceEntry in textureEntry . FaceTextures )
{
if ( faceEntry ! = null )
{
if ( faceEntry . TextureID ! = UUID . Zero )
{
prim . Texture . Add ( faceEntry . TextureID ) ;
Console . WriteLine ( " Found texture '" + faceEntry . TextureID + "'" ) ;
if ( ! m_assets . Contains ( faceEntry . TextureID ) )
m_assets . Add ( faceEntry . TextureID ) ;
}
}
}
}
//Create CSV
List < String > entrys = new List < String > ( ) ;
foreach ( MySQLPrimObject prim in prims )
{
String newEntry = prim . Name + ";" + prim . ID . ToString ( ) + ";" ;
foreach ( UUID texturID in prim . Texture )
newEntry + = texturID . ToString ( ) + ";" ;
entrys . Add ( newEntry ) ;
}
File . WriteAllLines ( "RegionData/" + regionID + "/result.csv" , entrys . ToArray ( ) ) ;
//Start Asset Download
using ( WebClient assetHTTPClient = new WebClient ( ) )
{
int downloadCounter = 0 ;
foreach ( UUID assetID in m_assets )
{
try
{
Console . WriteLine ( "[" + + + downloadCounter + " / " + m_assets . Count + "] Download asset " + assetID . ToString ( ) ) ;
if ( ! File . Exists ( "RegionData/assets/" + assetID . ToString ( ) + ".jpeg2000" ) )
assetHTTPClient . DownloadFile ( m_assetURL + assetID . ToString ( ) + "/data" , "RegionData/assets/" + assetID . ToString ( ) + ".jpeg2000" ) ;
if ( ! File . Exists ( "RegionData/" + regionID + "/images/" + assetID . ToString ( ) + ".png" ) )
{
Process process = new Process ( ) ;
process . StartInfo . FileName = "ffmpeg.exe" ;
process . StartInfo . Arguments = "-i RegionData/assets/" + assetID . ToString ( ) + ".jpeg2000 RegionData/" + regionID + "/images/" + assetID . ToString ( ) + ".png" ;
process . StartInfo . WindowStyle = ProcessWindowStyle . Hidden ;
process . Start ( ) ;
process . WaitForExit ( ) ;
}
} catch ( Exception error )
{
Console . WriteLine ( "[" + downloadCounter + " / " + m_assets . Count + "] Download failed for asset " + assetID . ToString ( ) + ": " + error . Message ) ;
}
}
}
}
}
}
}