[JAVA] Gestion de l'état de la conversation (contexte) (gestion de session?) Avec LINE BOT

Chose que tu veux faire

Je souhaite créer un LINE BOT qui a quelque chose comme l'état de la conversation (contexte) côté serveur (comme une session d'application Web?) Et la réponse change en conséquence.

L'image ressemble à ceci. image.png

L'analyse du langage naturel, le Deep Learning, le RNN, le chat BOT, etc. ne sont pas des histoires avancées.

Méthode de réalisation

J'ai décidé de créer une carte avec l'ID utilisateur comme clé et la classe qui recueille les valeurs à enregistrer comme valeur.

De plus, l'implémentation de la partie qui répond au message est sample-spring-boot-kitchensink Je me suis référé à (méthode replyText). Le langage est Java.

En fait, s'il existe une méthode de route plus royale (≒ bibliothèque, framework), merci de nous le faire savoir.

Classe pour enregistrer le statut

Status.java


public class Status {

	private String context = "0";//statut
	private String place = "";//endroit

	public String getContext() {
		return context;
	}
	public void setContext(String context) {
		this.context = context;
	}

	public String getPlace() {
		return place;
	}
	public void setPlace(String place) {
		this.place = place;
	}

}

carte

PseudoSession.java


public class PseudoSession {

	private static Map<String,Status> statusMap = new HashMap<>();

	public static Status getStatus(String userId) {
		return PseudoSession.statusMap.get(userId);
	}

	public static void putStatus(String userId, Status status) {
		PseudoSession.statusMap.put(userId, status);
	}

	public static String readContext(String userId) {
		return PseudoSession.statusMap.get(userId).getContext();
	}

	public static String readPlace(String userId) {
		return PseudoSession.statusMap.get(userId).getPlace();
	}

	public static void updateContext(String userId, String context) {
		Status newStatus = PseudoSession.statusMap.get(userId);
		newStatus.setContext(context);
		PseudoSession.statusMap.put(userId, newStatus);
	}

	public static void updatePlace(String userId, String place) {
		Status newStatus = PseudoSession.statusMap.get(userId);
		newStatus.setPlace(place);
		PseudoSession.statusMap.put(userId, newStatus);
	}

}

Traitement principal

Controller.java


	private void handleTextContent(String replyToken, Event event, TextMessageContent content)
			throws Exception {
		final String text = content.getText();
		final String userId = event.getSource().getUserId();

        //Pour les nouveaux utilisateurs, saisissez une valeur dans la carte
		if (Objects.isNull(PseudoSession.getStatus(userId))) {
			PseudoSession.putStatus(userId, new Status());
		}

		if(PseudoSession.readContext(userId).equals("0")) {

			if (text.equals("Dites-moi la météo")) {
				this.replyText(replyToken,"Où est le temps?");
				PseudoSession.updateContext(userId,"1");
			} else {
				this.replyText(replyToken,"Entrez "Dites-moi la météo"!");
			}

		}else if (PseudoSession.readContext(userId).equals("1")) {

			if (!("Toyama".equals(text))&&!("Ishikawa".equals(text))) {
				this.replyText(replyToken,"Je ne connais que Toyama ou Ishikawa");
			} else {
				this.replyText(replyToken,"Quel temps fait-il?");
				PseudoSession.updatePlace(userId,text);
				PseudoSession.updateContext(userId,"2");
			}

		}else if (PseudoSession.readContext(userId).equals("2")) {

			if (!("aujourd'hui".equals(text))&&!("demain".equals(text))) {
				this.replyText(
						replyToken,"Je sais seulement aujourd'hui ou demain");
			} else {
				String answer = text + "de"
						+ PseudoSession.readPlace(userId) + "de"
						+ "Le temps est ensoleillé.";
				this.replyText(replyToken,answer);
				PseudoSession.updatePlace(userId,"");
				PseudoSession.updateContext(userId,"0");
			}
		}
	}

résultat

image.png

Recommended Posts

Gestion de l'état de la conversation (contexte) (gestion de session?) Avec LINE BOT
[Rails] Transmission push avec LINE Bot
bot de ligne
J'ai créé un robot LINE avec Rails + heroku
Facile à créer LINE BOT avec Java Servlet
Déployer le bot Line avec rails5 + Docker + Heroku Note
Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1