diff --git a/CHANGELOG.md b/CHANGELOG.md index 61c3c7d6..b035cbac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,12 @@ -## 2022.1 to be released +## 2022.1-rc1 to be released -### Feature +### Quality of Life + +* [x] Recipe: Action List Config - now has a button to open up the Action Settings + +### Fixes -* [ ] Ability to re-authenticate even when you are not in the normal ports +* [x] Trigger random using a queue on recipe and each item - could end up in not triggering a second time ## 2022.1-beta-4 diff --git a/ROADMAP.md b/ROADMAP.md index c011da91..1007cb5f 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -14,6 +14,7 @@ This list might be changed in future, depending on the amount of work that needs * [ ] Dependency: Twitch Scope System - for Scripts and Command Block Checks * [ ] Recipe: Obs Command Block: Set Volume * [ ] Dependency: Command Block Settings for Numbers with a Range Config +* [ ] Ability to re-authenticate even when you are not in the normal ports ### Misc diff --git a/projects/app-state/src/lib/activity-state/action-activity.service.ts b/projects/app-state/src/lib/activity-state/action-activity.service.ts index d1329698..b79c1e75 100644 --- a/projects/app-state/src/lib/activity-state/action-activity.service.ts +++ b/projects/app-state/src/lib/activity-state/action-activity.service.ts @@ -17,7 +17,16 @@ export class ActionActivityService { // Load State once this.memeboxApi.get(`${ENDPOINTS.ACTION_ACTIVITY.PREFIX}${ENDPOINTS.ACTION_ACTIVITY.CURRENT}`) .then( actionStateInitialValue => { - this.activityStore.update(() => actionStateInitialValue); + this.activityStore.update((currentState) => + { + return { + actionState: { + ...currentState.actionState, + ...actionStateInitialValue, + }, + screenState: currentState.screenState + } + }); }); const actionStateWSHandler = new WebsocketHandler( diff --git a/projects/recipe-ui/src/lib/command-setting-dialog/action-list-settings/action-list-settings.component.html b/projects/recipe-ui/src/lib/command-setting-dialog/action-list-settings/action-list-settings.component.html index 58af5f48..943eafa7 100644 --- a/projects/recipe-ui/src/lib/command-setting-dialog/action-list-settings/action-list-settings.component.html +++ b/projects/recipe-ui/src/lib/command-setting-dialog/action-list-settings/action-list-settings.component.html @@ -42,11 +42,21 @@ {{ actionDictionary[actionEntry.actionId]?.name }} - + +
+ + +
{ - return isActionCurrently(state, ActionStateEnum.Active, actionId, screenId ?? actionId); + return isActionCurrently(state, ActionStateEnum.Active, actionId, screenId); }), map(_ => {}), take(1) @@ -98,7 +98,7 @@ export class ActionActiveState { return this._state$ .pipe( filter(( state) => { - const done = isActionCurrently(state, ActionStateEnum.Done, actionId, screenId ?? actionId); + const done = isActionCurrently(state, ActionStateEnum.Done, actionId, screenId); return done; }), diff --git a/server/providers/actions/action-queue.ts b/server/providers/actions/action-queue.ts index 8b29de1f..15d3795a 100644 --- a/server/providers/actions/action-queue.ts +++ b/server/providers/actions/action-queue.ts @@ -24,34 +24,36 @@ export class ActionQueue { const actionConfig = fullState.clips[triggerAction.id]; - if (actionConfig.queueName) { - if (isVisibleMedia(actionConfig.type)) { - const currentState = this.actionState.getActiveStateEntry(triggerAction.id, triggerAction.targetScreen); - const mediaInScreenConfig = fullState.screen[triggerAction.targetScreen]?.clips[triggerAction.id]; + if (!actionConfig.queueName) { + // no queue needed, "just do it" + await this.executeTriggerWithoutQueueAndWait(triggerAction); + return; + } - const visibilityOfOverrides =currentState?.currentOverrides?.screenMedia?.visibility; - const visibilityOfMedia = mediaInScreenConfig?.visibility; + // Special: handle already visible / toggled media + if (isVisibleMedia(actionConfig.type)) { + const currentState = this.actionState.getActiveStateEntry(triggerAction.id, triggerAction.targetScreen); + const mediaInScreenConfig = fullState.screen[triggerAction.targetScreen]?.clips[triggerAction.id]; - const currentVisibilityConfig = visibilityOfOverrides ?? visibilityOfMedia; + const visibilityOfOverrides = currentState?.currentOverrides?.screenMedia?.visibility; + const visibilityOfMedia = mediaInScreenConfig?.visibility; - if (currentState?.state === ActionStateEnum.Active && currentVisibilityConfig === VisibilityEnum.Toggle) { - await this.executeTriggerWithoutQueueAndWait(triggerAction); - return; - } + const currentVisibilityConfig = visibilityOfOverrides ?? visibilityOfMedia; + + if (currentState?.state === ActionStateEnum.Active && currentVisibilityConfig === VisibilityEnum.Toggle) { + await this.executeTriggerWithoutQueueAndWait(triggerAction); + return; } + } - const subject = this.createOrGetQueueSubject(actionConfig.queueName); - subject.next(triggerAction); + const subject = this.createOrGetQueueSubject(actionConfig.queueName); - await this._queueDone$.pipe( - filter(uniqueDone => uniqueDone === triggerAction.uniqueId), - take(1), - ).toPromise(); - } else { - // no queue needed, "just do it" + subject.next(triggerAction); - await this.executeTriggerWithoutQueueAndWait(triggerAction); - } + await this._queueDone$.pipe( + filter(uniqueDone => uniqueDone === triggerAction.uniqueId), + take(1) + ).toPromise(); } private createOrGetQueueSubject (queueName: string) { diff --git a/src/app/pages/debug/activity-state/activity-state.component.ts b/src/app/pages/debug/activity-state/activity-state.component.ts index 98cd51a8..5cd9b80d 100644 --- a/src/app/pages/debug/activity-state/activity-state.component.ts +++ b/src/app/pages/debug/activity-state/activity-state.component.ts @@ -3,6 +3,7 @@ import {ActivityQueries, AppQueries, AppService} from "@memebox/app-state"; import {filter, map} from "rxjs/operators"; import {ACTION_TYPE_INFORMATION, ActionStateEnum, ActionType} from "@memebox/contracts"; import {combineLatest} from "rxjs"; +import {ActionStateEntry} from "@memebox/shared-state"; function actionStateEnumToString (activity: ActionStateEnum) { switch (activity) { @@ -31,23 +32,23 @@ export class ActivityStateComponent { ) ]).pipe( map(([activityState, actionMap]) => { - const actionKeys = Object.keys(activityState); + const actionKeys = Object.keys(activityState.actionState ?? {}); return actionKeys.map(actionId => { - const statesOfAction = activityState[actionId]; + const statesOfAction: Record = activityState.actionState[actionId]; const keysOfStates = Object.keys(statesOfAction); let activityOfAction = ''; if (keysOfStates.includes(actionId)) { - activityOfAction = actionStateEnumToString(statesOfAction[actionId]) + activityOfAction = actionStateEnumToString(statesOfAction[actionId].state) } const stateInScreen = keysOfStates.filter(key => key !== actionId) .map(key => { return { screenId: key, - state: actionStateEnumToString(statesOfAction[key]) + state: actionStateEnumToString(statesOfAction[key].state) } });