Action scripts (#194)
Co-authored-by: auctumnus <auctumnus@users.noreply.github.com> Closes https://github.com/ErikReider/SwayNotificationCenter/issues/192
This commit is contained in:
@@ -180,6 +180,8 @@ Scripting rules and logic:
|
|||||||
. If any of the properties doesn't match, the script will be skipped
|
. If any of the properties doesn't match, the script will be skipped
|
||||||
. If a notification doesn't include one of the properties, that property will
|
. If a notification doesn't include one of the properties, that property will
|
||||||
be skipped
|
be skipped
|
||||||
|
· If a script has `run-on` set to `action`, the script will only run when an
|
||||||
|
action is taken on the notification
|
||||||
|
|
||||||
More information can be found in the `swaync(5)` man page
|
More information can be found in the `swaync(5)` man page
|
||||||
|
|
||||||
|
@@ -333,6 +333,13 @@ config file to be able to detect config errors
|
|||||||
type: string ++
|
type: string ++
|
||||||
optional: true ++
|
optional: true ++
|
||||||
description: Which category the notification belongs to. Uses Regex.++
|
description: Which category the notification belongs to. Uses Regex.++
|
||||||
|
*run-on*++
|
||||||
|
type: string ++
|
||||||
|
optional: true ++
|
||||||
|
values: action, receive ++
|
||||||
|
default: receive ++
|
||||||
|
description: Whether to run this action when the notification is ++
|
||||||
|
received, or when an action is taken on it. ++
|
||||||
description: Which scripts to check and potentially run for every ++
|
description: Which scripts to check and potentially run for every ++
|
||||||
notification. If the notification doesn't include one of the properties, ++
|
notification. If the notification doesn't include one of the properties, ++
|
||||||
that property will be ignored. All properties (except for exec) use regex. ++
|
that property will be ignored. All properties (except for exec) use regex. ++
|
||||||
|
@@ -28,6 +28,11 @@
|
|||||||
"example-script": {
|
"example-script": {
|
||||||
"exec": "echo 'Do something...'",
|
"exec": "echo 'Do something...'",
|
||||||
"urgency": "Normal"
|
"urgency": "Normal"
|
||||||
|
},
|
||||||
|
"example-action-script": {
|
||||||
|
"exec": "echo 'Do something actionable!'",
|
||||||
|
"urgency": "Normal",
|
||||||
|
"run-on": "action"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification-visibility": {
|
"notification-visibility": {
|
||||||
|
@@ -204,9 +204,15 @@ namespace SwayNotificationCenter {
|
|||||||
public NotificationStatusEnum state { get; set; }
|
public NotificationStatusEnum state { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ScriptRunOnType {
|
||||||
|
ACTION,
|
||||||
|
RECEIVE;
|
||||||
|
}
|
||||||
|
|
||||||
#if WANT_SCRIPTING
|
#if WANT_SCRIPTING
|
||||||
public class Script : NotificationMatching {
|
public class Script : NotificationMatching {
|
||||||
public string ? exec { get; set; default = null; }
|
public string ? exec { get; set; default = null; }
|
||||||
|
public ScriptRunOnType run_on { get; set; default = ScriptRunOnType.RECEIVE; }
|
||||||
|
|
||||||
public async bool run_script (NotifyParams param, out string msg) {
|
public async bool run_script (NotifyParams param, out string msg) {
|
||||||
msg = "";
|
msg = "";
|
||||||
|
@@ -176,6 +176,12 @@
|
|||||||
"category": {
|
"category": {
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Which category the notification belongs to. Uses Regex."
|
"description": "Which category the notification belongs to. Uses Regex."
|
||||||
|
},
|
||||||
|
"run-on": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Whether to run the script on an action being activated, or when the notification is received.",
|
||||||
|
"enum": ["action", "receive"],
|
||||||
|
"default": "receive"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -195,9 +195,28 @@ namespace SwayNotificationCenter {
|
|||||||
// Run the first script if notification meets requirements
|
// Run the first script if notification meets requirements
|
||||||
HashTable<string, Script> scripts = ConfigModel.instance.scripts;
|
HashTable<string, Script> scripts = ConfigModel.instance.scripts;
|
||||||
if (scripts.length == 0) return id;
|
if (scripts.length == 0) return id;
|
||||||
|
this.run_scripts (param, ScriptRunOnType.RECEIVE);
|
||||||
|
#endif
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs scripts that meet the requirements of the given `param`.
|
||||||
|
*/
|
||||||
|
[DBus (visible = false)]
|
||||||
|
public void run_scripts (NotifyParams param, ScriptRunOnType run_on) {
|
||||||
|
#if WANT_SCRIPTING
|
||||||
|
if (param.swaync_no_script) {
|
||||||
|
debug ("Skipped action scripts for this notification\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Run the first script if notification meets requirements
|
||||||
|
HashTable<string, Script> scripts = ConfigModel.instance.scripts;
|
||||||
|
if (scripts.length == 0) return;
|
||||||
foreach (string key in scripts.get_keys ()) {
|
foreach (string key in scripts.get_keys ()) {
|
||||||
unowned Script script = scripts[key];
|
unowned Script script = scripts[key];
|
||||||
if (!script.matches_notification (param)) continue;
|
if (!script.matches_notification (param)) continue;
|
||||||
|
if (script.run_on != run_on) continue;
|
||||||
|
|
||||||
script.run_script.begin (param, (obj, res) => {
|
script.run_script.begin (param, (obj, res) => {
|
||||||
// Gets the end status
|
// Gets the end status
|
||||||
@@ -238,8 +257,6 @@ namespace SwayNotificationCenter {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -298,6 +298,7 @@ namespace SwayNotificationCenter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void action_clicked (Action ? action, bool is_default = false) {
|
private void action_clicked (Action ? action, bool is_default = false) {
|
||||||
|
noti_daemon.run_scripts (param, ScriptRunOnType.ACTION);
|
||||||
if (action != null
|
if (action != null
|
||||||
&& action.identifier != null
|
&& action.identifier != null
|
||||||
&& action.identifier != "") {
|
&& action.identifier != "") {
|
||||||
|
Reference in New Issue
Block a user