@@ -164,6 +164,49 @@ const getMapFromFile = async (filePath) => {
164
164
return rooms
165
165
}
166
166
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' ]
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
+
167
210
module . exports = ( config ) => {
168
211
Object . assign ( config . utils , {
169
212
async importMap ( urlOrMapId ) {
@@ -177,6 +220,9 @@ module.exports = (config) => {
177
220
const rooms = await getMapFromFile ( filePath )
178
221
await loadRooms ( config , filePath , rooms )
179
222
return logFinish ( )
223
+ } ,
224
+ async exportMap ( ) {
225
+ return exportMap ( config )
180
226
}
181
227
} )
182
228
@@ -185,4 +231,7 @@ module.exports = (config) => {
185
231
186
232
config . utils . importMapFile . _help =
187
233
'importMapFile(filePath) - import a map from a json file'
234
+
235
+ config . utils . exportMap . _help =
236
+ 'exportMapFile(filePath) - export the map to a json file'
188
237
}
0 commit comments