Ejemplo n.º 1
0
    def confirmUsername(self, session: DialogSession):
        intent = session.intentName
        if intent == self._INTENT_ANSWER_NAME:
            username = str(session.slots['Name']).lower()
        else:
            username = ''.join([
                slot.value['value']
                for slot in session.slotsAsObjects['Letters']
            ])

        if session.slotRawValue('Name') == constants.UNKNOWN_WORD:
            self.continueDialog(
                sessionId=session.sessionId,
                text=self.TalkManager.randomTalk('notUnderstood',
                                                 skill='system'),
                intentFilter=[
                    self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                ],
                currentDialogState='addingUser')
            return

        self.continueDialog(sessionId=session.sessionId,
                            text=self.randomTalk(text='confirmUsername',
                                                 replace=[username]),
                            intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                            currentDialogState='confirmingUsername',
                            customData={'username': username})
Ejemplo n.º 2
0
	def getWeather(self, session: DialogSession):

		if not self.getConfig('apiKey'):
			self.endDialog(
				sessionId=session.sessionId,
				text=self.randomTalk('noApiKey')
			)
			return

		city = session.slotRawValue('City') or self.getConfig('baseLocation')

		if 'when' not in session.slots:
			data = self._queryData(city=city)
			if not data:
				self.continueDialog(
					sessionId=session.sessionId,
					text=self.randomTalk('notFound', replace=[city]),
					intentFilter=[Intent('AnswerCity')],
					slot='CityNames',
					currentDialogState='answeringCity'
				)
			else:
				self.endDialog(
					sessionId=session.sessionId,
					text=self.randomTalk('currentWeather',
					                     replace=[
						                     city,
						                     round(float(data['main']['temp']), 1),
						                     data['weather'][0]['description']
					                     ]
					                     )
				)
		else:
			# TODO
			self.endSession(sessionId=session.sessionId)
Ejemplo n.º 3
0
	def getUserFact(self, session: DialogSession, **_kwargs):
		if not session.user or session.user == constants.UNKNOWN_USER:
			self.endDialog(sessionId=session.sessionId, text=self.randomTalk(text='dontKnowYou'))

		slots = session.slotsAsObjects
		if not slots['Fact']:
			self.endDialog(sessionId=session.sessionId, text=self.TalkManager.randomTalk('notUnderstood', skill='system'))

		if len(slots['Fact']) == 1:
			fact = session.slotRawValue('Fact')
		else:
			fact = ''
			for slot in slots:
				if not slot:
					continue

				fact += f' {slot.value["value"]}'

		# noinspection SqlResolve
		answer = self.databaseFetch(
			tableName='facts',
			query='SELECT value FROM :__table__ WHERE username = :username AND fact = :fact',
			values={
				'username': session.user,
				'fact'    : fact
			}
		)

		if not answer:
			self.continueDialog(
				sessionId=session.sessionId,
				text=self.randomTalk(text='noResult'),
				intentFilter=[self._INTENT_USER_ANSWER, self._INTENT_SPELL_WORD],
				probabilityThreshold=0.01,
				currentDialogState='answeringFactValue',
				customData={
					'skill': self.name,
					'fact' : fact
				}
			)
		else:
			self._previousFact = fact
			self.endDialog(
				sessionId=session.sessionId,
				text=self.randomTalk(text='fact', replace=[fact, answer['value']])
			)
Ejemplo n.º 4
0
    def confirmUsername(self, session: DialogSession):
        intent = session.intentName

        if intent == self._INTENT_ANSWER_NAME:
            username = session.slots['Name'].lower()
        else:
            username = ''.join([
                slot.value['value']
                for slot in session.slotsAsObjects['Letters']
            ])

        if session.slotRawValue(
                'Name') == constants.UNKNOWN_WORD or not username:
            self.continueDialog(
                sessionId=session.sessionId,
                text=self.TalkManager.randomTalk('notUnderstood',
                                                 skill='system'),
                intentFilter=[
                    self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                ],
                currentDialogState=session.currentState,
                probabilityThreshold=0.1)
            return

        if session.currentState == DialogState('addingUser'):
            state = 'confirmingUsername'
        elif session.currentState == DialogState('givingNameForNewWakeword'):
            state = 'confirmingUsernameForNewWakeword'
        else:
            state = 'confirmingUsernameForTuneWakeword'

        self.continueDialog(sessionId=session.sessionId,
                            text=self.randomTalk(text='confirmUsername',
                                                 replace=[username]),
                            intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                            currentDialogState=state,
                            probabilityThreshold=0.1,
                            customData={'username': username})
Ejemplo n.º 5
0
    def onMessage(self, intent: str, session: DialogSession) -> bool:
        if intent == self._INTENT_GLOBAL_STOP:
            self.endDialog(sessionId=session.sessionId,
                           text=self.randomTalk('confirmGlobalStop'),
                           siteId=session.siteId)
            return True

        if not self.filterIntent(intent, session):
            return False

        siteId = session.siteId
        slots = session.slots
        slotsObj = session.slotsAsObjects
        sessionId = session.sessionId
        customData = session.customData
        payload = session.payload

        if self._INTENT_ADD_DEVICE in {intent, session.previousIntent}:
            if self.DeviceManager.isBusy():
                self.endDialog(sessionId=sessionId,
                               text=self.randomTalk('busy'),
                               siteId=siteId)
                return True

            if 'Hardware' not in slots:
                self.continueDialog(sessionId=sessionId,
                                    text=self.randomTalk('whatHardware'),
                                    intentFilter=[
                                        self._INTENT_ANSWER_HARDWARE_TYPE,
                                        self._INTENT_ANSWER_ESP_TYPE
                                    ],
                                    previousIntent=self._INTENT_ADD_DEVICE)
                return True

            elif slotsObj['Hardware'][0].value[
                    'value'] == 'esp' and 'EspType' not in slots:
                self.continueDialog(sessionId=sessionId,
                                    text=self.randomTalk('whatESP'),
                                    intentFilter=[
                                        self._INTENT_ANSWER_HARDWARE_TYPE,
                                        self._INTENT_ANSWER_ESP_TYPE
                                    ],
                                    previousIntent=self._INTENT_ADD_DEVICE)
                return True

            elif 'Room' not in slots:
                self.continueDialog(sessionId=sessionId,
                                    text=self.randomTalk('whichRoom'),
                                    intentFilter=[self._INTENT_ANSWER_ROOM],
                                    previousIntent=self._INTENT_ADD_DEVICE)
                return True

            hardware = slotsObj['Hardware'][0].value['value']
            if hardware == 'esp':
                if not self.ModuleManager.isModuleActive('Tasmota'):
                    self.endDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('requireTasmotaModule'))
                    return True

                if self.DeviceManager.isBusy():
                    self.endDialog(sessionId=sessionId,
                                   text=self.randomTalk('busy'))
                    return True

                if not self.DeviceManager.startTasmotaFlashingProcess(
                        commons.cleanRoomNameToSiteId(slots['Room']),
                        slotsObj['EspType'][0].value['value'], session):
                    self.endDialog(sessionId=sessionId,
                                   text=self.randomTalk('espFailed'))

            elif hardware == 'satellite':
                if self.DeviceManager.startBroadcastingForNewDevice(
                        commons.cleanRoomNameToSiteId(slots['Room']), siteId):
                    self.endDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('confirmDeviceAddingMode'))
                else:
                    self.endDialog(sessionId=sessionId,
                                   text=self.randomTalk('busy'))
            else:
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk('unknownHardware'),
                    intentFilter=[self._INTENT_ANSWER_HARDWARE_TYPE],
                    previousIntent=self._INTENT_ADD_DEVICE)
                return True

        elif intent == self._INTENT_MODULE_GREETING:
            if 'uid' not in payload or 'siteId' not in payload:
                self._logger.warning(
                    'A device tried to connect but is missing informations in the payload, refused'
                )
                self.publish(topic='projectalice/devices/connectionRefused',
                             payload={'siteId': payload['siteId']})
                return True

            device = self.DeviceManager.deviceConnecting(uid=payload['uid'])
            if device:
                self._logger.info(
                    'Device with uid {} of type {} in room {} connected'.
                    format(device.uid, device.deviceType, device.room))
                self.publish(topic='projectalice/devices/connectionAccepted',
                             payload={
                                 'siteId': payload['siteId'],
                                 'uid': payload['uid']
                             })
            else:
                self.publish(topic='projectalice/devices/connectionRefused',
                             payload={
                                 'siteId': payload['siteId'],
                                 'uid': payload['uid']
                             })
                return True

        elif intent == self._INTENT_ANSWER_YES_OR_NO:
            if session.previousIntent == self._INTENT_REBOOT:
                if 'step' in customData:
                    if customData['step'] == 1:
                        if commons.isYes(session):
                            self.continueDialog(
                                sessionId=sessionId,
                                text=self.randomTalk('askRebootModules'),
                                intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                                previousIntent=self._INTENT_REBOOT,
                                customData={
                                    'module': self.name,
                                    'step': 2
                                })
                        else:
                            self.endDialog(sessionId,
                                           self.randomTalk('abortReboot'))
                    else:
                        value = 'greet'
                        if commons.isYes(session):
                            value = 'greetAndRebootModules'

                        self.ConfigManager.updateAliceConfiguration(
                            'onReboot', value)
                        self.endDialog(sessionId,
                                       self.randomTalk('confirmRebooting'))
                        self.ThreadManager.doLater(interval=5,
                                                   func=self.restart)
                else:
                    self.endDialog(sessionId)
                    self._logger.warn(
                        '[{}] Asked to reboot, but missing params'.format(
                            self.name))

            elif session.previousIntent == self._INTENT_DUMMY_ADD_USER:
                if commons.isYes(session):
                    self.UserManager.addNewUser(customData['name'],
                                                AccessLevel.ADMIN.name.lower())
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('addUserWakeword',
                                             replace=[customData['name']]),
                        intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                        previousIntent=self._INTENT_DUMMY_ADD_WAKEWORD)
                else:
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('soWhatsTheName'),
                        intentFilter=[
                            self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                        ],
                        previousIntent=self._INTENT_DUMMY_ADD_USER)

            elif session.previousIntent == self._INTENT_DUMMY_ADD_WAKEWORD:
                if commons.isYes(session):
                    self.WakewordManager.newWakeword(
                        username=customData['name'])
                    self.ThreadManager.newLock('AddingWakeword').set()
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('addWakewordAccepted'),
                        intentFilter=[self._INTENT_WAKEWORD],
                        previousIntent=self._INTENT_DUMMY_WAKEWORD_INSTRUCTION)
                else:
                    if self.delayed:
                        self.delayed = False
                        self.ThreadManager.doLater(interval=2,
                                                   func=self.onStart)

                    self.endDialog(sessionId=sessionId,
                                   text=self.randomTalk('addWakewordDenied'))

            elif session.previousIntent == self._INTENT_ADD_USER:
                if commons.isYes(session):
                    self.UserManager.addNewUser(customData['username'],
                                                slots['UserAccessLevel'])
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk(
                            'addUserWakeword',
                            replace=[slots['Name'], slots['UserAccessLevel']]),
                        intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                        previousIntent=self._INTENT_DUMMY_ADD_USER_WAKEWORD)
                else:
                    self.continueDialog(sessionId=sessionId,
                                        text=self.randomTalk('soWhatsTheName'),
                                        intentFilter=[
                                            self._INTENT_ANSWER_NAME,
                                            self._INTENT_SPELL_WORD
                                        ],
                                        previousIntent=self._INTENT_ADD_USER)

            elif session.previousIntent == self._INTENT_DUMMY_ADD_USER_WAKEWORD:
                if commons.isYes(session):
                    # TODO
                    return True
                else:
                    self.endSession(sessionId=sessionId)

            elif session.previousIntent == self._INTENT_DUMMY_WAKEWORD_FAILED:
                if commons.isYes(session):
                    self.WakewordManager.tryCaptureFix()
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('addWakewordAccepted'),
                        intentFilter=[self._INTENT_WAKEWORD],
                        previousIntent=self._INTENT_DUMMY_WAKEWORD_INSTRUCTION)
                else:
                    if self.delayed:
                        self.delayed = False
                        self.ThreadManager.getLock('AddingWakeword').clear()
                        self.ThreadManager.doLater(interval=2,
                                                   func=self.onStart)

                    self.endDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('cancellingWakewordCapture'))

            else:
                return False

        elif intent == self._INTENT_WAKEWORD and session.previousIntent == self._INTENT_DUMMY_WAKEWORD_INSTRUCTION:
            i = 0  # Failsafe...
            while self.WakewordManager.state != WakewordManagerState.CONFIRMING:
                i += 1
                if i > 15:
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('wakewordCaptureTooNoisy'),
                        intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                        previousIntent=self._INTENT_DUMMY_WAKEWORD_FAILED)
                    return True
                time.sleep(0.5)

            filepath = Path(
                tempfile.gettempdir(),
                str(self.WakewordManager.getLastSampleNumber())).with_suffix(
                    '.wav')

            if not filepath.exists():
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk('wakewordCaptureFailed'),
                    intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                    previousIntent=self._INTENT_DUMMY_WAKEWORD_FAILED)
            else:
                self.playSound(soundFile=str(filepath),
                               sessionId='checking-wakeword',
                               siteId=session.siteId,
                               absolutePath=True)

                text = 'howWasTheCapture' if self.WakewordManager.getLastSampleNumber(
                ) == 1 else 'howWasThisCapture'

                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk(text),
                    intentFilter=[self._INTENT_ANSWER_WAKEWORD_CUTTING],
                    slot='WakewordCaptureResult',
                    previousIntent=self._INTENT_WAKEWORD)

        elif intent == self._INTENT_ANSWER_WAKEWORD_CUTTING:
            if session.slotValue('WakewordCaptureResult') == 'more':
                self.WakewordManager.trimMore()
            elif session.slotValue('WakewordCaptureResult') == 'less':
                self.WakewordManager.trimLess()
            elif session.slotValue('WakewordCaptureResult') == 'restart':
                self.WakewordManager.state = WakewordManagerState.IDLE
                self.WakewordManager.removeSample()
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk(
                        'restartSample',
                        replace=[
                            3 - self.WakewordManager.getLastSampleNumber()
                        ]),
                    intentFilter=[self._INTENT_WAKEWORD],
                    previousIntent=self._INTENT_DUMMY_WAKEWORD_INSTRUCTION)
            elif session.slotValue('WakewordCaptureResult') == 'ok':
                if self.WakewordManager.getLastSampleNumber() < 3:
                    self.WakewordManager.state = WakewordManagerState.IDLE
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk(
                            'sampleOk',
                            replace=[
                                3 - self.WakewordManager.getLastSampleNumber()
                            ]),
                        intentFilter=[self._INTENT_WAKEWORD],
                        previousIntent=self._INTENT_DUMMY_WAKEWORD_INSTRUCTION)
                else:
                    self.ThreadManager.getLock('AddingWakeword').clear()
                    if self.delayed:
                        self.delayed = False
                        self.ThreadManager.doLater(interval=2,
                                                   func=self.onStart)

                    self.WakewordManager.finalizeWakeword()
                    self.endDialog(sessionId=sessionId,
                                   text=self.randomTalk('wakewordCaptureDone'))

                return True

            i = 0  # Failsafe
            while self.WakewordManager.state != WakewordManagerState.CONFIRMING:
                i += 1
                if i > 15:
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('wakewordCaptureTooNoisy'),
                        intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                        previousIntent=self._INTENT_DUMMY_WAKEWORD_FAILED)
                    return True
                time.sleep(0.5)

            filepath = Path(
                tempfile.gettempdir(),
                str(self.WakewordManager.getLastSampleNumber())).with_suffix(
                    '.wav')
            self.playSound(soundFile=str(filepath),
                           sessionId='checking-wakeword',
                           siteId=session.siteId,
                           absolutePath=True)

            self.continueDialog(
                sessionId=sessionId,
                text=self.randomTalk('howWasTheCaptureNow'),
                intentFilter=[self._INTENT_ANSWER_WAKEWORD_CUTTING],
                slot='WakewordCaptureResult',
                previousIntent=self._INTENT_WAKEWORD)

        elif intent == self._INTENT_SWITCH_LANGUAGE:
            self.publish(topic='hermes/asr/textCaptured',
                         payload={'siteId': siteId})
            if 'ToLang' not in slots:
                self.endDialog(text=self.randomTalk('noDestinationLanguage'))
                return True

            try:
                self.LanguageManager.changeActiveLanguage(slots['ToLang'])
                self.ThreadManager.doLater(
                    interval=3,
                    func=self.langSwitch,
                    args=[slots['ToLang'], siteId, False])
            except LanguageManagerLangNotSupported:
                self.endDialog(text=self.randomTalk(text='langNotSupported',
                                                    replace=[slots['ToLang']]))
            except ConfigurationUpdateFailed:
                self.endDialog(text=self.randomTalk('langSwitchFailed'))

        elif intent == self._INTENT_UPDATE_ALICE:
            if not self.InternetManager.online:
                self.endDialog(
                    sessionId=sessionId,
                    text=self.randomTalk('noAssistantUpdateOffline'))
                return True

            self.publish('hermes/leds/systemUpdate')

            if 'WhatToUpdate' not in slots:
                update = 1
            elif slots['WhatToUpdate'] == 'alice':
                update = 2
            elif slots['WhatToUpdate'] == 'assistant':
                update = 3
            elif slots['WhatToUpdate'] == 'modules':
                update = 4
            else:
                update = 5

            if update in {1, 5}:  # All or system
                self._logger.info('[{}] Updating system'.format(self.name))
                self.endDialog(sessionId=sessionId,
                               text=self.randomTalk('confirmAssistantUpdate'))

                def systemUpdate():
                    subprocess.run(['sudo', 'apt-get', 'update'])
                    subprocess.run(['sudo', 'apt-get', 'dist-upgrade', '-y'])
                    subprocess.run(['git', 'stash'])
                    subprocess.run(['git', 'pull'])
                    subprocess.run(['git', 'stash', 'clear'])
                    SuperManager.getInstance().threadManager.doLater(
                        interval=2,
                        func=subprocess.run,
                        args=['sudo', 'systemctl', 'restart', 'ProjectAlice'])

                self.ThreadManager.doLater(interval=2, func=systemUpdate)

            if update in {1, 4}:  # All or modules
                self._logger.info('[{}] Updating modules'.format(self.name))
                self.endDialog(sessionId=sessionId,
                               text=self.randomTalk('confirmAssistantUpdate'))
                self.ModuleManager.checkForModuleUpdates()

            if update in {1, 2}:  # All or Alice
                self._logger.info('[{}] Updating Alice'.format(self.name))
                if update == 2:
                    self.endDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('confirmAssistantUpdate'))

            if update in {1, 3}:  # All or Assistant
                self._logger.info('[{}] Updating assistant'.format(self.name))

                if not self.LanguageManager.activeSnipsProjectId:
                    self.endDialog(sessionId=sessionId,
                                   text=self.randomTalk('noProjectIdSet'))
                elif not self.SnipsConsoleManager.loginCredentialsAreConfigured(
                ):
                    self.endDialog(
                        sessionId=sessionId,
                        text=self.randomTalk('bundleUpdateNoCredentials'))
                else:
                    if update == 3:
                        self.endDialog(
                            sessionId=sessionId,
                            text=self.randomTalk('confirmAssistantUpdate'))

                    self.ThreadManager.doLater(interval=2,
                                               func=self.SamkillaManager.sync)

        elif intent == self._INTENT_REBOOT:
            self.continueDialog(sessionId=sessionId,
                                text=self.randomTalk('confirmReboot'),
                                intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                                previousIntent=self._INTENT_REBOOT,
                                customData={
                                    'module': self.name,
                                    'step': 1
                                })

        elif intent == self._INTENT_STOP_LISTEN:
            if 'Duration' in slots:
                duration = commons.getDuration(session)
                if duration > 0:
                    self.ThreadManager.doLater(interval=duration,
                                               func=self.unmuteSite,
                                               args=[siteId])

            aliceModule = self.ModuleManager.getModuleInstance(
                'AliceSatellite')
            if aliceModule:
                aliceModule.notifyDevice('projectalice/devices/stopListen',
                                         siteId=siteId)

            self.endDialog(sessionId=sessionId)

        elif session.previousIntent == self._INTENT_DUMMY_ADD_USER and intent in {
                self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
        }:
            if not self.UserManager.users:
                if intent == self._INTENT_ANSWER_NAME:
                    name: str = str(slots['Name']).lower()
                    if commons.isSpelledWord(name):
                        name = name.replace(' ', '')
                else:
                    name = ''.join(
                        [slot.value['value'] for slot in slotsObj['Letters']])

                if name in self.UserManager.getAllUserNames(skipGuests=False):
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk(text='userAlreadyExist',
                                             replace=[name]),
                        intentFilter=[
                            self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                        ],
                        previousIntent=self._INTENT_DUMMY_ADD_USER)
                else:
                    self.continueDialog(
                        sessionId=sessionId,
                        text=self.randomTalk(text='confirmUsername',
                                             replace=[name]),
                        intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                        previousIntent=self._INTENT_DUMMY_ADD_USER,
                        customData={'name': name})
            else:
                self.endDialog(sessionId)

        elif intent in {
                self._INTENT_ADD_USER, self._INTENT_ANSWER_ACCESSLEVEL
        } or session.previousIntent == self._INTENT_ADD_USER and intent != self._INTENT_SPELL_WORD:
            if 'Name' not in slots:
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk('addUserWhatsTheName'),
                    intentFilter=[self._INTENT_ANSWER_NAME],
                    previousIntent=self._INTENT_ADD_USER,
                    slot='Name')
                return True

            if session.slotRawValue('Name') == constants.UNKNOWN_WORD:
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.TalkManager.randomTalk('notUnderstood',
                                                     module='system'),
                    intentFilter=[
                        self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                    ],
                    previousIntent=self._INTENT_ADD_USER)
                return True

            if slots['Name'] in self.UserManager.getAllUserNames(
                    skipGuests=False):
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk(text='userAlreadyExist',
                                         replace=[slots['Name']]),
                    intentFilter=[
                        self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                    ],
                    previousIntent=self._INTENT_ADD_USER)
                return True

            if 'UserAccessLevel' not in slots:
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk('addUserWhatAccessLevel'),
                    intentFilter=[self._INTENT_ANSWER_ACCESSLEVEL],
                    previousIntent=self._INTENT_ADD_USER,
                    slot='UserAccessLevel')
                return True

            self.continueDialog(sessionId=sessionId,
                                text=self.randomTalk(
                                    text='addUserConfirmUsername',
                                    replace=[slots['Name']]),
                                intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                                previousIntent=self._INTENT_ADD_USER,
                                customData={'username': slots['Name']})
            return True

        elif intent == self._INTENT_SPELL_WORD and session.previousIntent == self._INTENT_ADD_USER:
            name = ''.join(
                [slot.value['value'] for slot in slotsObj['Letters']])

            session.slots['Name']['value'] = name
            if name in self.UserManager.getAllUserNames(skipGuests=False):
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk(text='userAlreadyExist',
                                         replace=[name]),
                    intentFilter=[
                        self._INTENT_ANSWER_NAME, self._INTENT_SPELL_WORD
                    ],
                    previousIntent=self._INTENT_ADD_USER)
            else:
                self.continueDialog(
                    sessionId=sessionId,
                    text=self.randomTalk(text='addUserConfirmUsername',
                                         replace=[name]),
                    intentFilter=[self._INTENT_ANSWER_YES_OR_NO],
                    previousIntent=self._INTENT_ADD_USER,
                    customData={'username': name})

        return True