2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.minecraft.internal.server;
15 import java.util.ArrayList;
16 import java.util.List;
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;
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;
33 import rx.subjects.BehaviorSubject;
36 * Handles sending and receiving messages from Minecraft server.
38 * @author Mattias Markehed - Initial contribution
40 public class MinecraftSocketHandler implements WebSocketEventHandler {
42 private Logger logger = LoggerFactory.getLogger(MinecraftSocketHandler.class);
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();
48 private Gson gson = new GsonBuilder().create();
51 public void onClose() {
52 logger.info("Connection to minecraft server closed");
56 public void onError(WebSocketException e) {
57 logger.error("Server error {}", e.getMessage(), e);
61 public void onOpen() {
62 logger.info("Connection to minecraft server opened");
66 public void onLogMessage(String s) {
67 logger.info("Log message: {}", s);
71 public void onMessage(WebSocketMessage message) {
72 String msg = message.getText();
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>>() {
84 playersRx.onNext(playerData);
85 } else if (OHMessage.MESSAGE_TYPE_SIGNS == messageType) {
86 List<SignData> signsData = gson.fromJson(ohMessage.getMessage(), new TypeToken<ArrayList<SignData>>() {
88 signsRx.onNext(signsData);
94 * Get observable emitting server items.
96 * @return observable emitting server items.
98 public Observable<ServerData> getServerRx() {
99 return serverRx.asObservable();
103 * Get observable emitting sign items.
105 * @return observable emitting sign items.
107 public Observable<List<SignData>> getSignsRx() {
108 return signsRx.asObservable();
112 * Get observable emitting player items.
114 * @return observable emitting player items.
116 public Observable<List<PlayerData>> getPlayersRx() {
117 return playersRx.asObservable();