22
33import com .bigboxer23 .switch_bot .data .*;
44import com .bigboxer23 .utils .http .OkHttpUtil ;
5+ import com .bigboxer23 .utils .time .ITimeConstants ;
56import java .io .IOException ;
67import java .net .URLDecoder ;
78import java .nio .charset .StandardCharsets ;
9+ import java .util .Collections ;
810import java .util .List ;
11+ import java .util .Map ;
912import java .util .Optional ;
13+ import java .util .stream .Collectors ;
1014import okhttp3 .RequestBody ;
1115import okhttp3 .Response ;
1216import org .slf4j .Logger ;
@@ -17,8 +21,36 @@ public class SwitchBotDeviceApi {
1721 private static final Logger logger = LoggerFactory .getLogger (SwitchBotDeviceApi .class );
1822 private final SwitchBotApi provider ;
1923
24+ private Map <String , String > deviceIdToNames ;
25+
26+ private long deviceIdToNamesCacheTime = -1 ;
27+
2028 protected SwitchBotDeviceApi (SwitchBotApi provider ) {
2129 this .provider = provider ;
30+ refreshDeviceNameMap ();
31+ }
32+
33+ public String getDeviceNameFromId (String deviceId ) {
34+ refreshDeviceNameMap ();
35+ return Optional .ofNullable (deviceIdToNames )
36+ .map (m -> m .getOrDefault (deviceId , deviceId ))
37+ .orElse (deviceId );
38+ }
39+
40+ private synchronized void refreshDeviceNameMap () {
41+ if (deviceIdToNames != null && (System .currentTimeMillis () - ITimeConstants .HOUR ) < deviceIdToNamesCacheTime ) {
42+ return ;
43+ }
44+ try {
45+ logger .info ("Refreshing device id/name map..." );
46+ deviceIdToNames = Collections .unmodifiableMap (
47+ getDevices ().stream ().collect (Collectors .toMap (Device ::getDeviceId , Device ::getDeviceName )));
48+ deviceIdToNamesCacheTime = System .currentTimeMillis ();
49+ } catch (IOException e ) {
50+ logger .error ("Failed to refresh device names." , e );
51+ deviceIdToNames = null ;
52+ deviceIdToNamesCacheTime = -1 ;
53+ }
2254 }
2355
2456 /**
0 commit comments