Gestionar sesiones en un paquete personalizado

Puede extraer una sesión con un nombre de sesión del SessionsMap. En el mismo paquete, puede utilizar sesiones para pasar información entre acciones, pero no a otros paquetes.

Configurar los siguientes atributos

  • Aplique una anotación al campo de clase y agrega el setter público correspondiente.
  • Recupere el SessionsMap con el atributo Sessions
  • Establezca el tipo de variable como Map<String, Object>
  • Establezca el attributeType: TEXT o SESSION. Si type = TEXT, se trata de una sesión ordinaria; si type = SESSION, se trata de una sharedSession.

Iniciar una nueva sesión

@BotCommand
@CommandPkg(label = "Start session", name = "startSession", description = "Start new session", 
icon = "pkg.svg", node_label = "start session {{sessionName}}|") public class Start {
 
    @Sessions
    private Map<String, Object> sessions;
     
    @Execute
    public void start(@Idx(index = "1", type = TEXT) @Pkg(label = "Session name", 
    default_value_type = STRING, default_value = "Default") @NotEmpty String sessionName) {
 
        // Check for existing session
        if (sessions.containsKey(sessionName))
            throw new BotCommandException(MESSAGES.getString("xml.SessionNameInUse", sessionName));
 
        // Do some operation
 
        // Create new session
        sessions.put(sessionName, new Session(operation));
    }
    public void setSessions(Map<String, Object> sessions) {
        this.sessions = sessions;
    }
}

Finalizar una sesión

@BotCommand
@CommandPkg(label = "End session", name = "endSession", description = "End session", icon = 
"pkg.svg", node_label = "End session {{sessionName}}|")
public class EndSession {
    @Sessions
    private Map<String, Object> sessions;
    @Execute
    public void end(
            @Idx(index = "1", type = TEXT) @Pkg(label = "Session name", default_value_type = STRING, 
            default_value = "Default") @NotEmpty String sessionName) {
                 
        sessions.remove(sessionName);   
    }  
    public void setSessions(Map<String, Object> sessions) {
        this.sessions = sessions;
    }
}

Agregar una sesión

En el siguiente ejemplo, se utilizan objetos de cadena (aunque en las acciones reales, se pueden utilizar objetos complejos).

@BotCommand
@CommandPkg(label = "[[SessionDemo.label]]", description = "[[SessionDemo.description]]", icon = "sample.svg", name = "sessionDemo")
public class SessionDemo {

	// Sessions are provided as a Map. Actions can add or remove entries in this
	// Map.
	// The choice to reuse/overwrite/delete/add any Object in this Map belongs to
	// the actions, and the framework makes no assumption regarding it.
	@Sessions
	private Map<String, Object> sessionMap;

	@Execute
	public void execute(@Idx(index = "1", type = TEXT)
	@Pkg(label = "[[SessionDemo.name.label]]")
	@NotEmpty
	String name) {
		if (!sessionMap.containsKey(name))
			sessionMap.put(name, "Some Value");
	}

	// Ensure that a public setter exists.
	public void setSessionMap(Map<String, Object> sessionMap) {
		this.sessionMap = sessionMap;
	}
}

Establecer una variable de sesión

El siguiente ejemplo muestra cómo desarrollar una acción (por ejemplo, Set session variable). En la acción, los detalles de la sesión se recuperan y se almacenan como una variable de la sesión de modo que la información pueda ser utilizada dentro de un paquete específico.

@BotCommand
@CommandPkg(label = "[[SessionDemo2.label]]", description = "[[SessionDemo2.description]]", icon = "sample.svg", name = "SessionDemo2",
return_type = DataType.STRING)
public class SessionDemo2 {

	// Sessions are provided as a Map. Actions can add or remove entries in this
	// Map.
	// The choice to reuse/overwrite/delete/add any Object in this Map belongs to
	// the actions, and the framework makes no assumption regarding it.
	@Sessions
	private Map<String, Object> sessionMap;

	@Execute
	public Value<?> execute(@Idx(index = "1", type = TEXT)
	@Pkg(label = "[[SessionDemo2.name.label]]")
	@NotEmpty
	String name) {
		if (sessionMap.containsKey(name)) {
			return new StringValue(sessionMap.get(name));
		}	
		return new StringValue("session does not exist");
	}
	// Ensure that a public setter exists.
	public void setSessionMap(Map<String, Object> sessionMap) {
		this.sessionMap = sessionMap;
	}
}