Files
rosetta-wss/src/main/java/im/rosetta/service/dispatch/DeviceDispatcher.java

103 lines
4.5 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package im.rosetta.service.dispatch;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import im.rosetta.client.ClientManager;
import im.rosetta.client.tags.ECIDevice;
import im.rosetta.database.entity.Device;
import im.rosetta.database.repository.DeviceRepository;
import im.rosetta.network.enums.DeviceSolution;
import im.rosetta.network.enums.NetworkStatus;
import im.rosetta.network.packet.PacketDeviceList;
import im.rosetta.network.types.NetworkDevice;
import im.rosetta.service.services.DeviceService;
import io.orprotocol.ProtocolException;
import io.orprotocol.client.Client;
/**
* Диспетчер устройств, который отвечает за списки устройств в аккаунте
*/
public class DeviceDispatcher {
private ClientManager clientManager;
private DeviceRepository deviceRepository = new DeviceRepository();
private DeviceService deviceService = new DeviceService(deviceRepository);
public DeviceDispatcher(ClientManager clientManager) {
this.clientManager = clientManager;
}
/**
* Отправит список подключенных устройств всем авторизованным устройствам с publicKey
* @param publicKey публичный ключ аккаунта, для которого нужно отправить список устройств
*/
public void sendDevices(String publicKey) throws ProtocolException {
/**
* Получаем список авторизованных устройств, а так же список устройств которые сейчас в сети
*/
List<Device> verifiedDevices = deviceService.getDevicesByPK(publicKey);
List<ECIDevice> onlineDevices = this.getOnlineDevices(publicKey);
Map<String, NetworkDevice> byId = new HashMap<>();
/**
* Верифицированные устройства, по умолчанию оффлайн, но верифицированные
*/
for (Device d : verifiedDevices) {
String id = d.getDeviceId();
NetworkDevice nd = new NetworkDevice();
nd.setDeviceId(id);
nd.setDeviceSolution(DeviceSolution.ACCEPT);
nd.setNetworkStatus(NetworkStatus.OFFLINE);
nd.setDeviceName(d.getDeviceName());
nd.setDeviceOs(d.getDeviceOs());
byId.put(id, nd);
}
/**
* Подгоняем онлайн статус, если усотройство верифицированно, то оно найдется
* в Map, если устройства там нет соотвественно оно не верифицированно
*/
for (ECIDevice od : onlineDevices) {
String id = od.getDeviceId();
NetworkDevice nd = byId.get(id);
if (nd == null) {
nd = new NetworkDevice();
nd.setDeviceId(id);
nd.setDeviceSolution(DeviceSolution.DECLINE);
nd.setDeviceName(od.getDeviceName());
nd.setDeviceOs(od.getDeviceOs());
byId.put(id, nd);
}
nd.setNetworkStatus(NetworkStatus.ONLINE);
}
List<NetworkDevice> networkDevices = new ArrayList<>(byId.values());
PacketDeviceList packet = new PacketDeviceList();
packet.setDevices(networkDevices);
this.clientManager.sendPacketToAuthorizedPK(publicKey, packet);
}
/**
* Получить список устройств которые сейчас в сети для публичного ключа (берутся и не авторизованные устройства, так как они тоже в сети)
* @param publicKey публичный ключ аккаунта, для которого нужно получить список устройств которые сейчас в сети
* @return список устройств которые сейчас в сети для публичного ключа
*/
private List<ECIDevice> getOnlineDevices(String publicKey) {
List<ECIDevice> onlineDevices = new java.util.ArrayList<>();
List<Client> clients = clientManager.getPKClients(publicKey);
for(Client client : clients){
ECIDevice deviceTag = client.getTag(ECIDevice.class);
if(deviceTag != null){
onlineDevices.add(deviceTag);
}
}
return onlineDevices;
}
}