Просмотр исходного кода

Refactored loading of script stages menus

tcpassos 2 лет назад
Родитель
Сommit
181c33eea7
20 измененных файлов с 727 добавлено и 602 удалено
  1. 12 597
      applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_edit.c
  2. 31 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.c
  3. 40 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.h
  4. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_beaconap.c
  5. 62 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_beaconlist.c
  6. 14 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_config.h
  7. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_deauth.c
  8. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_delay.c
  9. 31 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_exec.c
  10. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_probe.c
  11. 92 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_scan.c
  12. 97 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_select.c
  13. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffbeacon.c
  14. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffdeauth.c
  15. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffesp.c
  16. 92 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffpmkid.c
  17. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffpwn.c
  18. 28 0
      applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffraw.c
  19. 2 4
      applications/external/wifi_marauder_companion/script/wifi_marauder_script.h
  20. 2 1
      applications/external/wifi_marauder_companion/wifi_marauder_app_i.h

+ 12 - 597
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_edit.c

@@ -1,33 +1,5 @@
 #include "../wifi_marauder_app_i.h"
 
-typedef void (*VariableItemSetupCallback)(VariableItem* item);
-typedef void (*VariableItemSelectCallback)(WifiMarauderApp* app);
-
-typedef enum WifiMarauderScriptEditItemType {
-    WifiMarauderScriptEditItemTypeString,
-    WifiMarauderScriptEditItemTypeNumber,
-    WifiMarauderScriptEditItemTypeOptionsString,
-    WifiMarauderScriptEditItemTypeOptionsNumber,
-    WifiMarauderScriptEditItemTypeListString,
-    WifiMarauderScriptEditItemTypeListNumber
-} WifiMarauderScriptEditItemType;
-
-
-#define MAX_OPTIONS (12)
-typedef struct WifiMarauderScriptEditItem {
-    char* name;
-    WifiMarauderScriptEditItemType type;
-    int num_options;
-    char* options[MAX_OPTIONS];
-    VariableItemSetupCallback setup_callback;
-    VariableItemChangeCallback change_callback;
-    VariableItemSelectCallback select_callback;
-} WifiMarauderScriptEditItem;
-
-// Menu items =============================================================================================================================
-WifiMarauderScriptEditItem* stage_items = NULL;
-uint32_t num_stage_items = 0;
-
 void wifi_marauder_scene_script_stage_edit_create_list_strings(WifiMarauderApp* app, char** strings, int string_count) {
     // Deallocates the existing list
     WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
@@ -91,10 +63,10 @@ void wifi_marauder_scene_script_stage_edit_create_list_numbers(WifiMarauderApp*
 
 static void wifi_marauder_scene_script_stage_edit_list_enter_callback(void* context, uint32_t index) {
     WifiMarauderApp* app = context;
-    const WifiMarauderScriptEditItem* menu_item = &stage_items[index];
+    const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[index];
 
     // Fixed delete item
-    if (index == num_stage_items) {
+    if (index == app->script_stage_menu->num_items) {
         uint32_t deleted_stage_index = scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit);
         if (deleted_stage_index > 0) {
             scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit, deleted_stage_index - 1);
@@ -136,25 +108,25 @@ static void wifi_marauder_scene_script_stage_edit_list_enter_callback(void* cont
     if (menu_item->select_callback == NULL) {
         return;
     }
-    if (menu_item->type == WifiMarauderScriptEditItemTypeNumber) {
+    if (menu_item->type == WifiMarauderScriptMenuItemTypeNumber) {
         // Accepts user number input, assigning the value to the reference passed as a parameter
         menu_item->select_callback(app);
         scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
         app->user_input_type = WifiMarauderUserInputTypeNumber;
         scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
-    } else if (menu_item->type == WifiMarauderScriptEditItemTypeString) {
+    } else if (menu_item->type == WifiMarauderScriptMenuItemTypeString) {
         // Accepts user string input, assigning the value to the reference passed as a parameter
         menu_item->select_callback(app);
         scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
         app->user_input_type = WifiMarauderUserInputTypeString;
         scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
-    } else if (menu_item->type == WifiMarauderScriptEditItemTypeListString) {
+    } else if (menu_item->type == WifiMarauderScriptMenuItemTypeListString) {
         // Accepts the strings that compose the list
         menu_item->select_callback(app);
         wifi_marauder_scene_script_stage_edit_create_list_strings(app, *app->script_stage_edit_strings_reference, *app->script_stage_edit_string_count_reference);
         scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
         scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageEditList);
-    } else if (menu_item->type == WifiMarauderScriptEditItemTypeListNumber) {
+    } else if (menu_item->type == WifiMarauderScriptMenuItemTypeListNumber) {
         // Accepts the numbers that compose the list
         menu_item->select_callback(app);
         wifi_marauder_scene_script_stage_edit_create_list_numbers(app, *app->script_stage_edit_numbers_reference, *app->script_stage_edit_number_count_reference);
@@ -163,575 +135,16 @@ static void wifi_marauder_scene_script_stage_edit_list_enter_callback(void* cont
     }
 }
 
-// Scan stage =============================================================================================================================
-static void wifi_marauder_scan_stage_type_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
-    variable_item_set_current_value_index(item, stage->type);
-}
-
-static void wifi_marauder_scan_stage_type_change_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-
-    // Get menu item
-    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
-    const WifiMarauderScriptEditItem* menu_item = &stage_items[current_stage_index];
-
-    // Defines the text of the selected option
-    uint8_t option_index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, menu_item->options[option_index]);
-
-    // Updates the attribute value of the current stage
-    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
-    stage->type = option_index;
-}
-
-static void wifi_marauder_scan_stage_channel_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
-    if (stage->channel >= 0 && stage->channel < 12) {
-        variable_item_set_current_value_index(item, stage->channel);
-    } else {
-        variable_item_set_current_value_index(item, 0);
-    }
-}
-
-static void wifi_marauder_scan_stage_channel_change_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-
-    // Get menu item
-    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
-    const WifiMarauderScriptEditItem* menu_item = &stage_items[current_stage_index];
-
-    // Defines the text of the selected option
-    uint8_t option_index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, menu_item->options[option_index]);
-
-    // Updates the attribute value of the current stage
-    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
-    stage->channel = option_index;
-}
-
-static void wifi_marauder_scan_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_scan_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageScan* stage_scan = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_scan->timeout;
-}
-
-WifiMarauderScriptEditItem scan_items[] = {
-    {
-        "Type", WifiMarauderScriptEditItemTypeOptionsString, 2, {"ap", "station"},
-        wifi_marauder_scan_stage_type_setup_callback, wifi_marauder_scan_stage_type_change_callback, NULL
-    },
-    {
-        "Channel", WifiMarauderScriptEditItemTypeOptionsNumber, 12, {"none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"},
-        wifi_marauder_scan_stage_channel_setup_callback, wifi_marauder_scan_stage_channel_change_callback, NULL
-    },
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_scan_stage_timeout_setup_callback, NULL, wifi_marauder_scan_stage_timeout_select_callback
-    }
-};
-
-// Select stage =============================================================================================================================
-static void wifi_marauder_select_stage_type_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
-    variable_item_set_current_value_index(item, stage->type);
-}
-
-static void wifi_marauder_select_stage_type_change_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-
-    // Get menu item
-    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
-    const WifiMarauderScriptEditItem* menu_item = &stage_items[current_stage_index];
-
-    // Defines the text of the selected option
-    uint8_t option_index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, menu_item->options[option_index]);
-
-    // Updates the attribute value of the current stage
-    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
-    stage->type = option_index;
-}
-
-static void wifi_marauder_select_stage_filter_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
-
-    if (stage->filter != NULL) {
-        variable_item_set_current_value_index(item, 0);
-        variable_item_set_current_value_text(item, stage->filter);
-    } else {
-        variable_item_set_current_value_index(item, 1);
-    }
-}
-
-static void wifi_marauder_select_stage_filter_change_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
-
-    // Clears the filter if you change the option. Flipper input box does not accept blank text
-    if (variable_item_get_current_value_index(item) == 1) {
-        stage->filter = NULL;
-        variable_item_set_current_value_index(item, 0);
-        variable_item_set_values_count(item, 1);
-    }
-
-    if (stage->filter != NULL) {
-        variable_item_set_current_value_text(item, stage->filter);
-    } else {
-        variable_item_set_current_value_text(item, "");
-    }
-}
-
-static void wifi_marauder_select_stage_filter_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSelect* stage_select = app->script_edit_selected_stage->stage;
-    if (stage_select->filter == NULL) {
-        stage_select->filter = malloc(128);
-    }
-    app->user_input_string_reference = &stage_select->filter;
-}
-
-static void wifi_marauder_select_stage_indexes_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSelect* stage_select = app->script_edit_selected_stage->stage;
-    app->script_stage_edit_numbers_reference = &stage_select->indexes;
-    app->script_stage_edit_number_count_reference = &stage_select->index_count;
-}
-
-WifiMarauderScriptEditItem select_items[] = {
-    {
-        "Type", WifiMarauderScriptEditItemTypeOptionsString, 2, {"ap", "station"},
-        wifi_marauder_select_stage_type_setup_callback, wifi_marauder_select_stage_type_change_callback, NULL
-    },
-    {
-        "Filter", WifiMarauderScriptEditItemTypeString, 2, {NULL, NULL},
-        wifi_marauder_select_stage_filter_setup_callback, wifi_marauder_select_stage_filter_change_callback, wifi_marauder_select_stage_filter_select_callback
-    },
-    {
-        "Indexes", WifiMarauderScriptEditItemTypeListNumber, 1, {NULL},
-        NULL, NULL, wifi_marauder_select_stage_indexes_select_callback
-    }
-};
-
-// Deauth stage ===========================================================================================================================
-static void wifi_marauder_deauth_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageDeauth* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_deauth_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageDeauth* stage_deauth = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_deauth->timeout;
-}
-
-WifiMarauderScriptEditItem deauth_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_deauth_stage_timeout_setup_callback, NULL, wifi_marauder_deauth_stage_timeout_select_callback
-    }
-};
-
-// Probe stage ============================================================================================================================
-static void wifi_marauder_probe_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageProbe* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_probe_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageProbe* stage_probe = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_probe->timeout;
-}
-
-WifiMarauderScriptEditItem probe_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_probe_stage_timeout_setup_callback, NULL, wifi_marauder_probe_stage_timeout_select_callback
-    }
-};
-
-// Sniff RAW stage ========================================================================================================================
-static void wifi_marauder_sniffraw_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffRaw* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_sniffraw_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSniffRaw* stage_sniffraw = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_sniffraw->timeout;
-}
-
-WifiMarauderScriptEditItem sniffraw_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_sniffraw_stage_timeout_setup_callback, NULL, wifi_marauder_sniffraw_stage_timeout_select_callback
-    }
-};
-
-// Sniff Beacon stage =====================================================================================================================
-static void wifi_marauder_sniffbeacon_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffBeacon* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_sniffbeacon_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSniffBeacon* stage_sniffbeacon = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_sniffbeacon->timeout;
-}
-
-WifiMarauderScriptEditItem sniffbeacon_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_sniffbeacon_stage_timeout_setup_callback, NULL, wifi_marauder_sniffbeacon_stage_timeout_select_callback
-    }
-};
-
-// Sniff Deauth stage =====================================================================================================================
-static void wifi_marauder_sniffdeauth_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffDeauth* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_sniffdeauth_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSniffDeauth* stage_sniffdeauth = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_sniffdeauth->timeout;
-}
-
-WifiMarauderScriptEditItem sniffdeauth_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_sniffdeauth_stage_timeout_setup_callback, NULL, wifi_marauder_sniffdeauth_stage_timeout_select_callback
-    }
-};
-
-// Sniff Esp stage ========================================================================================================================
-static void wifi_marauder_sniffesp_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffEsp* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_sniffesp_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSniffEsp* stage_sniffesp = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_sniffesp->timeout;
-}
-
-WifiMarauderScriptEditItem sniffesp_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_sniffesp_stage_timeout_setup_callback, NULL, wifi_marauder_sniffesp_stage_timeout_select_callback
-    }
-};
-
-// Sniff PMKID stage ======================================================================================================================
-static void wifi_marauder_sniffpmkid_stage_force_deauth_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
-    variable_item_set_current_value_index(item, stage->force_deauth);
-}
-
-static void wifi_marauder_sniffpmkid_stage_force_deauth_change_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-
-    // Get menu item
-    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
-    const WifiMarauderScriptEditItem* menu_item = &stage_items[current_stage_index];
-
-    // Defines the text of the selected option
-    uint8_t option_index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, menu_item->options[option_index]);
-
-    // Updates the attribute value of the current stage
-    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
-    stage->force_deauth = option_index;
-}
-
-static void wifi_marauder_sniffpmkid_stage_channel_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
-    if (stage->channel >= 0 && stage->channel < 12) {
-        variable_item_set_current_value_index(item, stage->channel);
-    } else {
-        variable_item_set_current_value_index(item, 0);
-    }
-}
-
-static void wifi_marauder_sniffpmkid_stage_channel_change_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-
-    // Get menu item
-    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
-    const WifiMarauderScriptEditItem* menu_item = &stage_items[current_stage_index];
-
-    // Defines the text of the selected option
-    uint8_t option_index = variable_item_get_current_value_index(item);
-    variable_item_set_current_value_text(item, menu_item->options[option_index]);
-
-    // Updates the attribute value of the current stage
-    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
-    stage->channel = option_index;
-}
-
-static void wifi_marauder_sniffpmkid_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_sniffpmkid_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSniffPmkid* stage_sniffpmkid = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_sniffpmkid->timeout;
-}
-
-WifiMarauderScriptEditItem sniffpmkid_items[] = {
-    {
-        "Force deauth", WifiMarauderScriptEditItemTypeOptionsString, 2, {"no", "yes"},
-        wifi_marauder_sniffpmkid_stage_force_deauth_setup_callback, wifi_marauder_sniffpmkid_stage_force_deauth_change_callback, NULL
-    },
-    {
-        "Channel", WifiMarauderScriptEditItemTypeOptionsNumber, 12, {"none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"},
-        wifi_marauder_sniffpmkid_stage_channel_setup_callback, wifi_marauder_sniffpmkid_stage_channel_change_callback, NULL
-    },
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_sniffpmkid_stage_timeout_setup_callback, NULL, wifi_marauder_sniffpmkid_stage_timeout_select_callback
-    }
-};
-
-// Sniff Pwn stage ========================================================================================================================
-static void wifi_marauder_sniffpwn_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageSniffPwn* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_sniffpwn_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageSniffPwn* stage_sniffpwn = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_sniffpwn->timeout;
-}
-
-WifiMarauderScriptEditItem sniffpwn_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_sniffpwn_stage_timeout_setup_callback, NULL, wifi_marauder_sniffpwn_stage_timeout_select_callback
-    }
-};
-
-// Beacon List stage ======================================================================================================================
-static void wifi_marauder_beaconlist_stage_ssids_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
-    app->script_stage_edit_strings_reference = &stage_beaconlist->ssids;
-    app->script_stage_edit_string_count_reference = &stage_beaconlist->ssid_count;
-}
-
-static void wifi_marauder_beaconlist_stage_random_ssids_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageBeaconList* stage = app->script_edit_selected_stage->stage;
-    char random_ssids_str[32];
-    snprintf(random_ssids_str, sizeof(random_ssids_str), "%d", stage->random_ssids);
-    variable_item_set_current_value_text(item, random_ssids_str);
-}
-
-static void wifi_marauder_beaconlist_stage_random_ssids_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_beaconlist->random_ssids;
-}
-
-static void wifi_marauder_beaconlist_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageBeaconList* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_beaconlist_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_beaconlist->timeout;
-}
-
-WifiMarauderScriptEditItem beaconlist_items[] = {
-    {
-        "SSIDs", WifiMarauderScriptEditItemTypeListString, 1, {NULL},
-        NULL, NULL, wifi_marauder_beaconlist_stage_ssids_select_callback
-    },
-    {
-        "Generate random", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_beaconlist_stage_random_ssids_setup_callback, NULL, wifi_marauder_beaconlist_stage_random_ssids_select_callback
-    },
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_beaconlist_stage_timeout_setup_callback, NULL, wifi_marauder_beaconlist_stage_timeout_select_callback
-    }
-};
-
-// Beacon List stage ======================================================================================================================
-static void wifi_marauder_beaconap_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageBeaconAp* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_beaconap_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageBeaconAp* stage_beaconap = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_beaconap->timeout;
-}
-
-WifiMarauderScriptEditItem beaconap_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_beaconap_stage_timeout_setup_callback, NULL, wifi_marauder_beaconap_stage_timeout_select_callback
-    }
-};
-
-// Exec stage =============================================================================================================================
-static void wifi_marauder_exec_stage_filter_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageExec* stage = app->script_edit_selected_stage->stage;
-    if (stage->command != NULL) {
-        variable_item_set_current_value_text(item, stage->command);
-    }
-}
-
-static void wifi_marauder_exec_stage_filter_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageExec* stage_select = app->script_edit_selected_stage->stage;
-    if (stage_select->command == NULL) {
-        stage_select->command = malloc(128);
-    }
-    app->user_input_string_reference = &stage_select->command;
-}
-
-WifiMarauderScriptEditItem exec_items[] = {
-    {
-        "Command", WifiMarauderScriptEditItemTypeString, 1, {NULL},
-        wifi_marauder_exec_stage_filter_setup_callback, NULL, wifi_marauder_exec_stage_filter_select_callback
-    }
-};
-
-// Delay stage ============================================================================================================================
-static void wifi_marauder_delay_stage_timeout_setup_callback(VariableItem* item) {
-    WifiMarauderApp* app = variable_item_get_context(item);
-    WifiMarauderScriptStageDelay* stage = app->script_edit_selected_stage->stage;
-    char timeout_str[32];
-    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
-    variable_item_set_current_value_text(item, timeout_str);
-}
-
-static void wifi_marauder_delay_stage_timeout_select_callback(WifiMarauderApp* app) {
-    WifiMarauderScriptStageDelay* stage_delay = app->script_edit_selected_stage->stage;
-    app->user_input_number_reference = &stage_delay->timeout;
-}
-
-WifiMarauderScriptEditItem delay_items[] = {
-    {
-        "Timeout", WifiMarauderScriptEditItemTypeNumber, 1, {NULL},
-        wifi_marauder_delay_stage_timeout_setup_callback, NULL, wifi_marauder_delay_stage_timeout_select_callback
-    }
-};
-
-// ========================================================================================================================================
-void wifi_marauder_scene_script_stage_edit_setup(WifiMarauderApp* app) {
-    switch (app->script_edit_selected_stage->type) {
-        case WifiMarauderScriptStageTypeScan:
-            stage_items = scan_items;
-            num_stage_items = 3;
-            break;
-        case WifiMarauderScriptStageTypeSelect:
-            stage_items = select_items;
-            num_stage_items = 3;
-            break;
-        case WifiMarauderScriptStageTypeDeauth:
-            stage_items = deauth_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeProbe:
-            stage_items = probe_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeSniffRaw:
-            stage_items = sniffraw_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeSniffBeacon:
-            stage_items = sniffbeacon_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeSniffDeauth:
-            stage_items = sniffdeauth_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeSniffEsp:
-            stage_items = sniffesp_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeSniffPmkid:
-            stage_items = sniffpmkid_items;
-            num_stage_items = 3;
-            break;
-        case WifiMarauderScriptStageTypeSniffPwn:
-            stage_items = sniffpwn_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeBeaconList:
-            stage_items = beaconlist_items;
-            num_stage_items = 3;
-            break;
-        case WifiMarauderScriptStageTypeBeaconAp:
-            stage_items = beaconap_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeExec:
-            stage_items = exec_items;
-            num_stage_items = 1;
-            break;
-        case WifiMarauderScriptStageTypeDelay:
-            stage_items = delay_items;
-            num_stage_items = 1;
-            break;
-    }
-}
-
 void wifi_marauder_scene_script_stage_edit_on_enter(void* context) {
     WifiMarauderApp* app = context;
     VariableItemList* script_stage_edit_list = app->script_stage_edit_list;
 
     variable_item_list_set_enter_callback(app->script_stage_edit_list, wifi_marauder_scene_script_stage_edit_list_enter_callback, app);
-    wifi_marauder_scene_script_stage_edit_setup(app);
+    app->script_stage_menu = wifi_marauder_script_stage_menu_create(app->script_edit_selected_stage->type);
 
-    if (stage_items != NULL) {
-        for (uint32_t i = 0; i < num_stage_items; i++) {
-            WifiMarauderScriptEditItem* stage_item = &stage_items[i];
+    if (app->script_stage_menu->items != NULL) {
+        for (uint32_t i = 0; i < app->script_stage_menu->num_items; i++) {
+            WifiMarauderScriptMenuItem* stage_item = &app->script_stage_menu->items[i];
 
             // Changes the list item to handle it in callbacks
             VariableItem* list_item = variable_item_list_add(app->script_stage_edit_list, stage_item->name, stage_item->num_options, stage_item->change_callback, app);
@@ -760,5 +173,7 @@ bool wifi_marauder_scene_script_stage_edit_on_event(void* context, SceneManagerE
 
 void wifi_marauder_scene_script_stage_edit_on_exit(void* context) {
     WifiMarauderApp* app = context;
+    wifi_marauder_script_stage_menu_free(app->script_stage_menu);
+    app->script_stage_menu = NULL;
     variable_item_list_reset(app->script_stage_edit_list);
 }

+ 31 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.c

@@ -0,0 +1,31 @@
+#include "wifi_marauder_script_stage_menu.h"
+
+WifiMarauderScriptStageMenu* wifi_marauder_script_stage_menu_create(WifiMarauderScriptStageType stage_type) {
+    WifiMarauderScriptStageMenu* script_stage_menu = malloc(sizeof(WifiMarauderScriptStageMenu));
+
+    switch (stage_type) {
+        #define ADD_STAGE(name, id) \
+            case WifiMarauderScriptStageType##id: \
+                wifi_marauder_script_stage_menu_##name##_load(script_stage_menu); \
+                break;
+
+        #include "wifi_marauder_script_stage_menu_config.h"
+        #undef ADD_STAGE
+    }
+    return script_stage_menu;
+}
+
+void wifi_marauder_script_stage_menu_free(WifiMarauderScriptStageMenu* list) {
+    if (list == NULL) {
+        return;
+    }
+    for (uint32_t i = 0; i < list->num_items; i++) {
+        WifiMarauderScriptMenuItem* item = &(list->items[i]);
+        for (int j = 0; j < item->num_options; j++) {
+            free(item->options[j]);
+        }
+        free(item->name);
+    }
+    free(list->items);
+    free(list);
+}

+ 40 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.h

@@ -0,0 +1,40 @@
+#pragma once
+
+#include <gui/modules/variable_item_list.h>
+#include "../wifi_marauder_script.h"
+
+#define ITEM_EDIT_MAX_OPTIONS (12)
+
+typedef void (*VariableItemSetupCallback)(VariableItem* item);
+typedef void (*VariableItemSelectCallback)(void* context);
+
+typedef enum WifiMarauderScriptMenuItemType {
+    WifiMarauderScriptMenuItemTypeString,
+    WifiMarauderScriptMenuItemTypeNumber,
+    WifiMarauderScriptMenuItemTypeOptionsString,
+    WifiMarauderScriptMenuItemTypeOptionsNumber,
+    WifiMarauderScriptMenuItemTypeListString,
+    WifiMarauderScriptMenuItemTypeListNumber
+} WifiMarauderScriptMenuItemType;
+
+typedef struct WifiMarauderScriptMenuItem {
+    char* name;
+    WifiMarauderScriptMenuItemType type;
+    int num_options;
+    char* options[ITEM_EDIT_MAX_OPTIONS];
+    VariableItemSetupCallback setup_callback;
+    VariableItemChangeCallback change_callback;
+    VariableItemSelectCallback select_callback;
+} WifiMarauderScriptMenuItem;
+
+typedef struct WifiMarauderScriptStageMenu {
+    WifiMarauderScriptMenuItem* items;
+    uint32_t num_items;
+} WifiMarauderScriptStageMenu;
+
+#define ADD_STAGE(name, id) void wifi_marauder_script_stage_menu_##name##_load(WifiMarauderScriptStageMenu*);
+#include "wifi_marauder_script_stage_menu_config.h"
+#undef ADD_STAGE
+
+WifiMarauderScriptStageMenu* wifi_marauder_script_stage_menu_create(WifiMarauderScriptStageType stage_type);
+void wifi_marauder_script_stage_menu_free(WifiMarauderScriptStageMenu* list);

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_beaconap.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_beaconap_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageBeaconAp* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_beaconap_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageBeaconAp* stage_beaconap = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_beaconap->timeout;
+}
+
+void wifi_marauder_script_stage_menu_beaconap_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_beaconap_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_beaconap_stage_timeout_select_callback
+    };
+}

+ 62 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_beaconlist.c

@@ -0,0 +1,62 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_beaconlist_stage_ssids_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
+    app->script_stage_edit_strings_reference = &stage_beaconlist->ssids;
+    app->script_stage_edit_string_count_reference = &stage_beaconlist->ssid_count;
+}
+
+void wifi_marauder_beaconlist_stage_random_ssids_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageBeaconList* stage = app->script_edit_selected_stage->stage;
+    char random_ssids_str[32];
+    snprintf(random_ssids_str, sizeof(random_ssids_str), "%d", stage->random_ssids);
+    variable_item_set_current_value_text(item, random_ssids_str);
+}
+
+void wifi_marauder_beaconlist_stage_random_ssids_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_beaconlist->random_ssids;
+}
+
+void wifi_marauder_beaconlist_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageBeaconList* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_beaconlist_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_beaconlist->timeout;
+}
+
+void wifi_marauder_script_stage_menu_beaconlist_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "SSIDs",
+        .type = WifiMarauderScriptMenuItemTypeListString,
+        .num_options = 1,
+        .select_callback = wifi_marauder_beaconlist_stage_ssids_select_callback
+    };
+    stage_menu->items[1] = (WifiMarauderScriptMenuItem) {
+        .name = "Generate random",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_beaconlist_stage_random_ssids_setup_callback,
+        .select_callback = wifi_marauder_beaconlist_stage_random_ssids_select_callback
+    };
+    stage_menu->items[2] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_beaconlist_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_beaconlist_stage_timeout_select_callback
+    };
+}

+ 14 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_config.h

@@ -0,0 +1,14 @@
+ADD_STAGE(scan, Scan)
+ADD_STAGE(select, Select)
+ADD_STAGE(deauth, Deauth)
+ADD_STAGE(probe, Probe)
+ADD_STAGE(sniffraw, SniffRaw)
+ADD_STAGE(sniffbeacon, SniffBeacon)
+ADD_STAGE(sniffdeauth, SniffDeauth)
+ADD_STAGE(sniffesp, SniffEsp)
+ADD_STAGE(sniffpmkid, SniffPmkid)
+ADD_STAGE(sniffpwn, SniffPwn)
+ADD_STAGE(beaconlist, BeaconList)
+ADD_STAGE(beaconap, BeaconAp)
+ADD_STAGE(exec, Exec)
+ADD_STAGE(delay, Delay)

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_deauth.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_deauth_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageDeauth* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_deauth_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageDeauth* stage_deauth = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_deauth->timeout;
+}
+
+void wifi_marauder_script_stage_menu_deauth_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_deauth_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_deauth_stage_timeout_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_delay.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_delay_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageDelay* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_delay_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageDelay* stage_delay = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_delay->timeout;
+}
+
+void wifi_marauder_script_stage_menu_delay_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_delay_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_delay_stage_timeout_select_callback
+    };
+}

+ 31 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_exec.c

@@ -0,0 +1,31 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_exec_stage_filter_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageExec* stage = app->script_edit_selected_stage->stage;
+    if (stage->command != NULL) {
+        variable_item_set_current_value_text(item, stage->command);
+    }
+}
+
+void wifi_marauder_exec_stage_filter_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageExec* stage_select = app->script_edit_selected_stage->stage;
+    if (stage_select->command == NULL) {
+        stage_select->command = malloc(128);
+    }
+    app->user_input_string_reference = &stage_select->command;
+}
+
+void wifi_marauder_script_stage_menu_exec_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Command",
+        .type = WifiMarauderScriptMenuItemTypeString,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_exec_stage_filter_setup_callback,
+        .select_callback = wifi_marauder_exec_stage_filter_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_probe.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_probe_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageProbe* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_probe_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageProbe* stage_probe = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_probe->timeout;
+}
+
+void wifi_marauder_script_stage_menu_probe_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_probe_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_probe_stage_timeout_select_callback
+    };
+}

+ 92 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_scan.c

@@ -0,0 +1,92 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_scan_stage_type_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
+    variable_item_set_current_value_index(item, stage->type);
+}
+
+void wifi_marauder_scan_stage_type_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+
+    // Get menu item
+    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
+    const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[current_stage_index];
+
+    // Defines the text of the selected option
+    uint8_t option_index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, menu_item->options[option_index]);
+
+    // Updates the attribute value of the current stage
+    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
+    stage->type = option_index;
+}
+
+void wifi_marauder_scan_stage_channel_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
+    if (stage->channel >= 0 && stage->channel < 12) {
+        variable_item_set_current_value_index(item, stage->channel);
+    } else {
+        variable_item_set_current_value_index(item, 0);
+    }
+}
+
+void wifi_marauder_scan_stage_channel_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+
+    // Get menu item
+    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
+    const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[current_stage_index];
+
+    // Defines the text of the selected option
+    uint8_t option_index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, menu_item->options[option_index]);
+
+    // Updates the attribute value of the current stage
+    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
+    stage->channel = option_index;
+}
+
+void wifi_marauder_scan_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_scan_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageScan* stage_scan = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_scan->timeout;
+}
+
+void wifi_marauder_script_stage_menu_scan_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 3;
+    stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Type",
+        .type = WifiMarauderScriptMenuItemTypeOptionsString,
+        .num_options = 2,
+        .options = {"ap", "station"},
+        .setup_callback = wifi_marauder_scan_stage_type_setup_callback,
+        .change_callback = wifi_marauder_scan_stage_type_change_callback,
+    };
+    stage_menu->items[1] = (WifiMarauderScriptMenuItem) {
+        .name = "Channel",
+        .type = WifiMarauderScriptMenuItemTypeOptionsNumber,
+        .num_options = 12,
+        .options = {"none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"},
+        .setup_callback = wifi_marauder_scan_stage_channel_setup_callback,
+        .change_callback = wifi_marauder_scan_stage_channel_change_callback,
+    };
+    stage_menu->items[2] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_scan_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_scan_stage_timeout_select_callback
+    };
+}

+ 97 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_select.c

@@ -0,0 +1,97 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_select_stage_type_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
+    variable_item_set_current_value_index(item, stage->type);
+}
+
+void wifi_marauder_select_stage_type_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+
+    // Get menu item
+    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
+    const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[current_stage_index];
+
+    // Defines the text of the selected option
+    uint8_t option_index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, menu_item->options[option_index]);
+
+    // Updates the attribute value of the current stage
+    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
+    stage->type = option_index;
+}
+
+void wifi_marauder_select_stage_filter_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
+
+    if (stage->filter != NULL) {
+        variable_item_set_current_value_index(item, 0);
+        variable_item_set_current_value_text(item, stage->filter);
+    } else {
+        variable_item_set_current_value_index(item, 1);
+    }
+}
+
+void wifi_marauder_select_stage_filter_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
+
+    // Clears the filter if you change the option. Flipper input box does not accept blank text
+    if (variable_item_get_current_value_index(item) == 1) {
+        stage->filter = NULL;
+        variable_item_set_current_value_index(item, 0);
+        variable_item_set_values_count(item, 1);
+    }
+
+    if (stage->filter != NULL) {
+        variable_item_set_current_value_text(item, stage->filter);
+    } else {
+        variable_item_set_current_value_text(item, "");
+    }
+}
+
+void wifi_marauder_select_stage_filter_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSelect* stage_select = app->script_edit_selected_stage->stage;
+    if (stage_select->filter == NULL) {
+        stage_select->filter = malloc(128);
+    }
+    app->user_input_string_reference = &stage_select->filter;
+}
+
+void wifi_marauder_select_stage_indexes_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSelect* stage_select = app->script_edit_selected_stage->stage;
+    app->script_stage_edit_numbers_reference = &stage_select->indexes;
+    app->script_stage_edit_number_count_reference = &stage_select->index_count;
+}
+
+void wifi_marauder_script_stage_menu_select_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 3;
+    stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Type",
+        .type = WifiMarauderScriptMenuItemTypeOptionsString,
+        .num_options = 2,
+        .options = {"ap", "station"},
+        .setup_callback = wifi_marauder_select_stage_type_setup_callback,
+        .change_callback = wifi_marauder_select_stage_type_change_callback
+    };
+    stage_menu->items[1] = (WifiMarauderScriptMenuItem) {
+        .name = "Filter",
+        .type = WifiMarauderScriptMenuItemTypeString,
+        .num_options = 2,
+        .setup_callback = wifi_marauder_select_stage_filter_setup_callback,
+        .change_callback = wifi_marauder_select_stage_filter_change_callback,
+        .select_callback = wifi_marauder_select_stage_filter_select_callback
+    };
+    stage_menu->items[2] = (WifiMarauderScriptMenuItem) {
+        .name = "Indexes",
+        .type = WifiMarauderScriptMenuItemTypeListNumber,
+        .num_options = 1,
+        .select_callback = wifi_marauder_select_stage_indexes_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffbeacon.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_sniffbeacon_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffBeacon* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_sniffbeacon_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSniffBeacon* stage_sniffbeacon = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_sniffbeacon->timeout;
+}
+
+void wifi_marauder_script_stage_menu_sniffbeacon_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_sniffbeacon_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_sniffbeacon_stage_timeout_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffdeauth.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_sniffdeauth_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffDeauth* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_sniffdeauth_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSniffDeauth* stage_sniffdeauth = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_sniffdeauth->timeout;
+}
+
+void wifi_marauder_script_stage_menu_sniffdeauth_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_sniffdeauth_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_sniffdeauth_stage_timeout_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffesp.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_sniffesp_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffEsp* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_sniffesp_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSniffEsp* stage_sniffesp = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_sniffesp->timeout;
+}
+
+void wifi_marauder_script_stage_menu_sniffesp_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_sniffesp_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_sniffesp_stage_timeout_select_callback
+    };
+}

+ 92 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffpmkid.c

@@ -0,0 +1,92 @@
+#include "../../wifi_marauder_app_i.h"
+
+static void wifi_marauder_sniffpmkid_stage_force_deauth_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
+    variable_item_set_current_value_index(item, stage->force_deauth);
+}
+
+static void wifi_marauder_sniffpmkid_stage_force_deauth_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+
+    // Get menu item
+    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
+    const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[current_stage_index];
+
+    // Defines the text of the selected option
+    uint8_t option_index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, menu_item->options[option_index]);
+
+    // Updates the attribute value of the current stage
+    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
+    stage->force_deauth = option_index;
+}
+
+static void wifi_marauder_sniffpmkid_stage_channel_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
+    if (stage->channel >= 0 && stage->channel < 12) {
+        variable_item_set_current_value_index(item, stage->channel);
+    } else {
+        variable_item_set_current_value_index(item, 0);
+    }
+}
+
+static void wifi_marauder_sniffpmkid_stage_channel_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+
+    // Get menu item
+    uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->script_stage_edit_list);
+    const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[current_stage_index];
+
+    // Defines the text of the selected option
+    uint8_t option_index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, menu_item->options[option_index]);
+
+    // Updates the attribute value of the current stage
+    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
+    stage->channel = option_index;
+}
+
+static void wifi_marauder_sniffpmkid_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+static void wifi_marauder_sniffpmkid_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSniffPmkid* stage_sniffpmkid = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_sniffpmkid->timeout;
+}
+
+void wifi_marauder_script_stage_menu_sniffpmkid_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 3;
+    stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Force deauth",
+        .type = WifiMarauderScriptMenuItemTypeOptionsString,
+        .num_options = 2,
+        .options = {"no", "yes"},
+        .setup_callback = wifi_marauder_sniffpmkid_stage_force_deauth_setup_callback,
+        .change_callback = wifi_marauder_sniffpmkid_stage_force_deauth_change_callback
+    };
+    stage_menu->items[1] = (WifiMarauderScriptMenuItem) {
+        .name = "Channel",
+        .type = WifiMarauderScriptMenuItemTypeOptionsNumber,
+        .num_options = 12,
+        .options = {"none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"},
+        .setup_callback = wifi_marauder_sniffpmkid_stage_channel_setup_callback,
+        .change_callback = wifi_marauder_sniffpmkid_stage_channel_change_callback
+    };
+    stage_menu->items[2] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_sniffpmkid_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_sniffpmkid_stage_timeout_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffpwn.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_sniffpwn_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffPwn* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_sniffpwn_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSniffPwn* stage_sniffpwn = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_sniffpwn->timeout;
+}
+
+void wifi_marauder_script_stage_menu_sniffpwn_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_sniffpwn_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_sniffpwn_stage_timeout_select_callback
+    };
+}

+ 28 - 0
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_sniffraw.c

@@ -0,0 +1,28 @@
+#include "../../wifi_marauder_app_i.h"
+
+void wifi_marauder_sniffraw_stage_timeout_setup_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    WifiMarauderScriptStageSniffRaw* stage = app->script_edit_selected_stage->stage;
+    char timeout_str[32];
+    snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
+    variable_item_set_current_value_text(item, timeout_str);
+}
+
+void wifi_marauder_sniffraw_stage_timeout_select_callback(void* context) {
+    WifiMarauderApp* app = context;
+    WifiMarauderScriptStageSniffRaw* stage_sniffraw = app->script_edit_selected_stage->stage;
+    app->user_input_number_reference = &stage_sniffraw->timeout;
+}
+
+void wifi_marauder_script_stage_menu_sniffraw_load(WifiMarauderScriptStageMenu* stage_menu) {
+    stage_menu->num_items = 1;
+    stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
+
+    stage_menu->items[0] = (WifiMarauderScriptMenuItem) {
+        .name = "Timeout",
+        .type = WifiMarauderScriptMenuItemTypeNumber,
+        .num_options = 1,
+        .setup_callback = wifi_marauder_sniffraw_stage_timeout_setup_callback,
+        .select_callback = wifi_marauder_sniffraw_stage_timeout_select_callback
+    };
+}

+ 2 - 4
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h

@@ -21,10 +21,8 @@
  * wifi_marauder_scene_script_stage_add.c
  * - Create stage creation function and add in wifi_marauder_scene_script_stage_add_on_enter()
  * 
- * wifi_marauder_scene_script_stage_edit.c
- * - Create a list of WifiMarauderScriptEditItem[] items with the attributes on the stage
- * - Implement the callbacks
- * - Add case in wifi_marauder_scene_script_stage_edit_setup()
+ * wifi_marauder_script_stage_menu_config.h
+ * - Add the new stage and implement its functions in a new file
  * 
  * ----------------------------------------------------------------------------------------------------
  * SCRIPT SYNTAX (In order of execution):

+ 2 - 1
applications/external/wifi_marauder_companion/wifi_marauder_app_i.h

@@ -10,6 +10,7 @@
 #include "script/wifi_marauder_script.h"
 #include "script/wifi_marauder_script_worker.h"
 #include "script/wifi_marauder_script_executor.h"
+#include "script/menu/wifi_marauder_script_stage_menu.h"
 
 #include <gui/gui.h>
 #include <gui/view_dispatcher.h>
@@ -42,7 +43,6 @@
 #define SAVE_PCAP_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_pcaps_here.setting"
 #define SAVE_LOGS_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_logs_here.setting"
 
-// TODO: Pass user input to a file of its own
 typedef enum WifiMarauderUserInputType {
     WifiMarauderUserInputTypeString,
     WifiMarauderUserInputTypeNumber,
@@ -112,6 +112,7 @@ struct WifiMarauderApp {
     WifiMarauderScriptStage* script_edit_selected_stage;
     VariableItemList* script_settings_list;
     VariableItemList* script_stage_edit_list;
+    WifiMarauderScriptStageMenu* script_stage_menu;
     WifiMarauderScriptStageListItem* script_stage_edit_first_item;
     char*** script_stage_edit_strings_reference;
     int* script_stage_edit_string_count_reference;