Skip to content

Commit 6381baa

Browse files
committed
Add exportMap
1 parent 03199b6 commit 6381baa

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

lib/services/importMap/utils.js

+49
Original file line numberDiff line numberDiff line change
@@ -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']
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+
167210
module.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(filePath) - export the map to a json file'
188237
}

0 commit comments

Comments
 (0)