/*
* IDK Game Server by Steve Winfield
* https://github.com/WinfieldSteve
*/
package org.stevewinfield.suja.idk.game.rooms;
import org.apache.log4j.Logger;
import org.magicwerk.brownies.collections.GapList;
import org.stevewinfield.suja.idk.Bootloader;
import org.stevewinfield.suja.idk.communication.MessageWriter;
import org.stevewinfield.suja.idk.communication.navigator.writers.RoomCategoriesWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
public class RoomManager {
private static final Logger logger = Logger.getLogger(RoomManager.class);
public Map<Integer, Integer> getTeleporterCache() {
return this.teleporterCache;
}
public RoomManager() {
this.roomModels = new ConcurrentHashMap<>();
this.roomCategories = new ConcurrentHashMap<>();
this.teleporterCache = new ConcurrentHashMap<>();
try {
final ResultSet models = Bootloader.getStorage().queryParams("SELECT * FROM room_models").executeQuery();
while (models.next()) {
final RoomModel model = new RoomModel();
model.set(models);
roomModels.put(models.getString("name"), model);
}
logger.info(roomModels.size() + " Room Model(s) loaded.");
final ResultSet categories = Bootloader.getStorage().queryParams("SELECT * FROM room_categories ORDER BY id ASC").executeQuery();
while (categories.next()) {
final RoomCategory category = new RoomCategory();
category.set(categories);
roomCategories.put(categories.getInt("id"), category);
}
final SortedSet<Integer> keys = new TreeSet<>(roomCategories.keySet());
final GapList<RoomCategory> cats = new GapList<>();
for (final int key : keys) {
cats.add(roomCategories.get(key));
}
this.cachedCategoryWriter = new RoomCategoriesWriter(cats);
logger.info(roomCategories.size() + " Room Categories loaded.");
} catch (final SQLException e) {
logger.error("SQL Exception", e);
}
this.loadedRoomInstances = new ConcurrentHashMap<>();
}
public RoomModel getRoomModel(final String modelId) {
return this.roomModels.get(modelId);
}
public RoomInstance getLoadedRoomInstance(final int roomId) {
return this.loadedRoomInstances.containsKey(roomId) ? this.loadedRoomInstances.get(roomId) : null;
}
public Collection<RoomInstance> getLoadedRoomInstances() {
return this.loadedRoomInstances.values();
}
public void removeLoadedRoomInstance(final int roomId) {
this.loadedRoomInstances.remove(roomId);
}
public RoomInformation getRoomInformation(final int roomId) {
if (this.loadedRoomInstances.containsKey(roomId)) {
return this.loadedRoomInstances.get(roomId).getInformation();
}
RoomInformation info = null;
try {
final ResultSet row = Bootloader.getStorage()
.queryParams(
"SELECT rooms.*, nickname FROM rooms, players " +
"WHERE rooms.id=" + roomId + " " +
"AND players.id=owner_id " +
"ORDER BY name ASC " +
"LIMIT 1"
).executeQuery();
if (row.next()) {
info = new RoomInformation();
info.set(row);
}
row.close();
} catch (final SQLException e) {
logger.error("SQL Exception", e);
}
return info;
}
public RoomInstance loadRoomInstance(final int roomId) {
if (this.loadedRoomInstances.containsKey(roomId)) {
return this.loadedRoomInstances.get(roomId);
}
RoomInstance instance = null;
try {
final ResultSet row = Bootloader.getStorage()
.queryParams(
"SELECT rooms.*, nickname FROM rooms, players " +
"WHERE rooms.id=" + roomId + " " +
"AND players.id=owner_id " +
"ORDER BY name ASC " +
"LIMIT 1"
).executeQuery();
if (row.next()) {
instance = new RoomInstance();
instance.load(row);
this.loadedRoomInstances.put(roomId, instance);
}
row.close();
} catch (final SQLException e) {
logger.error("SQL Exception", e);
}
return instance;
}
public void removeInstance(final int roomId) {
this.loadedRoomInstances.remove(roomId);
}
public MessageWriter getCachedCategoryWriter() {
return cachedCategoryWriter;
}
public RoomCategory getRoomCategory(final int id) {
return this.roomCategories.containsKey(id) ? this.roomCategories.get(id) : null;
}
public int getRoomCategoryCount() {
return this.roomCategories.size();
}
private final Map<Integer, RoomInstance> loadedRoomInstances;
private final Map<Integer, RoomCategory> roomCategories;
private final Map<String, RoomModel> roomModels;
private final Map<Integer, Integer> teleporterCache;
private MessageWriter cachedCategoryWriter;
}