use of me.retrodaredevil.solarthing.database.VersionedPacket in project solarthing by wildmountainfarms.
the class CouchDbSolarThingDatabase method queryAuthorized.
@Override
@Nullable
public VersionedPacket<AuthorizationPacket> queryAuthorized(UpdateToken updateToken) throws SolarThingDatabaseException {
DocumentData data = queryDocument(closedDatabase, AuthorizationPacket.DOCUMENT_ID, updateToken);
if (data == null) {
return null;
}
JsonData jsonData = data.getJsonData();
try {
AuthorizationPacket packet = CouchDbJacksonUtil.readValue(simpleObjectMapper, jsonData, AuthorizationPacket.class);
return new VersionedPacket<>(packet, new RevisionUpdateToken(data.getRevision()));
} catch (JsonProcessingException e) {
throw new SolarThingDatabaseException("Invalid authorization packet! Failed to parse!", e);
}
}
use of me.retrodaredevil.solarthing.database.VersionedPacket in project solarthing by wildmountainfarms.
the class CouchDbAlterDatabase method queryAll.
@Override
@NotNull
public List<VersionedPacket<StoredAlterPacket>> queryAll(String sourceId) throws SolarThingDatabaseException {
final ViewResponse allDocs;
try {
allDocs = database.allDocs(new ViewQueryParamsBuilder().includeDocs(true).build());
} catch (CouchDbException e) {
throw ExceptionUtil.createFromCouchDbException(e);
}
List<ViewResponse.DocumentEntry> rows = allDocs.getRows();
List<VersionedPacket<StoredAlterPacket>> r = new ArrayList<>(rows.size());
for (ViewResponse.DocumentEntry row : rows) {
if (row.getId().startsWith("_")) {
// ignore design documents
continue;
}
// Since we're using _all_docs with include_docs=true, we have to use the doc, since the value is just the ID for _all_docs
JsonData jsonData = row.getDoc();
final JsonNode jsonNode;
try {
jsonNode = CouchDbJacksonUtil.getNodeFrom(jsonData);
} catch (JsonProcessingException e) {
throw new SolarThingDatabaseException("We couldn't parse some of the data into JSON. This should never happen", e);
}
if (!jsonNode.isObject()) {
throw new SolarThingDatabaseException("Something must be wrong with _all_docs!");
}
ObjectNode objectNode = (ObjectNode) jsonNode;
final StoredAlterPacket storedAlterPacket;
try {
storedAlterPacket = mapper.treeToValue(objectNode, StoredAlterPacket.class);
;
} catch (JsonProcessingException e) {
throw new SolarThingDatabaseException("Could not parse. JsonData: " + jsonData.getJson(), e);
}
// String documentId = objectNode.get("_id").asText();
String documentRevision = objectNode.get("_rev").asText();
VersionedPacket<StoredAlterPacket> versionedPacket = new VersionedPacket<>(storedAlterPacket, new RevisionUpdateToken(documentRevision));
r.add(versionedPacket);
}
return r;
}
use of me.retrodaredevil.solarthing.database.VersionedPacket in project solarthing by wildmountainfarms.
the class FlagCommandChatBotHandler method clearFlag.
private void clearFlag(MessageSender messageSender, String flagName) {
List<VersionedPacket<StoredAlterPacket>> packets = getPacketsWithFlagName(flagName);
if (packets == null) {
messageSender.sendMessage("Could not get flags. Please try again.");
return;
}
Instant now = Instant.now();
if (packets.isEmpty()) {
messageSender.sendMessage("Flag: '" + flagName + "' is not set!");
return;
}
List<VersionedPacket<StoredAlterPacket>> activePackets = packets.stream().filter(versionedPacket -> {
FlagPacket flagPacket = (FlagPacket) versionedPacket.getPacket().getPacket();
return flagPacket.getFlagData().getActivePeriod().isActive(now);
}).collect(Collectors.toList());
if (activePackets.isEmpty()) {
messageSender.sendMessage("Flag: '" + flagName + "' is not currently active. In a future update we may allow you to clear inactive flags.");
return;
}
// We know that the user wants this flag cleared, so let's delete all the packets that are active.
for (VersionedPacket<StoredAlterPacket> packetToRequestDeleteFor : activePackets) {
DeleteAlterPacket deleteAlterPacket = new ImmutableDeleteAlterPacket(packetToRequestDeleteFor.getPacket().getDbId(), packetToRequestDeleteFor.getUpdateToken());
PacketCollectionCreator creator = commandHelper.getCommandManager().makeCreator(sourceId, zoneId, null, deleteAlterPacket, PacketCollectionIdGenerator.Defaults.UNIQUE_GENERATOR);
PacketCollection packetCollection = creator.create(now);
boolean success = false;
try {
database.getOpenDatabase().uploadPacketCollection(packetCollection, null);
success = true;
} catch (SolarThingDatabaseException e) {
LOGGER.error("Could not upload request to delete alter packet for ID: " + packetToRequestDeleteFor.getPacket().getDbId(), e);
}
if (success) {
messageSender.sendMessage("Requested delete for flag: '" + flagName + "' under ID: " + packetToRequestDeleteFor.getPacket().getDbId());
} else {
messageSender.sendMessage("Could not request delete for flag: '" + flagName + "' under ID: " + packetToRequestDeleteFor.getPacket().getDbId() + ". See logs for details.");
}
}
}
use of me.retrodaredevil.solarthing.database.VersionedPacket in project solarthing by wildmountainfarms.
the class StatusChatBotHandler method handleMessage.
@Override
public boolean handleMessage(Message message, MessageSender messageSender) {
if (ChatBotUtil.isSimilar("battery voltage", message.getText())) {
FragmentedPacketGroup packetGroup = packetGroupProvider.getPacketGroup();
Float batteryVoltageAverage = BatteryUtil.getBatteryVoltageAverage(packetGroup);
if (batteryVoltageAverage == null) {
messageSender.sendMessage("Battery voltage unavailable from latest data. Sorry!");
} else {
messageSender.sendMessage("Battery voltage: " + Formatting.HUNDREDTHS_FORMAT.format(batteryVoltageAverage));
}
return true;
} else if (ChatBotUtil.isSimilar("battery temperature", message.getText()) || ChatBotUtil.isSimilar("battery temp", message.getText())) {
FragmentedPacketGroup packetGroup = packetGroupProvider.getPacketGroup();
List<String> lines = new ArrayList<>();
for (Packet packet : packetGroup.getPackets()) {
int fragmentId = packetGroup.getFragmentId(packet);
if (packet instanceof BatteryTemperature && packet instanceof Identifiable) {
float temperature = ((BatteryTemperature) packet).getBatteryTemperatureFahrenheit();
IdentityInfo identityInfo = ((Identifiable) packet).getIdentityInfo();
lines.add(identityInfo.getDisplayName() + " (" + fragmentId + "): " + temperature + "F");
}
}
if (lines.isEmpty()) {
messageSender.sendMessage("No devices to read temperature!");
} else {
messageSender.sendMessage(String.join("\n", lines));
}
return true;
} else if (ChatBotUtil.isSimilar("alter", message.getText())) {
List<VersionedPacket<StoredAlterPacket>> alterPackets = alterPacketsProvider.getPackets();
if (alterPackets == null) {
messageSender.sendMessage("Error - Must have failed to query alter database");
} else {
List<String> scheduledCommandLines = new ArrayList<>();
for (VersionedPacket<StoredAlterPacket> versionedPacket : alterPackets) {
StoredAlterPacket storedAlterPacket = versionedPacket.getPacket();
AlterPacket alterPacket = storedAlterPacket.getPacket();
if (alterPacket instanceof ScheduledCommandPacket) {
ScheduledCommandData data = ((ScheduledCommandPacket) alterPacket).getData();
// ExecutionReason executionReason = ((ScheduledCommandPacket) alterPacket).getExecutionReason();
String timeString = TimeUtil.instantToSlackDateSeconds(Instant.ofEpochMilli(data.getScheduledTimeMillis()));
scheduledCommandLines.add(data.getCommandName() + " - " + timeString);
}
}
if (scheduledCommandLines.isEmpty()) {
messageSender.sendMessage("No scheduled commands (from " + alterPackets.size() + " alter packets)");
} else {
messageSender.sendMessage("Scheduled commands:\n\t" + String.join("\n\t", scheduledCommandLines));
}
}
return true;
}
return false;
}
use of me.retrodaredevil.solarthing.database.VersionedPacket in project solarthing by wildmountainfarms.
the class CancelCommandChatBotHandler method cancelCommand.
private void cancelCommand(MessageSender messageSender, UUID schedulingId) {
List<VersionedPacket<StoredAlterPacket>> packets = alterPacketsProvider.getPackets();
if (packets == null) {
messageSender.sendMessage("Unable to cancel commands, as we are unable to reach the alter database.");
return;
}
List<VersionedPacket<StoredAlterPacket>> targets = findStoredPacketsWithSchedulingIdOrNull(packets.stream(), schedulingId);
if (targets.isEmpty()) {
messageSender.sendMessage("Unable to find a scheduled command that was scheduled with the ID of " + schedulingId);
} else if (targets.size() > 1) {
messageSender.sendMessage("Multiple packets corresponded to ID: " + schedulingId + ". Please report this error.");
} else {
VersionedPacket<StoredAlterPacket> target = targets.get(0);
messageSender.sendMessage("Going request cancel of " + target.getPacket().getDbId());
CommandOpenPacket packet = new ImmutableDeleteAlterPacket(target.getPacket().getDbId(), target.getUpdateToken());
PacketCollectionCreator creator = commandHelper.getCommandManager().makeCreator(sourceId, zoneId, null, packet, PacketCollectionIdGenerator.Defaults.UNIQUE_GENERATOR);
executorService.execute(() -> {
Instant now = Instant.now();
PacketCollection packetCollection = creator.create(now);
boolean success = true;
try {
database.getOpenDatabase().uploadPacketCollection(packetCollection, null);
} catch (SolarThingDatabaseException e) {
LOGGER.error("Could not upload alter delete request", e);
success = false;
}
if (success) {
messageSender.sendMessage("Sent request to delete the scheduled command");
} else {
messageSender.sendMessage("Could not upload request to delete scheduled command. You can try again.");
}
});
}
}
Aggregations