diff --git a/configschema.json b/configschema.json index 342d2c2a..4c723a22 100644 --- a/configschema.json +++ b/configschema.json @@ -764,6 +764,30 @@ "type": "string" } } + }, + "additionalDonations": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string" + }, + "description": { + "type": "string" + }, + "amount": { + "type": "number" + } + }, + "required": [ + "key", + "description", + "amount" + ] + }, + "default": [] } }, "required": [ @@ -785,6 +809,7 @@ "discord", "streamlabsCharity", "therungg", - "tiltify" + "tiltify", + "additionalDonations" ] } diff --git a/package.json b/package.json index cd5406b6..b43dbfe8 100644 --- a/package.json +++ b/package.json @@ -242,6 +242,14 @@ "file": "rabbitmq-test.html", "workspace": "Z9 - Debug", "headerColor": "#c49215" + }, + { + "name": "additional-donations-control", + "title": "Additional Donations Control", + "width": 3, + "file": "additional-donations-control.html", + "workspace": "Z2 - ESA Advanced", + "headerColor": "#c49215" } ], "graphics": [ diff --git a/schemas/additionalDonations.json b/schemas/additionalDonations.json new file mode 100644 index 00000000..81c757af --- /dev/null +++ b/schemas/additionalDonations.json @@ -0,0 +1,21 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "properties": { + "key": { + "type": "string" + }, + "active": { + "type": "boolean" + } + }, + "required": [ + "key", + "active" + ] + }, + "default": [] +} \ No newline at end of file diff --git a/src/browser_shared/replicant_store.ts b/src/browser_shared/replicant_store.ts index c9fa0a57..57888f9d 100644 --- a/src/browser_shared/replicant_store.ts +++ b/src/browser_shared/replicant_store.ts @@ -1,4 +1,4 @@ -import type { Bids, BigbuttonPlayerMap, Commentators, CommentatorsNew, Countdown, CurrentRunDelay, DonationAlerts, DonationReader, DonationReaderNew, DonationTotal, DonationTotalMilestones, DonationsToRead, GameLayouts, IntermissionSlides, MusicData, ObsData, Omnibar, OtherStreamData, Prizes, ReaderIntroduction, ServerTimestamp, StreamDeckData, TtsVoices, UpcomingRunID, VideoPlayer } from '@esa-layouts/types/schemas'; +import type { AdditionalDonations, Bids, BigbuttonPlayerMap, Commentators, CommentatorsNew, Countdown, CurrentRunDelay, DonationAlerts, DonationReader, DonationReaderNew, DonationTotal, DonationTotalMilestones, DonationsToRead, GameLayouts, IntermissionSlides, MusicData, ObsData, Omnibar, OtherStreamData, Prizes, ReaderIntroduction, ServerTimestamp, StreamDeckData, TtsVoices, UpcomingRunID, VideoPlayer } from '@esa-layouts/types/schemas'; import type NodeCGTypes from '@nodecg/types'; import clone from 'clone'; import { SpeedcontrolUtilBrowser } from 'speedcontrol-util'; @@ -13,6 +13,7 @@ const sc = new SpeedcontrolUtilBrowser(nodecg); // Declaring replicants. export const reps: { + additionalDonations: NodeCGTypes.ClientReplicant; assetsDonationAlertAssets: NodeCGTypes.ClientReplicant; assetsIntermissionSlides: NodeCGTypes.ClientReplicant; assetsReaderIntroductionImages: NodeCGTypes.ClientReplicant; @@ -47,6 +48,7 @@ export const reps: { videoPlayer: NodeCGTypes.ClientReplicant; [k: string]: NodeCGTypes.ClientReplicant; } = { + additionalDonations: nodecg.Replicant('additionalDonations'), assetsDonationAlertAssets: nodecg.Replicant('assets:donation-alert-assets'), assetsIntermissionSlides: nodecg.Replicant('assets:intermission-slides'), assetsReaderIntroductionImages: nodecg.Replicant('assets:reader-introduction-images'), @@ -83,6 +85,7 @@ export const reps: { // All the replicant types. export interface ReplicantTypes { + additionalDonations: AdditionalDonations; assetsDonationAlertAssets: NodeCGTypes.AssetFile[]; assetsIntermissionSlides: NodeCGTypes.AssetFile[]; assetsReaderIntroductionImages: NodeCGTypes.AssetFile[]; diff --git a/src/dashboard/additional-donations-control/components/Donation.vue b/src/dashboard/additional-donations-control/components/Donation.vue new file mode 100644 index 00000000..a447366d --- /dev/null +++ b/src/dashboard/additional-donations-control/components/Donation.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/dashboard/additional-donations-control/main.ts b/src/dashboard/additional-donations-control/main.ts new file mode 100644 index 00000000..73e7aee0 --- /dev/null +++ b/src/dashboard/additional-donations-control/main.ts @@ -0,0 +1,16 @@ +/* eslint no-new: off, @typescript-eslint/explicit-function-return-type: off */ + +import { setUpReplicants } from '@esa-layouts/browser_shared/replicant_store'; +import vuetify from '@esa-layouts/_misc/vuetify'; +import Vue from 'vue'; +import App from './main.vue'; +import store from './store'; + +setUpReplicants(store).then(() => { + new Vue({ + vuetify, + store, + el: '#App', + render: (h) => h(App), + }); +}); diff --git a/src/dashboard/additional-donations-control/main.vue b/src/dashboard/additional-donations-control/main.vue new file mode 100644 index 00000000..853ba5a5 --- /dev/null +++ b/src/dashboard/additional-donations-control/main.vue @@ -0,0 +1,43 @@ + + + diff --git a/src/dashboard/additional-donations-control/store.ts b/src/dashboard/additional-donations-control/store.ts new file mode 100644 index 00000000..7c0bd6b2 --- /dev/null +++ b/src/dashboard/additional-donations-control/store.ts @@ -0,0 +1,35 @@ +import { replicantModule, ReplicantModule, ReplicantTypes } from '@esa-layouts/browser_shared/replicant_store'; +import clone from 'clone'; +import Vue from 'vue'; +import Vuex, { Store } from 'vuex'; +import { getModule, Module, Mutation, VuexModule } from 'vuex-module-decorators'; + +Vue.use(Vuex); + +@Module({ name: 'OurModule' }) +class OurModule extends VuexModule { + // Helper getter to return all replicants. + get reps(): ReplicantTypes { + return this.context.rootState.ReplicantModule.reps; + } + + @Mutation + toggleItem({ key, active }: { key: string, active: boolean }): void { + const donations = clone(replicantModule.repsTyped.additionalDonations); + const donationIndex = donations.findIndex((d) => d.key === key); + if (donationIndex >= 0) { + donations[donationIndex].active = active; + } else { + donations.push({ key, active }); + } + replicantModule.setReplicant({ name: 'additionalDonations', val: donations }); + } +} + +const store = new Store({ + strict: process.env.NODE_ENV !== 'production', + state: {}, + modules: { ReplicantModule, OurModule }, +}); +export default store; +export const storeModule = getModule(OurModule, store); diff --git a/src/extension/util/replicants.ts b/src/extension/util/replicants.ts index 8a221406..279631ba 100644 --- a/src/extension/util/replicants.ts +++ b/src/extension/util/replicants.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ -import { Bids, BigbuttonPlayerMap, CapturePositions, Commentators, CommentatorsNew, Countdown, CurrentRunDelay, DelayedTimer, DonationAlerts, DonationReader, DonationReaderNew, DonationsToRead, DonationTotal, DonationTotalMilestones, GameLayouts, IntermissionSlides, MusicData, NameCycle, NotableDonations, ObsData, Omnibar, OtherStreamData, Prizes, ReaderIntroduction, ServerTimestamp, StreamDeckData, TaskmasterTimestamps, TtsVoices, UpcomingRunID, VideoPlayer } from '@esa-layouts/types/schemas'; +import { AdditionalDonations, Bids, BigbuttonPlayerMap, CapturePositions, Commentators, CommentatorsNew, Countdown, CurrentRunDelay, DelayedTimer, DonationAlerts, DonationReader, DonationReaderNew, DonationsToRead, DonationTotal, DonationTotalMilestones, GameLayouts, IntermissionSlides, MusicData, NameCycle, NotableDonations, ObsData, Omnibar, OtherStreamData, Prizes, ReaderIntroduction, ServerTimestamp, StreamDeckData, TaskmasterTimestamps, TtsVoices, UpcomingRunID, VideoPlayer } from '@esa-layouts/types/schemas'; import type NodeCGTypes from '@nodecg/types'; import { HoraroImportStatus, OengusImportStatus, TwitchAPIData, TwitchChannelInfo } from 'speedcontrol-util/types/schemas'; import { get as nodecg } from './nodecg'; @@ -9,6 +9,7 @@ import { get as nodecg } from './nodecg'; * This is where you can declare all your replicant to import easily into other files, * and to make sure they have any correct settings on startup. */ +export const additionalDonations = nodecg().Replicant('additionalDonations') as unknown as NodeCGTypes.ServerReplicantWithSchemaDefault; export const assetsDonationAlertAssets = nodecg().Replicant('assets:donation-alert-assets') as unknown as NodeCGTypes.ServerReplicantWithSchemaDefault; export const assetsIntermissionSlides = nodecg().Replicant('assets:intermission-slides') as unknown as NodeCGTypes.ServerReplicantWithSchemaDefault; export const assetsMediaBoxImages = nodecg().Replicant('assets:media-box-images') as unknown as NodeCGTypes.ServerReplicantWithSchemaDefault; diff --git a/src/graphics/omnibar/components/Total.vue b/src/graphics/omnibar/components/Total.vue index ec959884..43cfe890 100644 --- a/src/graphics/omnibar/components/Total.vue +++ b/src/graphics/omnibar/components/Total.vue @@ -134,8 +134,9 @@ diff --git a/src/types/schemas/additionalDonations.d.ts b/src/types/schemas/additionalDonations.d.ts new file mode 100644 index 00000000..e2812223 --- /dev/null +++ b/src/types/schemas/additionalDonations.d.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +/** + * This file was automatically generated by json-schema-to-typescript. + * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file, + * and run json-schema-to-typescript to regenerate this file. + */ + +export type AdditionalDonations = { + key: string; + active: boolean; +}[]; diff --git a/src/types/schemas/configschema.d.ts b/src/types/schemas/configschema.d.ts index ed74c2bf..630cfa34 100644 --- a/src/types/schemas/configschema.d.ts +++ b/src/types/schemas/configschema.d.ts @@ -138,6 +138,11 @@ export interface Configschema { errorDiscordWebhook?: string; errorDiscordWebhookUserIdToPing?: string; }; + additionalDonations: { + key: string; + description: string; + amount: number; + }[]; } export interface BidwarBias { bidId: number; diff --git a/src/types/schemas/index.d.ts b/src/types/schemas/index.d.ts index 7909bb0e..cd6421a5 100644 --- a/src/types/schemas/index.d.ts +++ b/src/types/schemas/index.d.ts @@ -2,6 +2,8 @@ // @ts-ignore export * from './configschema'; // @ts-ignore +export * from './additionalDonations'; +// @ts-ignore export * from './bids'; // @ts-ignore export * from './bigbuttonPlayerMap';