]> git.basschouten.com Git - openhab-addons.git/blob
40d3672eac39b517e9d60a3f623c9dd9020b981c
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.minecraft.internal.server;
14
15 import java.util.ArrayList;
16 import java.util.List;
17
18 import org.openhab.binding.minecraft.internal.message.OHMessage;
19 import org.openhab.binding.minecraft.internal.message.data.PlayerData;
20 import org.openhab.binding.minecraft.internal.message.data.ServerData;
21 import org.openhab.binding.minecraft.internal.message.data.SignData;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import com.firebase.tubesock.WebSocketEventHandler;
26 import com.firebase.tubesock.WebSocketException;
27 import com.firebase.tubesock.WebSocketMessage;
28 import com.google.gson.Gson;
29 import com.google.gson.GsonBuilder;
30 import com.google.gson.reflect.TypeToken;
31
32 import rx.Observable;
33 import rx.subjects.BehaviorSubject;
34
35 /**
36  * Handles sending and receiving messages from Minecraft server.
37  *
38  * @author Mattias Markehed - Initial contribution
39  */
40 public class MinecraftSocketHandler implements WebSocketEventHandler {
41
42     private Logger logger = LoggerFactory.getLogger(MinecraftSocketHandler.class);
43
44     private BehaviorSubject<ServerData> serverRx = BehaviorSubject.create();
45     private BehaviorSubject<List<SignData>> signsRx = BehaviorSubject.<List<SignData>> create();
46     private BehaviorSubject<List<PlayerData>> playersRx = BehaviorSubject.<List<PlayerData>> create();
47
48     private Gson gson = new GsonBuilder().create();
49
50     @Override
51     public void onClose() {
52         logger.info("Connection to minecraft server closed");
53     }
54
55     @Override
56     public void onError(WebSocketException e) {
57         logger.error("Server error {}", e.getMessage(), e);
58     }
59
60     @Override
61     public void onOpen() {
62         logger.info("Connection to minecraft server opened");
63     }
64
65     @Override
66     public void onLogMessage(String s) {
67         logger.info("Log message: {}", s);
68     }
69
70     @Override
71     public void onMessage(WebSocketMessage message) {
72         String msg = message.getText();
73
74         if (msg != null) {
75             OHMessage ohMessage = gson.fromJson(msg, OHMessage.class);
76             int messageType = ohMessage.getMessageType();
77             if (OHMessage.MESSAGE_TYPE_SERVERS == messageType) {
78                 ServerData serverData = gson.fromJson(ohMessage.getMessage(), ServerData.class);
79                 serverRx.onNext(serverData);
80             } else if (OHMessage.MESSAGE_TYPE_PLAYERS == messageType) {
81                 List<PlayerData> playerData = gson.fromJson(ohMessage.getMessage(),
82                         new TypeToken<ArrayList<PlayerData>>() {
83                         }.getType());
84                 playersRx.onNext(playerData);
85             } else if (OHMessage.MESSAGE_TYPE_SIGNS == messageType) {
86                 List<SignData> signsData = gson.fromJson(ohMessage.getMessage(), new TypeToken<ArrayList<SignData>>() {
87                 }.getType());
88                 signsRx.onNext(signsData);
89             }
90         }
91     }
92
93     /**
94      * Get observable emitting server items.
95      *
96      * @return observable emitting server items.
97      */
98     public Observable<ServerData> getServerRx() {
99         return serverRx.asObservable();
100     }
101
102     /**
103      * Get observable emitting sign items.
104      *
105      * @return observable emitting sign items.
106      */
107     public Observable<List<SignData>> getSignsRx() {
108         return signsRx.asObservable();
109     }
110
111     /**
112      * Get observable emitting player items.
113      *
114      * @return observable emitting player items.
115      */
116     public Observable<List<PlayerData>> getPlayersRx() {
117         return playersRx.asObservable();
118     }
119 }