package ch.rasc.wampspring.demo.salmar;
import java.security.Principal;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ch.rasc.wampspring.annotation.WampCallListener;
import ch.rasc.wampspring.annotation.WampSubscribeListener;
import ch.rasc.wampspring.annotation.WampUnsubscribeListener;
import ch.rasc.wampspring.user.UserEventMessenger;
/**
*
* @author Sergi Almar
* @author Ralph Schaer
*/
@Service
public class ChatService {
private final ProfanityChecker profanityFilter;
private final SessionProfanity profanity;
private final UserEventMessenger userEventMessenger;
private final Set<String> participants = new HashSet<>();
@Autowired
public ChatService(ProfanityChecker profanityFilter, SessionProfanity profanity,
UserEventMessenger userEventMessenger) {
this.profanityFilter = profanityFilter;
this.profanity = profanity;
this.userEventMessenger = userEventMessenger;
}
@WampCallListener("getUsername")
public String getUsername(Principal principal) {
return principal.getName();
}
@WampCallListener("retrieveParticipants")
public List<Map<String, String>> retrieveParticipants() {
return this.participants.stream()
.map(p -> Collections.singletonMap("username", p))
.collect(Collectors.toList());
}
@WampSubscribeListener("/chat")
public void subscribe(Principal principal) {
this.participants.add(principal.getName());
this.userEventMessenger.sendToAll("/chat.login", principal.getName());
}
@WampUnsubscribeListener("/chat")
public void unsubscribe(Principal principal) {
this.participants.remove(principal.getName());
this.userEventMessenger.sendToAll("/chat.logout", principal.getName());
}
@WampCallListener("publishMessage")
public void publishMessage(String message, Principal principal) {
String sanitizedMessage = checkProfanityAndSanitize(message);
ChatMessage chatMessage = new ChatMessage();
chatMessage.setMessage(sanitizedMessage);
chatMessage.setUsername(principal.getName());
this.userEventMessenger.sendToAll("/chat", chatMessage);
}
@WampCallListener("publishPrivateMessage")
public void publishPrivateMessage(String message, String username,
Principal principal) {
String sanitizedMessage = checkProfanityAndSanitize(message);
ChatMessage chatMessage = new ChatMessage();
chatMessage.setMessage(sanitizedMessage);
chatMessage.setUsername(principal.getName());
chatMessage.setPriv(true);
this.userEventMessenger.sendToUser("/chat", chatMessage, username);
}
private String checkProfanityAndSanitize(String message) {
long profanityLevel = this.profanityFilter.getMessageProfanity(message);
this.profanity.increment(profanityLevel);
return this.profanityFilter.filter(message);
}
}