def set_conversation_valiables(self, client_context, variables):
        if client_context.userid in self._conversations:
            conversation = self._conversations[client_context.userid]
            if self._conversation_storage is not None:
                self._conversation_storage.load_conversation(
                    client_context, conversation)
        else:
            conversation = Conversation(client_context)
            conversation.num_categories = client_context.brain.aiml_parser.num_categories
            if self._conversation_storage is not None:
                self._conversation_storage.load_conversation(
                    client_context, conversation)
            conversation.load_initial_variables(
                client_context.brain.default_variables)
            self._conversations[client_context.userid] = conversation

        for variable in variables:
            try:
                var_type = variable['type']
                var_key = variable['key']
                var_value = variable['value']
            except Exception:
                raise

            if var_type == 'name':
                YLogger.debug(client_context,
                              "set userid[%s] variable name[%s] = [%s]",
                              client_context.userid, var_key, var_value)
                conversation.set_property(var_key, var_value)
            elif var_type == 'data':
                YLogger.debug(client_context,
                              "set userid[%s] variable data[%s] = [%s]",
                              client_context.userid, var_key, var_value)
                conversation.set_data_property(var_key, var_value)
            else:
                raise Exception('variable type not supported.')

        if self._conversation_storage is not None:
            self._conversation_storage.modify_conversation_data(
                client_context, conversation)

        if client_context.server_mode is True:
            self.remove_conversation(client_context)
    def get_conversation(self, client_context):

        assert (client_context is not None)
        assert (client_context.userid is not None)

        if client_context.userid in self._conversations:
            YLogger.debug(client_context,
                          "Retrieving conversation for client %s",
                          client_context.userid)
            conversation = self._conversations[client_context.userid]

            # Load existing conversation from cache
            if self.configuration.multi_client:
                if self._conversation_storage is not None:
                    self._conversation_storage.load_conversation(
                        client_context, conversation)

        else:
            YLogger.debug(client_context,
                          "Creating new conversation for client %s",
                          client_context.userid)

            conversation = Conversation(client_context)

            conversation.num_categories = client_context.brain.aiml_parser.num_categories

            conversation.load_initial_variables(
                client_context.brain.default_variables)

            self._conversations[client_context.userid] = conversation

            if self._conversation_storage is not None:
                self._conversation_storage.load_conversation(
                    client_context, conversation)

            if client_context.server_mode is False:
                self.load_learnf_with_userid(client_context)

            if self.configuration.restore_last_topic is True:
                pass

        return conversation