@@ -164,6 +164,49 @@ const getMapFromFile = async (filePath) => {
164164 return rooms
165165}
166166
167+ const exportMap = async ( config ) => {
168+ const { common : { storage : { env, db } } } = config
169+ if ( ! config . mongo ) {
170+ throw new Error ( 'screepsmod-mongo required for map imports' )
171+ }
172+ log ( 'Exporting map' )
173+
174+ // We want to pause the server just in case
175+ const wasPaused = await env . get ( env . keys . MAIN_LOOP_PAUSED )
176+ if ( ! wasPaused ) {
177+ await env . set ( env . keys . MAIN_LOOP_PAUSED , '1' )
178+ }
179+
180+ const roomNames = ( await db . rooms . find ( { } , { _id : true } ) ) . map ( r => r . _id )
181+ const shard = await env . get ( env . keys . SHARD_NAME )
182+ const date = new Date ( )
183+ const desc = `${ shard } :${ date . getUTCFullYear ( ) } -${ date . getUTCMonth ( ) } `
184+ let count = 0
185+ const allowedObjTypes = [ 'controller' , 'source' , 'mineral' , 'extractor' , 'keeperLair' , 'deposit' , 'portal' ]
186+ const objectOrTypeSpec = allowedObjTypes . map ( t => ( { type : t } ) )
187+ const rooms = await Promise . all ( roomNames . map ( async ( roomName ) => {
188+ const roomData = await db . rooms . findOne ( { _id : roomName } , { projection : { _id : false } } )
189+ const objects = await db [ 'rooms.objects' ] . find ( { room : roomName , $or : objectOrTypeSpec } )
190+ const terrain = await db [ 'rooms.terrain' ] . findOne ( { room : roomName } )
191+ const room = {
192+ room : roomName ,
193+ terrain : terrain . terrain ,
194+ objects : objects
195+ }
196+ Object . assign ( room , roomData )
197+ count ++
198+ return room
199+ } ) )
200+
201+ const fileName = path . join ( process . env . ASSET_DIR , `mapExport-${ Number ( date ) } .json` )
202+ await fs . writeFile ( fileName , JSON . stringify ( { description : desc , rooms } ) )
203+
204+ if ( ! wasPaused ) {
205+ await env . set ( env . keys . MAIN_LOOP_PAUSED , '0' )
206+ }
207+ return logResult ( `Exported ${ count } rooms to ${ fileName } ` )
208+ }
209+
167210module . exports = ( config ) => {
168211 Object . assign ( config . utils , {
169212 async importMap ( urlOrMapId ) {
@@ -177,6 +220,9 @@ module.exports = (config) => {
177220 const rooms = await getMapFromFile ( filePath )
178221 await loadRooms ( config , filePath , rooms )
179222 return logFinish ( )
223+ } ,
224+ async exportMap ( ) {
225+ return exportMap ( config )
180226 }
181227 } )
182228
@@ -185,4 +231,7 @@ module.exports = (config) => {
185231
186232 config . utils . importMapFile . _help =
187233 'importMapFile(filePath) - import a map from a json file'
234+
235+ config . utils . exportMap . _help =
236+ 'exportMapFile() - export the map to a json file in the assets directory'
188237}
0 commit comments