' Save File System Inline-Function for VoiceAttack - Load Any/All Variables from File/List to Profile ' by SemlerPDX Mar2020 (updated Dec2020) ' VETERANS-GAMING.COM ' --Loads Variables from Text List Format into VA Variables of Appropriate Data Type (INT/DEC/TXT/BOOL)-- Imports Microsoft.VisualBasic Imports System Imports System.Collections Imports System.Collections.Generic Imports System.Data Imports System.Drawing Imports System.Diagnostics Imports System.Globalization Imports System.Windows.Forms Imports System.Linq Imports System.Xml.Linq Imports System.Threading.Tasks Public Class VAInline dim decimalSeparator as string = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator dim cmdIndex as Int32 dim cmdMax as Int32 = 255 dim level as Int32 dim phrase as string dim phrases as string dim phraseDataCheck as string dim phraseArray() as string dim phrasesList() as string dim phrasesUnique as string = "" dim macrosUnique as string = "" dim listenUnique as string = "" dim toggleUnique as string = "" dim phrasesFinal as new list(of string) () dim clearVariable as boolean dim saveVariable as boolean dim variableIndex as integer dim commandRID as integer = 0 dim countD as integer dim countC as integer dim contents() as string dim entry() as string dim debugCheck as boolean dim debugCount as integer = 0 dim debugColor as integer = 3 dim debugText as string = "" Public Sub Main() 'Get Live Debugging Return ID from VA if ((VA.GetInt("AVCS_CMD_RID")) IsNot nothing) commandRID = VA.GetInt("AVCS_CMD_RID") end if if ((VA.GetText("~save_file")) IsNot nothing) 'Clear all QCC Commands & Data variables if ((VA.GetInt("AVCS_QCC_COMMAND_MAX")) IsNot nothing) cmdMax = Convert.ToInt32(VA.GetInt("AVCS_QCC_COMMAND_MAX")) end if for cmdIndex = 1 to cmdMax VA.SetText("AVCS_QCC_DATA_MACROS_" + cmdIndex.ToString(), nothing) VA.SetText("AVCS_QCC_COMMAND_" + cmdIndex.ToString(), nothing) next for i as integer = 1 to 6 VA.SetText("AVCS_" + vaProxy.ParseTokens("{TXT:AVCS_ACTIVE_PROFILE:CORE}").ToString() + "_PTTBUTTON_" + i.ToString(),nothing) next VA.SetInt("AVCS_CORE_PTT_MODE", nothing) 'Clear all QCC Variable 'When I say' phrases VA.SetText("AVCS_QCC_WAKE", nothing) VA.SetText("AVCS_QCC_COMMANDS", nothing) VA.SetText("AVCS_QCC_MACROS", nothing) VA.SetText("AVCS_QCC_LISTEN", nothing) VA.SetText("AVCS_QCC_LISTEN_TOGGLE", nothing) 'Clear all VAS Passphrase Command variables for level = 1 to 10 VA.SetText("AVCS_VAS_PASSWORDS_LEVEL_" + level.ToString(), nothing) next 'Check and Set Clear/Save Parameter Variables if ((VA.GetBoolean("AVCS_SFS_LOAD_clear")) IsNot nothing) clearVariable = VA.GetBoolean("AVCS_SFS_LOAD_clear") end if if ((VA.GetBoolean("AVCS_SFS_LOAD_save")) IsNot nothing) saveVariable = VA.GetBoolean("AVCS_SFS_LOAD_save") end if 'Split contents of save file into single lines separated by the newline or (/n) if (VA.GetText("~save_file").Contains(vbNewLine)) contents = VA.GetText("~save_file").Split(new string() {Environment.NewLine},StringSplitOptions.None) else contents = VA.GetText("~save_file").Split(new string() {"(/n)"},StringSplitOptions.None) end if 'In each line, isolate Var Name/Val via '=' and Eval entry value for data type for each line as string in contents if not(line = "") entry = line.Split("=") if (entry(1).Contains(".")) countD = entry(1).Split(".").Length -1 else countD = 0 end if if (entry(1).Contains(",")) countC = entry(1).Split(",").Length -1 else countC = 0 end if 'Use Comma and Decimal Count to check data type for casting as Int or Dec if ((IsNumeric(entry(1))) and (((countD <= 1) and (countC = 0)) or ((countC <= 1) and (countD = 0)))) if ((entry(1).Contains (".")) or (entry(1).Contains (","))) ' Attempt to Handle International Decimal Separator if (decimalSeparator <> ".") if (entry(1).Contains(".")) entry(1) = Replace(entry(1), ".", decimalSeparator) end if end if ' Entry is a DECIMAL Type if ((clearVariable) and (saveVariable)) ' Prepare Decimal Var for SaveToProfile command, clearing from Profile completely variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "DEC") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) elseif (saveVariable) ' Prepare Decimal Var for SaveToProfile command variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "DEC") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) VA.SetText("~~varValue" + variableIndex.ToString(), entry(1)) elseif (clearVariable) ' Clear Decimal Var directly from Profile VA.SetDecimal(entry(0), nothing) else ' Load Decimal Var directly to Profile VA.SetDecimal(entry(0), entry(1)) end if else ' Entry is an INTEGER Type if ((clearVariable) and (saveVariable)) ' Prepare Integer Var for SaveToProfile command, clearing from Profile completely variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "INT") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) elseif (saveVariable) ' Prepare Integer Var for SaveToProfile command variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "INT") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) VA.SetText("~~varValue" + variableIndex.ToString(), entry(1)) elseif (clearVariable) ' Clear Integer Var directly from Profile VA.SetInt(entry(0), nothing) else ' Load Integer Var directly to Profile VA.SetInt(entry(0), entry(1)) end if end if 'if entry(1) is NOT Numeric-------------------------- elseif ((LCase(entry(1)) = "true") or (LCase(entry(1)) = "false")) ' Entry is a BOOLEAN Type if ((clearVariable) and (saveVariable)) ' Prepare Boolean Var for SaveToProfile command, clearing from Profile completely variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "BOOL") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) elseif (saveVariable) ' Prepare Boolean Var for SaveToProfile command variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "BOOL") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) VA.SetText("~~varValue" + variableIndex.ToString(), entry(1)) elseif (clearVariable) ' Clear Boolean Var directly from Profile VA.SetBoolean(entry(0), nothing) else ' Load Boolean Var directly to Profile VA.SetBoolean(entry(0), entry(1)) end if else ' Entry is a TEXT Type if ((clearVariable) and (saveVariable)) ' Prepare Text Var for SaveToProfile command, clearing from Profile completely variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "TXT") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) elseif (saveVariable) ' Prepare Text Var for SaveToProfile command variableIndex = variableIndex + 1 VA.SetText("~~varType" + variableIndex.ToString(), "TXT") VA.SetText("~~varName" + variableIndex.ToString(), entry(0)) VA.SetText("~~varValue" + variableIndex.ToString(), entry(1)) elseif (clearVariable) ' Clear Text Var directly from Profile VA.SetText(entry(0), nothing) else ' Load Text Var directly to Profile VA.SetText(entry(0), entry(1)) end if end if end if next 'loop around to the next entry value if (variableIndex > 0) ' Set Max Count of Vars prepared for SaveToProfile command func, execute as sub-command, wait for completion VA.SetInt("~~varIndex", variableIndex.ToString()) vaProxy.Command.Execute ("f_sfs_to_profile", true, true) end if 'Load all QCC Commands to main phrase(s) variable ----------CHECK IS THIS NEEDED _ DOUBLE CALL HERE AND ABOVE?! ----- if ((VA.GetInt("AVCS_QCC_COMMAND_MAX")) IsNot nothing) cmdMax = Convert.ToInt32(VA.GetInt("AVCS_QCC_COMMAND_MAX")) end if for cmdIndex = 1 to cmdMax if (((VA.GetText("AVCS_QCC_COMMAND_" + cmdIndex.ToString())) IsNot nothing) and ((VA.GetText("AVCS_QCC_DATA_COMMAND_" + cmdIndex.ToString())) IsNot nothing)) phrases = (VA.GetText("AVCS_QCC_COMMAND_" + cmdIndex.ToString())) phraseArray = vaProxy.Utility.ExtractPhrases(phrases, true, true) for each phrase in phraseArray if ((not(phrase = "")) and (not(phrasesFinal.Contains(phrase)))) phrasesFinal.Add(phrase) phrasesUnique = phrasesUnique + phrase + ";" VA.SetText(phrase, cmdIndex.ToString()) end if next end if if (((VA.GetText("AVCS_QCC_MACROS_" + cmdIndex.ToString())) IsNot nothing) and ((VA.GetText("AVCS_QCC_DATA_MACROS_" + cmdIndex.ToString())) IsNot nothing)) phraseDataCheck = VA.GetText("AVCS_QCC_DATA_MACROS_" + cmdIndex.ToString()) phrases = (VA.GetText("AVCS_QCC_MACROS_" + cmdIndex.ToString())) phraseArray = vaProxy.Utility.ExtractPhrases(phrases, true, true) for each phrase in phraseArray if ((not(phrase = "")) and (not(phrasesFinal.Contains(phrase)))) phrasesFinal.Add(phrase) 'Check for commands with Start/Toggle VoiceAttack listening if ((not(phraseDataCheck.Contains("1[(2)]VALB"))) and (not(phraseDataCheck.Contains("1[(2)]VALT")))) macrosUnique = macrosUnique + phrase + ";" else if (phraseDataCheck.Contains("1[(2)]VALB")) listenUnique = listenUnique + phrase + ";" elseif (phraseDataCheck.Contains("1[(2)]VALT")) toggleUnique = toggleUnique + phrase + ";" end if end if 'Set Key Data Variable Name to Variable Name including each Quick Command Phrase VA.SetText(phrase, cmdIndex.ToString()) end if next end if next end if 'Create Variable 'When I Say' Tokens containing all QCC phrases if not (phrasesUnique = "") VA.SetText("AVCS_QCC_COMMANDS", phrasesUnique) else VA.SetText("AVCS_QCC_COMMANDS", nothing) end if if not (macrosUnique = "") VA.SetText("AVCS_QCC_MACROS", macrosUnique) else VA.SetText("AVCS_QCC_MACROS", nothing) end if if not (listenUnique = "") VA.SetText("AVCS_QCC_LISTEN", listenUnique) else VA.SetText("AVCS_QCC_LISTEN", nothing) end if if not (toggleUnique = "") VA.SetText("AVCS_QCC_LISTEN_TOGGLE", toggleUnique) else VA.SetText("AVCS_QCC_LISTEN_TOGGLE", nothing) end if 'Load all VAS Passphrase Commands to main phrase variables for level = 1 to 10 VA.SetText("AVCS_VAS_PASSWORDS_LV_" + level.ToString(), nothing) next for level = 1 to 10 phrase = "" phrases = "" phrasesUnique = "" phrasesList = nothing if ((VA.GetText("AVCS_VAS_PASSWORDS_LEVEL_" + level.ToString())) IsNot nothing) phrases = (VA.GetText("AVCS_VAS_PASSWORDS_LEVEL_" + level.ToString())) if (phrases.Contains("[(1)]")) phrasesList = (VA.GetText("AVCS_VAS_PASSWORDS_LEVEL_" + level.ToString()).Replace("[(1)]", "↑")).Split("↑") if (not(phrasesList.ToString() = "")) for each phrases as string in phrasesList if (not(phrases = "")) phraseArray = vaProxy.Utility.ExtractPhrases(phrases, true, true) for each phrase in phraseArray if ((not(phrase = "")) and (not(phrasesFinal.Contains(phrase)))) phrasesFinal.Add(phrase) phrasesUnique = phrasesUnique + phrase + ";" elseif ((not(phrase = "")) and ((phrasesFinal.Contains(phrase)))) 'Log Debug Error - Duplicate Passphrase Detected - note level number of base variable if (debugCheck) debugText = "DUPLICATE PASSPHRASE DETECTED inside Level " + level.ToString() debugCount += 1 debugColor = 2 VA.SetText("~avcs_vas_debug_" + debugCount.ToString(), debugText) VA.SetInt("~avcs_vas_debug_wclr_" + debugCount.ToString(), debugColor) end if end if next end if next end if else phraseArray = vaProxy.Utility.ExtractPhrases(phrases, true, true) for each phrase in phraseArray if ((not(phrase = "")) and (not(phrasesFinal.Contains(phrase)))) phrasesFinal.Add(phrase) phrasesUnique = phrasesUnique + phrase + ";" elseif ((not(phrase = "")) and ((phrasesFinal.Contains(phrase)))) 'Log Debug Error - Duplicate Passphrase Detected - note level number of base variable if (debugCheck) debugText = "DUPLICATE PASSPHRASE DETECTED inside Level " + level.ToString() debugCount += 1 debugColor = 2 VA.SetText("~avcs_vas_debug_" + debugCount.ToString(), debugText) VA.SetInt("~avcs_vas_debug_wclr_" + debugCount.ToString(), debugColor) end if end if next end if if (not(phrasesUnique = "")) 'Create Level Based Variables for 'When I Say' Tokens containing all VAS phrases VA.SetText("AVCS_VAS_PASSWORDS_LV_" + level.ToString(), phrasesUnique) end if end if next 'Increment and Return Live Debugging RID to VA if (commandRID > 0) commandRID = commandRID + 234 VA.SetInt("AVCS_CMD_RID", commandRID) end if End Sub End Class