IgnoreActivities: Add option for blacklist filter (#2712)
This commit is contained in:
		
							parent
							
								
									ad3d936dfd
								
							
						
					
					
						commit
						e473a57c3d
					
				
					 2 changed files with 66 additions and 26 deletions
				
			
		|  | @ -26,6 +26,11 @@ interface IgnoredActivity { | |||
|     type: ActivitiesTypes; | ||||
| } | ||||
| 
 | ||||
| const enum FilterMode { | ||||
|     Whitelist, | ||||
|     Blacklist | ||||
| } | ||||
| 
 | ||||
| const RunningGameStore = findStoreLazy("RunningGameStore"); | ||||
| 
 | ||||
| const ShowCurrentGame = getUserSettingLazy("status", "showCurrentGame")!; | ||||
|  | @ -70,14 +75,17 @@ function handleActivityToggle(e: React.MouseEvent<HTMLButtonElement, MouseEvent> | |||
|     if (ignoredActivityIndex === -1) settings.store.ignoredActivities = getIgnoredActivities().concat(activity); | ||||
|     else settings.store.ignoredActivities = getIgnoredActivities().filter((_, index) => index !== ignoredActivityIndex); | ||||
| 
 | ||||
|     // Trigger activities recalculation
 | ||||
|     recalculateActivities(); | ||||
| } | ||||
| 
 | ||||
| function recalculateActivities() { | ||||
|     ShowCurrentGame.updateSetting(old => old); | ||||
| } | ||||
| 
 | ||||
| function ImportCustomRPCComponent() { | ||||
|     return ( | ||||
|         <Flex flexDirection="column"> | ||||
|             <Forms.FormText type={Forms.FormText.Types.DESCRIPTION}>Import the application id of the CustomRPC plugin to the allowed list</Forms.FormText> | ||||
|             <Forms.FormText type={Forms.FormText.Types.DESCRIPTION}>Import the application id of the CustomRPC plugin to the filter list</Forms.FormText> | ||||
|             <div> | ||||
|                 <Button | ||||
|                     onClick={() => { | ||||
|  | @ -86,7 +94,7 @@ function ImportCustomRPCComponent() { | |||
|                             return showToast("CustomRPC application ID is not set.", Toasts.Type.FAILURE); | ||||
|                         } | ||||
| 
 | ||||
|                         const isAlreadyAdded = allowedIdsPushID?.(id); | ||||
|                         const isAlreadyAdded = idsListPushID?.(id); | ||||
|                         if (isAlreadyAdded) { | ||||
|                             showToast("CustomRPC application ID is already added.", Toasts.Type.FAILURE); | ||||
|                         } | ||||
|  | @ -99,39 +107,39 @@ function ImportCustomRPCComponent() { | |||
|     ); | ||||
| } | ||||
| 
 | ||||
| let allowedIdsPushID: ((id: string) => boolean) | null = null; | ||||
| let idsListPushID: ((id: string) => boolean) | null = null; | ||||
| 
 | ||||
| function AllowedIdsComponent(props: { setValue: (value: string) => void; }) { | ||||
|     const [allowedIds, setAllowedIds] = useState<string>(settings.store.allowedIds ?? ""); | ||||
| function IdsListComponent(props: { setValue: (value: string) => void; }) { | ||||
|     const [idsList, setIdsList] = useState<string>(settings.store.idsList ?? ""); | ||||
| 
 | ||||
|     allowedIdsPushID = (id: string) => { | ||||
|         const currentIds = new Set(allowedIds.split(",").map(id => id.trim()).filter(Boolean)); | ||||
|     idsListPushID = (id: string) => { | ||||
|         const currentIds = new Set(idsList.split(",").map(id => id.trim()).filter(Boolean)); | ||||
| 
 | ||||
|         const isAlreadyAdded = currentIds.has(id) || (currentIds.add(id), false); | ||||
| 
 | ||||
|         const ids = Array.from(currentIds).join(", "); | ||||
|         setAllowedIds(ids); | ||||
|         setIdsList(ids); | ||||
|         props.setValue(ids); | ||||
| 
 | ||||
|         return isAlreadyAdded; | ||||
|     }; | ||||
| 
 | ||||
|     useEffect(() => () => { | ||||
|         allowedIdsPushID = null; | ||||
|         idsListPushID = null; | ||||
|     }, []); | ||||
| 
 | ||||
|     function handleChange(newValue: string) { | ||||
|         setAllowedIds(newValue); | ||||
|         setIdsList(newValue); | ||||
|         props.setValue(newValue); | ||||
|     } | ||||
| 
 | ||||
|     return ( | ||||
|         <Forms.FormSection> | ||||
|             <Forms.FormTitle tag="h3">Allowed List</Forms.FormTitle> | ||||
|             <Forms.FormText className={Margins.bottom8} type={Forms.FormText.Types.DESCRIPTION}>Comma separated list of activity IDs to allow (Useful for allowing RPC activities and CustomRPC)</Forms.FormText> | ||||
|             <Forms.FormTitle tag="h3">Filter List</Forms.FormTitle> | ||||
|             <Forms.FormText className={Margins.bottom8} type={Forms.FormText.Types.DESCRIPTION}>Comma separated list of activity IDs to filter (Useful for filtering specific RPC activities and CustomRPC</Forms.FormText> | ||||
|             <TextInput | ||||
|                 type="text" | ||||
|                 value={allowedIds} | ||||
|                 value={idsList} | ||||
|                 onChange={handleChange} | ||||
|                 placeholder="235834946571337729, 343383572805058560" | ||||
|             /> | ||||
|  | @ -145,40 +153,62 @@ const settings = definePluginSettings({ | |||
|         description: "", | ||||
|         component: () => <ImportCustomRPCComponent /> | ||||
|     }, | ||||
|     allowedIds: { | ||||
|     listMode: { | ||||
|         type: OptionType.SELECT, | ||||
|         description: "Change the mode of the filter list", | ||||
|         options: [ | ||||
|             { | ||||
|                 label: "Whitelist", | ||||
|                 value: FilterMode.Whitelist, | ||||
|                 default: true | ||||
|             }, | ||||
|             { | ||||
|                 label: "Blacklist", | ||||
|                 value: FilterMode.Blacklist, | ||||
|             } | ||||
|         ], | ||||
|         onChange: recalculateActivities | ||||
|     }, | ||||
|     idsList: { | ||||
|         type: OptionType.COMPONENT, | ||||
|         description: "", | ||||
|         default: "", | ||||
|         onChange(newValue: string) { | ||||
|             const ids = new Set(newValue.split(",").map(id => id.trim()).filter(Boolean)); | ||||
|             settings.store.allowedIds = Array.from(ids).join(", "); | ||||
|             settings.store.idsList = Array.from(ids).join(", "); | ||||
|             recalculateActivities(); | ||||
|         }, | ||||
|         component: props => <AllowedIdsComponent setValue={props.setValue} /> | ||||
|         component: props => <IdsListComponent setValue={props.setValue} /> | ||||
|     }, | ||||
|     ignorePlaying: { | ||||
|         type: OptionType.BOOLEAN, | ||||
|         description: "Ignore all playing activities (These are usually game and RPC activities)", | ||||
|         default: false | ||||
|         default: false, | ||||
|         onChange: recalculateActivities | ||||
|     }, | ||||
|     ignoreStreaming: { | ||||
|         type: OptionType.BOOLEAN, | ||||
|         description: "Ignore all streaming activities", | ||||
|         default: false | ||||
|         default: false, | ||||
|         onChange: recalculateActivities | ||||
|     }, | ||||
|     ignoreListening: { | ||||
|         type: OptionType.BOOLEAN, | ||||
|         description: "Ignore all listening activities (These are usually spotify activities)", | ||||
|         default: false | ||||
|         default: false, | ||||
|         onChange: recalculateActivities | ||||
|     }, | ||||
|     ignoreWatching: { | ||||
|         type: OptionType.BOOLEAN, | ||||
|         description: "Ignore all watching activities", | ||||
|         default: false | ||||
|         default: false, | ||||
|         onChange: recalculateActivities | ||||
|     }, | ||||
|     ignoreCompeting: { | ||||
|         type: OptionType.BOOLEAN, | ||||
|         description: "Ignore all competing activities (These are normally special game activities)", | ||||
|         default: false | ||||
|         default: false, | ||||
|         onChange: recalculateActivities | ||||
|     } | ||||
| }).withPrivateSettings<{ | ||||
|     ignoredActivities: IgnoredActivity[]; | ||||
|  | @ -189,8 +219,8 @@ function getIgnoredActivities() { | |||
| } | ||||
| 
 | ||||
| function isActivityTypeIgnored(type: number, id?: string) { | ||||
|     if (id && settings.store.allowedIds.includes(id)) { | ||||
|         return false; | ||||
|     if (id && settings.store.idsList.includes(id)) { | ||||
|         return settings.store.listMode === FilterMode.Blacklist; | ||||
|     } | ||||
| 
 | ||||
|     switch (type) { | ||||
|  | @ -206,7 +236,7 @@ function isActivityTypeIgnored(type: number, id?: string) { | |||
| 
 | ||||
| export default definePlugin({ | ||||
|     name: "IgnoreActivities", | ||||
|     authors: [Devs.Nuckyz], | ||||
|     authors: [Devs.Nuckyz, Devs.Kylie], | ||||
|     description: "Ignore activities from showing up on your status ONLY. You can configure which ones are specifically ignored from the Registered Games and Activities tabs, or use the general settings below.", | ||||
|     dependencies: ["UserSettingsAPI"], | ||||
| 
 | ||||
|  | @ -253,6 +283,12 @@ export default definePlugin({ | |||
|     ], | ||||
| 
 | ||||
|     async start() { | ||||
|         // Migrate allowedIds
 | ||||
|         if (Settings.plugins.IgnoreActivities.allowedIds) { | ||||
|             settings.store.idsList = Settings.plugins.IgnoreActivities.allowedIds; | ||||
|             delete Settings.plugins.IgnoreActivities.allowedIds; // Remove allowedIds
 | ||||
|         } | ||||
| 
 | ||||
|         const oldIgnoredActivitiesData = await DataStore.get<Map<IgnoredActivity["id"], IgnoredActivity>>("IgnoreActivities_ignoredActivities"); | ||||
| 
 | ||||
|         if (oldIgnoredActivitiesData != null) { | ||||
|  | @ -279,7 +315,7 @@ export default definePlugin({ | |||
|         if (isActivityTypeIgnored(props.type, props.application_id)) return false; | ||||
| 
 | ||||
|         if (props.application_id != null) { | ||||
|             return !getIgnoredActivities().some(activity => activity.id === props.application_id) || settings.store.allowedIds.includes(props.application_id); | ||||
|             return !getIgnoredActivities().some(activity => activity.id === props.application_id) || (settings.store.listMode === FilterMode.Whitelist && settings.store.idsList.includes(props.application_id)); | ||||
|         } else { | ||||
|             const exePath = RunningGameStore.getRunningGames().find(game => game.name === props.name)?.exePath; | ||||
|             if (exePath) { | ||||
|  |  | |||
|  | @ -534,6 +534,10 @@ export const Devs = /* #__PURE__*/ Object.freeze({ | |||
|         name: "Joona", | ||||
|         id: 297410829589020673n | ||||
|     }, | ||||
|     Kylie: { | ||||
|         name: "Cookie", | ||||
|         id: 721853658941227088n | ||||
|     }, | ||||
|     AshtonMemer: { | ||||
|         name: "AshtonMemer", | ||||
|         id: 373657230530052099n | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue