您可以使用会话名称从 SessionsMap 中提取会话。 在同一个软件包中,可以使用会话在操作之间传递信息,但不能传递到其他软件包。

配置以下属性

  • 为类字段添加注解,并添加相应的公共设置器。
  • 使用 Sessions 属性检索 SessionsMap
  • 将变量类型设置为 Map<String, Object>
  • 设置 attributeType文本会话。 如果 type = TEXT,则为常规会话;如果 type = SESSION,则为 sharedSession

启动新会话

@BotCommand @CommandPkg(label = "开始会话", name = "startSession", description = "开始新会话", icon = "pkg.svg", node_label = "开始会话 {{sessionName}}|") public class Start { @Sessions private Map<String, Object> sessions; @Execute public void start(@Idx(index = "1", type = TEXT) @Pkg(label = "会话名称", default_value_type = STRING, default_value = "默认") @NotEmpty String sessionName) { // 检查现有会话 if (sessions.containsKey(sessionName)) throw new BotCommandException(MESSAGES.getString("xml.SessionNameInUse", sessionName)); // 执行某些操作 // 创建新会话 sessions.put(sessionName, new Session(operation)); } public void setSessions(Map<String, Object> sessions) { this.sessions = sessions; } }

结束会话

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

添加会话

在下面的示例中,使用的是字符串对象(尽管在实际操作中可以使用复杂对象)。

@BotCommand @CommandPkg(label = "[[SessionDemo.label]]", description = "[[SessionDemo.description]]", icon = "sample.svg", name = "sessionDemo") public class SessionDemo { // 会话以 Map 的形式提供。 操作可以在此 // Map // 中添加或删除条目。是否重用/覆盖/删除/添加此 Map 中的任何对象的选择属于 // 操作,框架对此不做任何假设。@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, "某个值"); } // 确保存在一个公共设置器方法。public void setSessionMap(Map<String, Object> sessionMap) { this.sessionMap = sessionMap; } }

设置会话变量

下面的示例展示了如何开发操作(例如,设置会话变量)。 在操作中,将检索会话详细信息并存储为会话变量,以便在特定软件包中使用这些信息。

@BotCommand @CommandPkg(label = "[[SessionDemo2.label]]", description = "[[SessionDemo2.description]]", icon = "sample.svg", name = "SessionDemo2", return_type = DataType.STRING) public class SessionDemo2 { // 会话以 Map 的形式提供。 操作可以在此 // Map // 中添加或删除条目。选择重用/覆盖/删除/添加此 Map 中的任何对象属于 // 操作,框架对此不做任何假设。@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("会话不存在"); } // 确保存在一个公共设置器。public void setSessionMap(Map<String, Object> sessionMap) { this.sessionMap = sessionMap; } }