All Downloads are FREE. Search and download functionalities are using the official Maven repository.

uk.co.mruoc.nac.client.GameSessionHandler Maven / Gradle / Ivy

package uk.co.mruoc.nac.client;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaders;
import org.springframework.messaging.simp.stomp.StompSession;
import org.springframework.messaging.simp.stomp.StompSession.Subscription;
import org.springframework.messaging.simp.stomp.StompSessionHandlerAdapter;

@Slf4j
@RequiredArgsConstructor
public class GameSessionHandler extends StompSessionHandlerAdapter implements AutoCloseable {

  private final Collection subscriptions;

  private StompSession session;

  public GameSessionHandler() {
    this(new ArrayList<>());
  }

  @Override
  public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
    log.info("session connected with id {}", session.getSessionId());
    setSession(session);
  }

  public void setSession(StompSession session) {
    this.session = session;
  }

  @Override
  public Type getPayloadType(StompHeaders headers) {
    return Object.class;
  }

  @Override
  public void handleException(
      StompSession session,
      StompCommand command,
      StompHeaders headers,
      byte[] payload,
      Throwable exception) {
    log.error("received error", exception);
    log.error(
        "session id {} command {} headers {} payload {}",
        session.getSessionId(),
        command.getMessageType(),
        headers,
        new String(payload));
  }

  @Override
  public void handleFrame(StompHeaders headers, Object payload) {
    log.info("received payload {} with headers {}", payload, headers);
  }

  @Override
  public void close() {
    subscriptions.forEach(Subscription::unsubscribe);
    Optional.ofNullable(session).ifPresent(GameSessionHandler::disconnect);
  }

  public void addSubscriber(StompGameEventSubscriber subscriber) {
    String destination = subscriber.getDestination();
    Subscription subscription = session.subscribe(destination, subscriber);
    subscriptions.add(subscription);
    log.info(
        "subscribed to {} for session {} with subscription id {}",
        destination,
        session.getSessionId(),
        subscription.getSubscriptionId());
  }

  public Collection getSubscriptionIds() {
    return subscriptions.stream().map(Subscription::getSubscriptionId).toList();
  }

  private static void disconnect(StompSession s) {
    log.debug("disconnecting session with id {}", s.getSessionId());
    s.disconnect();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy