From 52e9d99a2d4b0d69a0082c3fa2e77a9db1f86a29 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 10 Mar 2020 15:38:31 -0500 Subject: [PATCH 01/34] initial commit --- D3K.ahk | 47 ++++++++++++++--------------------------------- glovarsource | 7 +------ 2 files changed, 15 insertions(+), 39 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 61527ed..8a5bccd 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -421,47 +421,28 @@ SetTitleMatchMode, 2 ; Regular :*:]email:: - Send Hello,{Enter 2} {Shift down}{Enter}{Shift up}Please contact us if you have any questions.{Up}{End} + Send Hello,{Enter 2}{Space 3} Return -; DTAC Problem -:*:]97010:: - Send Hello,{Enter 2} As this is a hardware/compatibility related inquiry, we here at the GSC cannot assist you properly. Please contact DTAC and they will be able to assist you further. - Return - -; 2 Year old COMAR -:*:]2yc:: - Send Hello,{Enter 2} You are unable to activate this product as the COMAR is over 2 years old. There is a form in the Dealer Corner that you can fill out to have it replaced as long as it falls within the criteria outlined in solution 108357.{Enter}Please contact your TCSM if you have any questions about this process. - Return - -; CCMS +; Cases :*:]cms:: - Send Hello,{Enter 2} {Enter}{Home down}{Shift up}{Home up}Please contact us if you have any questions.{Enter 2}Thank you,{Enter}David{Up 4}{End} + Send Hello,{Enter 2}{Space 3}{Enter}{Home down}{Shift up}{Home up}{Enter}Thank you,{Enter}David{Up 3}{End} Return #If + ; German #If, ger = "1" ; Regular :*:[email:: - Send Hallo,{Enter 2} {Shift down}{Enter}{Shift up}Für Rückfragen stehen wir gerne zur Verfügung.{Up}{End} + Send Hallo,{Enter 2}{Space 3} Return -; DTAC Problem -:*:[97010:: - Send Hallo,{Enter 2} Da dies eine Hardware/Kompatibilität-bezogene Anfrage ist, können wir hier im GSC leider ihre Frage nicht sehr gut beantworten. Bitte wenden Sie sich an DTAC, dort können Sie bessere unterstützung für diesen typ von fragen bekommen. - Return - -; 2 Year old COMAR -:*:[2yc:: - Send Hallo,{Enter 2} Sie können dieses Produkt nicht aktivieren weil die COMAR-Nummer über 2 Yahre alt ist. Es gibt in Vertriebspartnerinformation ein Formular das Sie ausfüllen können, und Ihre Aktivierungen werden ersetzt so lange es innerhalb der Regeln in DTAC Lösung 108357 ist.{Enter}Bitte melden Sie sich bei Ihrem Technischen Bezirksleiter wenn Sie Fragen über diesen Prozess haben. - Return - -; CCMS case +; Case :*:[cms:: - Send Hallo,{Enter 2} {Enter}{Home down}{Shift up}{Home up}Für Rückfragen stehen wir gerne zur Verfügung.{Enter 2}Mit freundlichen Grüßen,{Enter}David{Up 4}{End} + Send Hallo,{Enter 2}{Space 3}{Enter}{Home down}{Shift down}{Home up}{Shift up}{Enter}Mit freundlichen Grüßen,{Enter}David{Up 3}{End} Return #If @@ -561,7 +542,7 @@ SetTitleMatchMode, 2 :*:mtg::MTG ::wdt::WDT ::itc::iTC - ::vin::VIN + :*:vin::VIN ::gs2::GS2 ::gs3::GS3 ::sf1::SF1 @@ -621,19 +602,19 @@ SetTitleMatchMode, 2 ; QoL Improvements ;------------------------------------------------------------------------------ -#j:: -Run, C:\Users\%racf%\Downloads ; Open the downloads folder on Win+J +#j:: ; Open the downloads folder on Win+J +Run, C:\Users\%racf%\Downloads Return -#w:: +#w:: ; Open My Documents folder on Win+W if WinActive("ahk_exe Explorer.EXE") ; If windows explorer is focused { Send !d ; Focus the address bar - Send C:\Users\%racf%\Documents\Work_Docs\Cases\2020-01 - 06 ; current folder, would love to use a var instead, but Run doesn't like it + Send C:\Users\%racf%\Documents Send {Enter} Return } -Run, C:\Users\%racf%\Documents\Work_Docs\Cases\2020-01 - 06 ; Open the documentation folder on Win+W -Return \ No newline at end of file +Run, C:\Users\%racf%\Documents +Return diff --git a/glovarsource b/glovarsource index ebaf456..e3902ec 100644 --- a/glovarsource +++ b/glovarsource @@ -8,9 +8,4 @@ VIN= usr= org= [Info] -case= -dorg= -dus= -dnm= -dem= -xID= \ No newline at end of file +ccms= -- 2.54.0 From 7e3f293f8c163b68a8ea6a279cbe576fdd28b239 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 27 Mar 2020 14:04:32 -0500 Subject: [PATCH 02/34] Different case text Removed the german version since only internal comments are used, updated to T2 format --- D3K.ahk | 153 ++++++-------------------------------------------------- 1 file changed, 14 insertions(+), 139 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 8a5bccd..f0a5638 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -14,6 +14,7 @@ FileAppend, [USpec] RACF=LF01234 Email=LastnameFirstname@JohnDeere.com +Name=Firstname DocFile=Select File [Main] Mansol=1 @@ -37,6 +38,7 @@ Run Settings.ahk ; Runs the GUI for changing the settings, also accessible with ; User Specific things: racf := ini_get(ini, "USpec", "RACF") email := ini_get(ini, "USpec", "Email") +name := ini_get(ini, "USpec", "Name") docfile := ini_get(ini, "USpec", "DocFile") ; General Settings @@ -129,44 +131,6 @@ If (glovar = 1) } } } - If InStr(REKey, "xid") ; If an xID is entered. Unique identifier for people - { - dealinfo := GetInfo(REValue) ; Gets information, see function for details - StringUpper, REValue, REValue ; Makes xID uppercase - - if !(REValue = dealinfo.xid) - { - run addemail.ahk - Continue - } - - ; Replace the data in glovar.ahk with the data from the ini - FileRead, tempglovar, glovar.ahk - tempglovar := RegExReplace(tempglovar, "(?<=\$xid::).*", dealinfo.xid) - tempglovar := RegExReplace(tempglovar, "(?<=\$dem::).*", dealinfo.email) - tempglovar := RegExReplace(tempglovar, "(?<=\$dnm::).*", dealinfo.name) - tempglovar := RegExReplace(tempglovar, "(?<=\$dus::).*", dealinfo.user) - tempglovar := RegExReplace(tempglovar, "(?<=\$dorg::).*", dealinfo.org) - FileAppend, %tempglovar%, tempglovar - FileCopy, tempglovar, glovar.ahk,1 - FileDelete, tempglovar - - WinWaitNotActive, GloVar.ini - { - ini_write(glovarini, "xID", dealinfo.xid) ; Writes the xID - ini_write(glovarini, "dem", dealinfo.email) ; Writes email address (incredibly useful) - ini_write(glovarini, "dnm", dealinfo.name) ; Writes Name (useful for when referring to that person) - ini_write(glovarini, "dus", dealinfo.user) ; Writes demo account name (somewhat useful) - ini_write(glovarini, "dorg", dealinfo.org) - } - FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - Continue - } - If (InStr(REKey, "dem") or InStr(REKey, "dnm") or InStr(REKey, "dus")) - { - ; Do not process xID related info, that is done above - Continue - } writethis := ":*:$" REKey "::" REValue "`n" ; Save the hotstring to a variable FileAppend, %writethis%, glovar.ahk ; Write the variable to glovar.ahk } @@ -180,8 +144,8 @@ If (glovar = 1) initemp := RegExReplace(initemp, "(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" - writethis := "Case on " . CurrTime . "`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable - FileAppend, % "`n`n`n`n" writethis "`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + FileAppend, % "`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath FileAppend,, temptemp FileCopy, glovarsource, %glovarini%, 1 ; Copies and replaces any text in glovar.ini with the template FileCopy, temptemp, %docfile%, 1 ; These two this close together makes it look like they get cleared at the same time @@ -236,25 +200,6 @@ If (glovar = 1) Pause::Run Case_Formatter.ahk ; The Pause|Break key #If -; These things below are for using in a pinch, or when there is no dealer. - -SetTitleMatchMode, 2 -#If (WinActive = Temp.txt) && (CaseFormatter = "1") -:*:\case:: - CurrTime := GetDateTime("en") - Send Call received on %CurrTime% {Enter}Name: {Enter}Username: {Enter} - Return -#If - - -;German -#If (CaseFormatter = "1") && (ger = "1") -:*:|case:: - CurrTime := GetDateTime("de") - Send Anruf wurde am %CurrTime% entgegengenommen{Enter}Name: {Enter}Benutzername: {Enter} - Return -#If - ;------------------------------------------------------------------------------- ; Special Characters @@ -335,86 +280,11 @@ SetTitleMatchMode, 2 ;------------------------------------------------------------------------------ ; Copypastas ;------------------------------------------------------------------------------ - -; Recommending case -:*:]rec:: - Send Recommending Case, please contact us if there are any further questions. +;STWA Applied +:*:]cms:: + Send Notes:{Space}{Enter}Explanation:{Space}{Enter}Flowdock:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{CtrlDown}{Home}{CtrlUp}{End} Return -; Escalatimg Case -:*:]esc1:: - Send This case was unable to be resolved and has been transferred to another team. Our Tier 2 team is investigating the issue to find a short term resolution. We will update you as soon as we have a recommendation. - Return - -:*:]esc2:: - Send A short term resolution still has not been identified. We are requesting an immediate update on this case from our Tier 2 team. We will contact you as soon as we have a status update. - Return - -; Requesting info -:*:]req1:: - Send A request has been made for additional information in this case. Please provide the information as soon as possible so that the case can be resolved. - Return - -:*:]req2:: - Send A follow-up request has been made for the additional information. - Return - -:*:]req3:: - Send The additional information required has not yet been received. This case will now be sent back to you. Please reopen the case, or contact the Global Support Center again via phone or email with the additional information and reference this case number so that it can be reopened and investigated further. - Return - -; Defect / NCCA -:*:]ncca:: - Send We will be recommending this case back to you for the time being. This issue is still being investigated and worked on via an internal product corrective action ticket. We will continue to monitor the progress of that ticket and contact you when we have a solution or a short term recommendation. The case text will be updated at that time for documentation purposes.{Enter}You may choose to close this case yourself, return it to us, or keep it open until we provide you with a corrective action recommendation. If you have questions on the status of this issue, please re-open the case or contact the Global Support Center using the contact information found in DTAC solution 82793. We will provide you with any information we are able to gather from the product team. - Return - -; DTAC -:*:]dtac:: - Send The ISG Global Support Center has determined that this case is hardware related; therefore this case is being transferred from the GSC to the ISG DTAC group. A DTAC technician will now work this case via the CCMS system and provide a recommendation in the case text if more information is needed or if a solution has been found. Please continue to update or check on the progress of this case by using the CCMS system case text section moving forward. - Return - -; German -#If, ger = "1" -; Recommending Case -:*:[rec:: - Send Fall an H{U+00E4}ndler gewiesen, bitte melden Sie sich wenn sie weitere fragen haben. - Return - -; Escalating Case -:*:[esc1:: - Send Der Fall konnte vom GSC nicht gelöst werden und wurde an die nächste Supportebene weitergeleitet. Das Support Team wird das Problem weiter untersuchen und versuchen eine kurzfristige Lösung bereit zu stellen. Sobald wir eine Empfehlung erhalten, werden wir Sie darüber informieren. - Return - -:*:[esc2:: - Send Bisher steht uns keine kurzfristige Lösung zur Verfügung. Wir fordern umgehend ein Status-Update bezüglich des Falls von unserem Support Team an.{Shift down}{Enter}{Shift up}Wir werden Sie erneut kontaktieren, sobald wir über den aktuellsten Stand des Falls informiert sind. - Return - -; Requesting info -:*:[req1:: - Send Wir haben zusätzliche Informationen von Ihnen bezüglich des Falls angefordert. Bitte stellen Sie uns die Informationen so bald wie möglich zur Verfügung, damit der Fall gelöst werden kann. - Return - -:*:[req2:: - Send Wir fordern die zusätzlichen Informationen von Ihnen erneut an. - Return - -:*:[req3:: - Send Wir haben die benötigten zusätzlichen Informationen von Ihnen noch nicht erhalten. Dieser Fall wird jetzt zu Ihnen zurückgeschickt. Bitte setzen Sie sich mit dem GSC telefonisch oder per Email mit den zusätzlichen Informationen nochmal in Verbindung und referenzieren Sie die Fallnummer, damit der Fall erneut geöffnet und weiter untersucht werden kann. - Return - -; Defect / NCCA -:*:[ncca:: - Send Wir werden diesen Fall vorübergehend an Sie zurückweisen. Dieses Problem wird noch über ein innenseitiges Produkt Korrektur Ticket bearbeitet. Wir werden weiterhin den Fortschritt dieses Tickets verfolgen und mit Ihnen Kontakt aufnehmen, wenn wir eine Lösung oder eine kurzfristige Empfehlung haben.{Enter}Sie können diesen Fall selbst schließen, an uns zurückzugeben oder offen halten, bis wir Ihnen eine Korrekturmaßnahme empfehlen. Wenn Sie Fragen zum Fall Status haben wenden Sie sich an das Global Support Center, indem Sie die Kontaktinformationen in der DTAC-Lösung 82793 abrufen. Wir werden Ihnen alle Informationen, die wir von dem Produktteam bekommen haben, zu Verfügung stellen. - Return - -; DTAC -:*:[dtac:: - Send Das ISG Global Support Center hat festgestellt, dass dieser Fall hardwarebezogen ist; Daher wird dieser Fall vom GSC an die ISG DTAC Gruppe übertragen. Ein DTAC-Techniker wird nun diesen Fall über das DTAC-System bearbeiten und eine Empfehlung im Fall Text geben, wenn weitere Informationen benötigt werden oder wenn eine Lösung gefunden wurde. Dementsprechend bitten wir Sie, den Fortschritt des Falls mithilfe des Falltextes zu überprüfen und falls nötig mit fehlenden Informationen zu ergänzen. - Return -#If - - - ;------------------------------------------------------------------------------ ; Email ;------------------------------------------------------------------------------ @@ -426,7 +296,7 @@ SetTitleMatchMode, 2 ; Cases :*:]cms:: - Send Hello,{Enter 2}{Space 3}{Enter}{Home down}{Shift up}{Home up}{Enter}Thank you,{Enter}David{Up 3}{End} + Send Hello,{Enter 2}{Space 3}{Enter}{Home down}{Shift up}{Home up}{Enter}Thank you,{Enter}%name%{Up 3}{End} Return #If @@ -442,7 +312,7 @@ SetTitleMatchMode, 2 ; Case :*:[cms:: - Send Hallo,{Enter 2}{Space 3}{Enter}{Home down}{Shift down}{Home up}{Shift up}{Enter}Mit freundlichen Grüßen,{Enter}David{Up 3}{End} + Send Hallo,{Enter 2}{Space 3}{Enter}{Home down}{Shift down}{Home up}{Shift up}{Enter}Mit freundlichen Grüßen,{Enter}%name%{Up 3}{End} Return #If @@ -524,6 +394,9 @@ SetTitleMatchMode, 2 :*:]jddm::John Deere Data Manager :*:]serva::Service Advisor :*:]muc::Master Unlock Code + :*:]asmn::Asset Manager + + :*:]deg::{ASC 248} :*:]eq::{ASC 247} @@ -590,6 +463,8 @@ SetTitleMatchMode, 2 :*:[jddm::John Deere Data Manager :*:[serva::Service Advisor :*:[muc::Master Unlock Code + :*:[asmn::Asset Manager + :*:[deg::{ASC 248} :*:[eq::{ASC 247} #If -- 2.54.0 From 65b040054aa2cf39d374e9a53ff3bdaddbc4a9d9 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 31 Mar 2020 13:17:19 -0500 Subject: [PATCH 03/34] Minor improvements --- D3K.ahk | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index f0a5638..c344711 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -397,9 +397,6 @@ If (glovar = 1) :*:]asmn::Asset Manager - :*:]deg::{ASC 248} - :*:]eq::{ASC 247} - ::rowsense::RowSense ::comar::COMAR ::mrtk::mRTK @@ -464,15 +461,10 @@ If (glovar = 1) :*:[serva::Service Advisor :*:[muc::Master Unlock Code :*:[asmn::Asset Manager - - :*:[deg::{ASC 248} - :*:[eq::{ASC 247} #If - - ;------------------------------------------------------------------------------ ; QoL Improvements ;------------------------------------------------------------------------------ @@ -493,3 +485,21 @@ if WinActive("ahk_exe Explorer.EXE") ; If windows explorer is focused } Run, C:\Users\%racf%\Documents Return + +:*:[deg::{ASC 248} +:*:]deg::{ASC 248} +:*:[eq::{ASC 247} +:*:]eq::{ASC 247} + +:*:[shrug::¯\_(ツ)_/¯ +:*:]shrug::¯\_(ツ)_/¯ +::]yee:: + yee() + { + asc_yee := ["░░░░░░░░░░░░░▄███▄▄▄░░░░░░░","░░░░░░░░░▄▄▄██▀▀▀▀███▄░░░░░","░░░░░░░▄▀▀░░░░░░░░░░░▀█░░░░","░░░░▄▄▀░░░░░░░░░░░░░░░▀█░░░","░░░█░░░░░▀▄░░▄▀░░░░░░░░█░░░","░░░▐██▄░░▀▄▀▀▄▀░░▄██▀░▐▌░░░","░░░█▀█░▀░░░▀▀░░░▀░█▀░░▐▌░░░","░░░█░░▀▐░░░░░░░░▌▀░░░░░█░░░","░░░█░░░░░░░░░░░░░░░░░░░█░░░","░░░░█░░▀▄░░░░▄▀░░░░░░░░█░░░","░░░░█░░░░░░░░░░░▄▄░░░░█░░░░","░░░░░█▀██▀▀▀▀██▀░░░░░░█░░░░","░░░░░█░░▀████▀░░░░░░░█░░░░░","░░░░░░█░░░░░░░░░░░░▄█░░░░░░","░░░░░░░██░░░░░█▄▄▀▀░█░░░░░░","░░░░░░░░▀▀█▀▀▀▀░░░░░░█░░░░░", "yee ░░░░░█░░░░░░░░░░░░█░░░░"] + + For index, value in asc_yee + { + SendInput, %value%{ShiftDown}{Enter}{ShiftUp} + } + } -- 2.54.0 From 9b7d00648e38bf7fac5f3e1db0e139656d20ffaa Mon Sep 17 00:00:00 2001 From: david Date: Mon, 18 May 2020 16:32:10 -0500 Subject: [PATCH 04/34] add Mouse Mover, available under right click menu --- D3K.ahk | 8 ++++++-- msmv.ahk | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 msmv.ahk diff --git a/D3K.ahk b/D3K.ahk index c344711..7b9c310 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -1,6 +1,7 @@ #Include, func.ahk Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard +Menu, Tray, Add, MouseMover ; Add item to the tray to move the mouse ;------------------------------------------------------------------------------ ; Make sure the settings file exists, if not, create it @@ -62,7 +63,7 @@ If (glovar = 1) { glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies - glovarstart := "#SingleInstance force`n`n:*:$dorg::`n:*:$dus::`n:*:$dnm::`n:*:$dem::`n:*:$xid::`n" + glovarstart := "#SingleInstance force`n`n" SetTimer, GloVar, 2000 ; Check every 2 seconds @@ -182,6 +183,9 @@ If (glovar = 1) !+\::Run Settings.ahk ; Alt+Shift+\ +MouseMover: + Run, msmv.ahk +Return ;------------------------------------------------------------------------------ ; DTAC Solution Opener @@ -282,7 +286,7 @@ If (glovar = 1) ;------------------------------------------------------------------------------ ;STWA Applied :*:]cms:: - Send Notes:{Space}{Enter}Explanation:{Space}{Enter}Flowdock:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{CtrlDown}{Home}{CtrlUp}{End} + Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Up 5}{End} Return ;------------------------------------------------------------------------------ diff --git a/msmv.ahk b/msmv.ahk new file mode 100644 index 0000000..14f782f --- /dev/null +++ b/msmv.ahk @@ -0,0 +1,31 @@ +#SingleInstance, force + +Gui, +AlwaysOnTop +ToolWindow + +Gui, Add, Button, x3 y3 w55 h20 gStart vStart +Center, Start +Gui, Add, Button, x3 y3 w55 h20 gStop vStop +Center, Stop +Gui, Show, h28 w60, msmv +GuiControl, Hide, Stop +Return + +Start: + GuiControl, Hide, Start + SetTimer, Msmv, 480000 + GuiControl, Show, Stop +Return + +Stop: + GuiControl, Hide, Stop + SetTimer, Msmv, off + GuiControl, Show, Start +Return + +Msmv: + MouseMove, 100, 0 + Sleep, 240000 + MouseMove, 0, 0 +Return + +GuiClose: +GuiEscape: +ExitApp ; Closes the app when escape or the exit button is pressed -- 2.54.0 From ab8f81db2c0fae73d3e4827b52b73fcea796a4e1 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 19 May 2020 10:16:33 -0500 Subject: [PATCH 05/34] add some ascii art --- D3K.ahk | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 7b9c310..828d6a7 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -1,4 +1,4 @@ -#Include, func.ahk +#Include, func.ahk Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard Menu, Tray, Add, MouseMover ; Add item to the tray to move the mouse @@ -497,13 +497,27 @@ Return :*:[shrug::¯\_(ツ)_/¯ :*:]shrug::¯\_(ツ)_/¯ -::]yee:: - yee() - { - asc_yee := ["░░░░░░░░░░░░░▄███▄▄▄░░░░░░░","░░░░░░░░░▄▄▄██▀▀▀▀███▄░░░░░","░░░░░░░▄▀▀░░░░░░░░░░░▀█░░░░","░░░░▄▄▀░░░░░░░░░░░░░░░▀█░░░","░░░█░░░░░▀▄░░▄▀░░░░░░░░█░░░","░░░▐██▄░░▀▄▀▀▄▀░░▄██▀░▐▌░░░","░░░█▀█░▀░░░▀▀░░░▀░█▀░░▐▌░░░","░░░█░░▀▐░░░░░░░░▌▀░░░░░█░░░","░░░█░░░░░░░░░░░░░░░░░░░█░░░","░░░░█░░▀▄░░░░▄▀░░░░░░░░█░░░","░░░░█░░░░░░░░░░░▄▄░░░░█░░░░","░░░░░█▀██▀▀▀▀██▀░░░░░░█░░░░","░░░░░█░░▀████▀░░░░░░░█░░░░░","░░░░░░█░░░░░░░░░░░░▄█░░░░░░","░░░░░░░██░░░░░█▄▄▀▀░█░░░░░░","░░░░░░░░▀▀█▀▀▀▀░░░░░░█░░░░░", "yee ░░░░░█░░░░░░░░░░░░█░░░░"] - For index, value in asc_yee +asciiart(art) +{ + For index, value in art { SendInput, %value%{ShiftDown}{Enter}{ShiftUp} } - } + Return +} + +:*:]yee:: + asc_yee := ["░░░░░░░░░░░░░▄███▄▄▄░░░░░░░","░░░░░░░░░▄▄▄██▀▀▀▀███▄░░░░░","░░░░░░░▄▀▀░░░░░░░░░░░▀█░░░░","░░░░▄▄▀░░░░░░░░░░░░░░░▀█░░░","░░░█░░░░░▀▄░░▄▀░░░░░░░░█░░░","░░░▐██▄░░▀▄▀▀▄▀░░▄██▀░▐▌░░░","░░░█▀█░▀░░░▀▀░░░▀░█▀░░▐▌░░░","░░░█░░▀▐░░░░░░░░▌▀░░░░░█░░░","░░░█░░░░░░░░░░░░░░░░░░░█░░░","░░░░█░░▀▄░░░░▄▀░░░░░░░░█░░░","░░░░█░░░░░░░░░░░▄▄░░░░█░░░░","░░░░░█▀██▀▀▀▀██▀░░░░░░█░░░░","░░░░░█░░▀████▀░░░░░░░█░░░░░","░░░░░░█░░░░░░░░░░░░▄█░░░░░░","░░░░░░░██░░░░░█▄▄▀▀░█░░░░░░","░░░░░░░░▀▀█▀▀▀▀░░░░░░█░░░░░", "yee ░░░░░█░░░░░░░░░░░░█░░░░"] + asciiart(asc_yee) +Return + +:*:]micmute:: + mic_mute := ["░░░░░░░░░░░░░░░░░░░░░░░░░░", "░░░░░░░░█▄░▄█░█░█▀▀░░░░░░░", "░░░░░░░░█░▀░█░█░█░░░░░░░░░", "░░░░░░░░▀░░░▀░▀░▀▀▀░░░░░░░", "░░█▄░▄█░█░░█░▀█▀░█▀▀░█▀▄░░", "░░█░▀░█░█░░█░░█░░█▀▀░█░█░░", "░░▀░░░▀░▀▀▀▀░░▀░░▀▀▀░▀▀░░░", "░░░░░░░░░░░░░░░░░░░░░░░░░░"] + asciiart(mic_mute) +Return + +:*:]sunglass:: + sunglass := ["▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄", "█░░░░░░░░▀█▄▀▄▀██████░▀█▄▀▄▀██████░", "░░░░░░░░░░░▀█▄█▄███▀░░░▀██▄█▄███▀░"] + asciiart(sunglass) +Return \ No newline at end of file -- 2.54.0 From b73be18a625c55056de84e40e47559ab244f178b Mon Sep 17 00:00:00 2001 From: david Date: Fri, 22 May 2020 13:01:26 -0500 Subject: [PATCH 06/34] add functionality to GloVar for giving other people guest admin access --- D3K.ahk | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 828d6a7..b605322 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -112,6 +112,15 @@ If (glovar = 1) } } } + If InStr(StoredSection, "GuestAdmin") ; If the section is "GuestAdmin", make everything uppercase + { + StringUpper, REValue, REValue ; Makes it uppercase + WinWaitNotActive, GloVar.ini ; Just to make sure + { + ini_write(glovarini, REKey, REValue) + FileGetTime, gvMod, %glovarini% + } + } If InStr(REKey, "case") ; If a key contains "case". Case numbers are all in the format "LETTERS-NUMBERS". { StringUpper, REValue, REValue ; Makes it uppercase @@ -138,14 +147,46 @@ If (glovar = 1) If (RESection) ; If we have a section { StoredSection := RESection + If InStr(RESection, "GuestAdmin") ; For giving other people access to orgs + { + If !(GuestAdmin) + { + FileRead, initemp, %glovarini% ; Read the ini + initemp := "[GuestAdmin]`nid=`nusr=`norg=`n[Info]`ncase=" + FileAppend, %initemp%, temptemp + FileCopy, temptemp, %glovarini%, 1 + FileDelete, temptemp + FileRead, gvMod, %glovarini% + FileDelete, glovar.ahk ; THE CLEAN SLATE + FileAppend, %glovarstart%, glovar.ahk + + Sleep, 500 + FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + If FileExist("glovar.ahk") + { + Run glovar.ahk + } + } + GuestAdmin := True + } + If InStr(RESection, "clear") ; Will clear the ini and save its and the documentation file's contents to a log { - FileRead, doctemp, %docfile% ; Read documentation file, set in settings + If !(GuestAdmin) + { + FileRead, doctemp, %docfile% ; Read documentation file, set in settings + } FileRead, initemp, %glovarini% ; Read the ini initemp := RegExReplace(initemp, "(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" - writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + If !(GuestAdmin) + { + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + } else { + writethis := "Case on " . CurrTime . "`n`n" . initemp ; Save the current time and glovarini to a variable if it was just giving access to an org + } + FileAppend, % "`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath FileAppend,, temptemp FileCopy, glovarsource, %glovarini%, 1 ; Copies and replaces any text in glovar.ini with the template @@ -161,6 +202,7 @@ If (glovar = 1) { Run glovar.ahk } + GuestAdmin := False Return } } -- 2.54.0 From 83bd0d3e6c39b77aa28c564c5a6dde1b269bb1e4 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 2 Feb 2021 10:57:36 -0600 Subject: [PATCH 07/34] add tooltip to let you know when glovar's been updated --- D3K.ahk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/D3K.ahk b/D3K.ahk index b605322..33ad2ab 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -212,6 +212,9 @@ If (glovar = 1) If FileExist("glovar.ahk") { Run glovar.ahk + ToolTip, glovar updated, 50, 50 + Sleep, 500 + ToolTip } } } @@ -562,4 +565,4 @@ Return :*:]sunglass:: sunglass := ["▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄", "█░░░░░░░░▀█▄▀▄▀██████░▀█▄▀▄▀██████░", "░░░░░░░░░░░▀█▄█▄███▀░░░▀██▄█▄███▀░"] asciiart(sunglass) -Return \ No newline at end of file +Return -- 2.54.0 From f19018ff704c006708e2034e4648039352d81fc2 Mon Sep 17 00:00:00 2001 From: David Daily Date: Tue, 20 Jul 2021 10:24:19 -0500 Subject: [PATCH 08/34] Update 'D3K.ahk' --- D3K.ahk | 65 +++++++++++++++++++++------------------------------------ 1 file changed, 24 insertions(+), 41 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 33ad2ab..098ec86 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -1,7 +1,8 @@ #Include, func.ahk Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard -Menu, Tray, Add, MouseMover ; Add item to the tray to move the mouse +Menu, Tray, Add, Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse +Menu, Tray, Add, %A_AhkVersion%, docs ;------------------------------------------------------------------------------ ; Make sure the settings file exists, if not, create it @@ -228,7 +229,7 @@ If (glovar = 1) !+\::Run Settings.ahk ; Alt+Shift+\ -MouseMover: +Mouse_Mover: Run, msmv.ahk Return @@ -331,7 +332,7 @@ Return ;------------------------------------------------------------------------------ ;STWA Applied :*:]cms:: - Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Up 5}{End} + Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} Return ;------------------------------------------------------------------------------ @@ -343,13 +344,6 @@ Return Send Hello,{Enter 2}{Space 3} Return -; Cases -:*:]cms:: - Send Hello,{Enter 2}{Space 3}{Enter}{Home down}{Shift up}{Home up}{Enter}Thank you,{Enter}%name%{Up 3}{End} - Return - -#If - ; German #If, ger = "1" @@ -358,12 +352,6 @@ Return :*:[email:: Send Hallo,{Enter 2}{Space 3} Return - -; Case -:*:[cms:: - Send Hallo,{Enter 2}{Space 3}{Enter}{Home down}{Shift down}{Home up}{Shift up}{Enter}Mit freundlichen Grüßen,{Enter}%name%{Up 3}{End} - Return - #If @@ -412,12 +400,9 @@ Return ; English :*:]at::AutoTrac - :*:]sf::StarFire - :*:]jdlw::JDLink Web + :*:]sf::StarFire :*:]jdld::JDLink Dashboard - :*:]jdl2::JDLink Dashboard 2.0 - :*:]jdlc::JDLink Connect - :*:]jdla::JDLink Access + :*:]jdlc::JDLink Connectivity :*:]jdls::JDLink Subscription :*:]jdll::JDLink :*:]jdp::JDParts @@ -436,7 +421,6 @@ Return :*:]hlo::Original HarvestLab :*:]bin::Virtual Inventory :*:]warrep::Warranty Reports - :*:]tp::TouchPoint :*:]tcsm::Territory Customer Support Manager :*:]macrep::Machine Reports :*:]jdsm::John Deere Software Manager @@ -444,16 +428,17 @@ Return :*:]serva::Service Advisor :*:]muc::Master Unlock Code :*:]asmn::Asset Manager + :*:]bsm::Base Station Manager ::rowsense::RowSense - ::comar::COMAR + :*:comar::COMAR ::mrtk::mRTK ::rda::RDA ::rtk::RTK ::autotrac::AutoTrac - ::ccms::CCMS - ::dtac::DTAC + :*:ccms::CCMS + :*:dtac::DTAC ::tcsm::TCSM ::itec::iTEC Pro ::ssu::SSU @@ -473,6 +458,8 @@ Return ::vat::VAT :*:racf::RACF ::igrade::iGrade + :*:JDCP::JDCP + :*:ISOBUS::ISOBUS ; German @@ -482,8 +469,7 @@ Return :*:[jdlw::JDLink Web :*:[jdld::JDLink Dashboard :*:[jdl2::JDLink Dashboard 2.0 - :*:[jdlc::JDLink Connect - :*:[jdla::JDLink Access + :*:[jdlc::JDLink Connectivity :*:[jdls::JDLink Abonnement :*:[jdll::JDLink :*:[jdp::JDParts @@ -510,6 +496,7 @@ Return :*:[serva::Service Advisor :*:[muc::Master Unlock Code :*:[asmn::Asset Manager + :*:[bsm::Base Station Manager #If @@ -522,19 +509,16 @@ Return Run, C:\Users\%racf%\Downloads Return - - #w:: ; Open My Documents folder on Win+W -if WinActive("ahk_exe Explorer.EXE") ; If windows explorer is focused -{ - Send !d ; Focus the address bar - Send C:\Users\%racf%\Documents - Send {Enter} - Return -} Run, C:\Users\%racf%\Documents Return +:*:[now:: ; Send the current time/date in ISO8601 format +:*:]now:: + d_t := GetDateTime("ISO8601") + SendInput, %d_t% +Return + :*:[deg::{ASC 248} :*:]deg::{ASC 248} :*:[eq::{ASC 247} @@ -557,12 +541,11 @@ asciiart(art) asciiart(asc_yee) Return -:*:]micmute:: - mic_mute := ["░░░░░░░░░░░░░░░░░░░░░░░░░░", "░░░░░░░░█▄░▄█░█░█▀▀░░░░░░░", "░░░░░░░░█░▀░█░█░█░░░░░░░░░", "░░░░░░░░▀░░░▀░▀░▀▀▀░░░░░░░", "░░█▄░▄█░█░░█░▀█▀░█▀▀░█▀▄░░", "░░█░▀░█░█░░█░░█░░█▀▀░█░█░░", "░░▀░░░▀░▀▀▀▀░░▀░░▀▀▀░▀▀░░░", "░░░░░░░░░░░░░░░░░░░░░░░░░░"] - asciiart(mic_mute) -Return - :*:]sunglass:: sunglass := ["▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄", "█░░░░░░░░▀█▄▀▄▀██████░▀█▄▀▄▀██████░", "░░░░░░░░░░░▀█▄█▄███▀░░░▀██▄█▄███▀░"] asciiart(sunglass) Return + +docs: + run https://www.autohotkey.com/docs/AutoHotkey.htm +Return \ No newline at end of file -- 2.54.0 From 7d0838567e4ad006f30df7fa52068efa38b4cf53 Mon Sep 17 00:00:00 2001 From: David Daily Date: Tue, 5 Oct 2021 09:26:28 -0500 Subject: [PATCH 09/34] remove unused code --- D3K.ahk | 60 ++------------------------------------------------------- 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 098ec86..0ba7cc6 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -101,27 +101,6 @@ If (glovar = 1) FileGetTime, gvMod, %glovarini% } } - If InStr(StoredSection, "Operations Center") ; If the section is "Operations Center" and the Key "un", make it uppercase - { - If InStr(REKey, "usr") - { - StringUpper, REValue, REValue ; Makes it uppercase - WinWaitNotActive, GloVar.ini - { - ini_write(glovarini, REKey, REValue) ; Writes the properly formatted case number to glovar.ini - FileGetTime, gvMod, %glovarini% - } - } - } - If InStr(StoredSection, "GuestAdmin") ; If the section is "GuestAdmin", make everything uppercase - { - StringUpper, REValue, REValue ; Makes it uppercase - WinWaitNotActive, GloVar.ini ; Just to make sure - { - ini_write(glovarini, REKey, REValue) - FileGetTime, gvMod, %glovarini% - } - } If InStr(REKey, "case") ; If a key contains "case". Case numbers are all in the format "LETTERS-NUMBERS". { StringUpper, REValue, REValue ; Makes it uppercase @@ -148,46 +127,13 @@ If (glovar = 1) If (RESection) ; If we have a section { StoredSection := RESection - If InStr(RESection, "GuestAdmin") ; For giving other people access to orgs - { - If !(GuestAdmin) - { - FileRead, initemp, %glovarini% ; Read the ini - initemp := "[GuestAdmin]`nid=`nusr=`norg=`n[Info]`ncase=" - FileAppend, %initemp%, temptemp - FileCopy, temptemp, %glovarini%, 1 - FileDelete, temptemp - FileRead, gvMod, %glovarini% - FileDelete, glovar.ahk ; THE CLEAN SLATE - FileAppend, %glovarstart%, glovar.ahk - - Sleep, 500 - FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - If FileExist("glovar.ahk") - { - Run glovar.ahk - } - } - GuestAdmin := True - } - If InStr(RESection, "clear") ; Will clear the ini and save its and the documentation file's contents to a log { - If !(GuestAdmin) - { - FileRead, doctemp, %docfile% ; Read documentation file, set in settings - } + FileRead, doctemp, %docfile% ; Read documentation file, set in settings FileRead, initemp, %glovarini% ; Read the ini initemp := RegExReplace(initemp, "(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" - - If !(GuestAdmin) - { - writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable - } else { - writethis := "Case on " . CurrTime . "`n`n" . initemp ; Save the current time and glovarini to a variable if it was just giving access to an org - } - + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable FileAppend, % "`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath FileAppend,, temptemp FileCopy, glovarsource, %glovarini%, 1 ; Copies and replaces any text in glovar.ini with the template @@ -196,14 +142,12 @@ If (glovar = 1) fileread, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code FileDelete, glovar.ahk ; THE CLEAN SLATE FileAppend, %glovarstart%, glovar.ahk - Sleep, 500 FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code If FileExist("glovar.ahk") { Run glovar.ahk } - GuestAdmin := False Return } } -- 2.54.0 From 5ba0c5a21525382d3d540c96c262d7c05b13950a Mon Sep 17 00:00:00 2001 From: David Daily Date: Thu, 13 Jan 2022 13:48:09 -0600 Subject: [PATCH 10/34] replace CCMS with Service Advisor --- Mansol_Opener.ahk | 64 +++++++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/Mansol_Opener.ahk b/Mansol_Opener.ahk index 4d5a5b6..d3aee3e 100644 --- a/Mansol_Opener.ahk +++ b/Mansol_Opener.ahk @@ -1,33 +1,33 @@ -#SingleInstance force ; Only one instance at a time -SendMode, Input -FileEncoding, UTF-8 ; Makes sure the special characters don't break stuff - -Menu, Tray, Icon, %A_MyDocuments%\D3K\icons\manual.ico - -Gui, +AlwaysOnTop +ToolWindow - -Gui, Add, Edit, x2 y3 w78 h20 vNumber +Left, -Gui, Add, Button, x22 y43 w70 h20 Default vHidden, Ok -Gui, Add, Button, x81 y3 w17 h20 gHelp +Center, ? -Gui, Show, h28 w100, ManSol -GuiControl, Hide, Hidden - -Return - -ButtonOk: - Gui, submit ; I have no idea what the regex means any more... - If RegExMatch(Number, "[[:alpha:]]+") - run, % "http://serviceadvisor.deere.com/WebSA/manuals/" . Number - Else If RegExMatch(Number, "[[:digit:]]+") - run, % "https://ccms.deere.com/prweb/PRServletCustomAuth/ZDate_MgiNPn1ccL6O6pyBurDs0hjFQ8*/!STANDARD?pyActivity=SolutionsSnapStart&Action=showHarness&className=Deere-Int-Solr-Docs&Purpose=SolutionDescriptionNew&SolutionID=" . Number . "&Language=Default" - ExitApp -Return - - -Help: - MsgBox, 262176, Maual & Solution opener, Input the TM/OM SKU (easily ofund on TechPubs) or the DTAC solution number to open it in your default browser.`nTMs & OMs open in Service Advisor. -Return - -GuiClose: -GuiEscape: +#SingleInstance force ; Only one instance at a time +SendMode, Input +FileEncoding, UTF-8 ; Makes sure the special characters don't break stuff + +Menu, Tray, Icon, %A_MyDocuments%\D3K\icons\manual.ico + +Gui, +AlwaysOnTop +ToolWindow + +Gui, Add, Edit, x2 y3 w78 h20 vNumber +Left, +Gui, Add, Button, x22 y43 w70 h20 Default vHidden, Ok +Gui, Add, Button, x81 y3 w17 h20 gHelp +Center, ? +Gui, Show, h28 w100, ManSol +GuiControl, Hide, Hidden + +Return + +ButtonOk: + Gui, submit ; I have no idea what the regex means any more... + If RegExMatch(Number, "[[:alpha:]]+") + run, % "http://serviceadvisor.deere.com/WebSA/manuals/" . Number + Else If RegExMatch(Number, "[[:digit:]]+") + run, % "https://serviceadvisor.deere.com/WebSA/solutions/en/" . Number + ExitApp +Return + + +Help: + MsgBox, 262176, Maual & Solution opener, Input the TM/OM SKU (easily ofund on TechPubs) or the DTAC solution number to open it in your default browser.`nTMs & OMs open in Service Advisor. +Return + +GuiClose: +GuiEscape: ExitApp \ No newline at end of file -- 2.54.0 From e851dc5c3c9d51c66a5a37df12a8de36499d8655 Mon Sep 17 00:00:00 2001 From: David Daily Date: Tue, 29 Mar 2022 14:32:47 -0500 Subject: [PATCH 11/34] add date function --- func.ahk | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/func.ahk b/func.ahk index 0ac82c4..a9a96ae 100644 --- a/func.ahk +++ b/func.ahk @@ -12,7 +12,7 @@ GetDateTime(lang) UTCTimestamp := A_NowUTC ; Grab the current time and date UTCFormatStr := "yyyy-MM-dd" ; The Date FormatTime, DateStr, %UTCTimestamp%, %UTCFormatStr% ; format it to make it look like the Date we want - UTCFormatStr := "H:mm' GMT'" ; The time + UTCFormatStr := "H:mm'Z'" ; The time FormatTime, TimeStr, %UTCTimestamp%, %UTCFormatStr% ; Format the string to be better if (lang = "en") { @@ -23,6 +23,16 @@ GetDateTime(lang) { Return DateStr " um " TimeStr } + + if (lang = "ISO8601") + { + Return DateStr "T" TimeStr + } + + if (lang = "date") + { + Return DateStr + } } GetInfo(xID) @@ -104,8 +114,7 @@ ini_write(location, inKey, inValue) replacement := inKey . "=" . inValue tempini := RegExReplace(tempini, needle, replacement,, 1) tempini := RegExReplace(tempini, "\R+\R", "`r`n") - WinWaitNotActive, GloVar.ini FileAppend, %tempini%, tempini ; Append the fixed ini to a new file FileCopy, tempini, %location%, 1 ; Copy the file over, overwriting existing contents FileDelete, tempini ; Delete the fixed temporary ini -} +} \ No newline at end of file -- 2.54.0 From ab121928375d73d46611d19924cb12c21aa0a5f1 Mon Sep 17 00:00:00 2001 From: David Daily Date: Tue, 29 Mar 2022 14:33:19 -0500 Subject: [PATCH 12/34] add date function --- func.ahk | 581 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 481 insertions(+), 100 deletions(-) diff --git a/func.ahk b/func.ahk index a9a96ae..4058edd 100644 --- a/func.ahk +++ b/func.ahk @@ -1,120 +1,501 @@ -#SingleInstance force ; Only one instance at a time -SendMode, Input -FileEncoding, UTF-8 ; Makes sure the special characters dont break stuff -SetWorkingDir, %A_MyDocuments%\D3K ; Make sure we can find the .ahks linked below +#Include, func.ahk -d3k_version = 2.9 ; The current version +Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard +Menu, Tray, Add, Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse +Menu, Tray, Add, %A_AhkVersion%, docs -ini = %A_MyDocuments%\D3Ksettings.ini ; Where the settings ini is +;------------------------------------------------------------------------------ +; Make sure the settings file exists, if not, create it +;------------------------------------------------------------------------------ -GetDateTime(lang) +If !FileExist(ini) ; Check if the ini doesn't exist { - UTCTimestamp := A_NowUTC ; Grab the current time and date - UTCFormatStr := "yyyy-MM-dd" ; The Date - FormatTime, DateStr, %UTCTimestamp%, %UTCFormatStr% ; format it to make it look like the Date we want - UTCFormatStr := "H:mm'Z'" ; The time - FormatTime, TimeStr, %UTCTimestamp%, %UTCFormatStr% ; Format the string to be better - if (lang = "en") - { - Return DateStr " at " TimeStr - } - - if (lang = "de") - { - Return DateStr " um " TimeStr - } - - if (lang = "ISO8601") - { - Return DateStr "T" TimeStr - } - - if (lang = "date") - { - Return DateStr - } -} - -GetInfo(xID) -{ - if (xID) - { - File := FileOpen(A_MyDocuments "\emails.csv", "r") - Loop - { - Line := File.ReadLine() - Array := StrSplit(Line,",") ; split the line at its separating commas to get separate "columns" AKA elements - if InStr(Array[1], xID) ; if at the specified element (1) the specified content (dealers xID) has been found - { - Test := {xid: Array[1], email: Array[2], name: Array[3], user: Array[4], org: Array[5]} ; Return the array so we can do {variable}.email and so on - File.Close() ; Close the file - Return Test ; Return the array with the deets that we found - } - } Until (File.AtEOF) - File.Close() - Return false - } - if !(xID) - { - Return false - } +FileAppend, +( +; 0 is off, 1 is on +[USpec] +RACF=LF01234 +Email=LastnameFirstname@JohnDeere.com +Name=Firstname +DocFile=Select File +[Main] +Mansol=1 +MJDPaste=1 +CaseFormatter=1 +CFmail=0 +[Replacement] +JDProductNames=1 +GloVar=0 +[Language] +German=0 +), %ini% +Run Settings.ahk ; Runs the GUI for changing the settings, also accessible with Alt+Shift+\ (also easy way to restart this script) } ;------------------------------------------------------------------------------ -; INI Manipulation that supports UTF-8 +; Read the ini +;------------------------------------------------------------------------------ +; This is the part that reads the file to see what your settings are. Variables in the ini file are in all lowercase, variables here are CamelCase for more distinction + +; User Specific things: +racf := ini_get(ini, "USpec", "RACF") +email := ini_get(ini, "USpec", "Email") +name := ini_get(ini, "USpec", "Name") +docfile := ini_get(ini, "USpec", "DocFile") + +; General Settings +mansol := ini_get(ini, "Main", "Mansol") +supadmin := ini_get(ini, "Main", "Supadmin") +mjdpaste := ini_get(ini, "Main", "MJDPaste") +caseformatter := ini_get(ini, "Main", "CaseFormatter") + +; Replacement +jdpn := ini_get(ini, "Replacement", "JDProductNames") +glovar := ini_get(ini, "Replacement", "GloVar") + +; Language +ger := ini_get(ini, "Language", "German") + +;------------------------------------------------------------------------------ +; Global Variables ;------------------------------------------------------------------------------ -ini_load(location) +If (glovar = 1) { - File := FileOpen(location, "r") - out := {} - Loop - { - Line := File.ReadLine() - RegExMatch(Line, "(?<=\[).*(?=\])", _RESection) ; Matches section name - RegExMatch(Line, "(?.*)=(?.*)", _) ; Key = _Key, Value = _Value + glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies - If (_RESection) + glovarstart := "#SingleInstance force`n`n" + + SetTimer, GloVar, 2000 ; Check every 2 seconds + + GloVar: + WinWaitNotActive, GloVar.ini ; So that we don't get any problems with the file on disk being out of date. I use VSCode with the "Save on lose focus" option on, YMMV + { + FileGetTime, gvModNew, %glovarini% + if !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. { - _RESection := StrReplace(_RESection, " ", "_") - out[_RESection]:={} - currentSection := _RESection - } Else { - If (_Value) + gvMod := gvModNew + FileDelete, glovar.ahk ; Start with a clean slate + FileAppend, %glovarstart%, glovar.ahk ; makes sure we only have one instance of the script running at a time + + RESection := "" ; Make sure that its clear + file := FileOpen(glovarini, "r") + Loop ; Read one line at a time { - _Key := StrReplace(_Key, " ", "_") - out[currentSection][_Key] := _Value + Line := file.ReadLine() + RegExMatch(Line, "(?<=\[).*(?=\])", RESection) ; explained above + RegExMatch(Line, "^(?.*)=(?.*)", RE) ; Key = REKey, Value = REValue + + If !(RESection) ; If the RegEx doesn't find antything, its empty + { + If !(REValue) ; If there is no value for the key, skip it (Continue the loop at the next line) + { + Continue + } + If InStr(StoredSection, "Serial Numbers") ; If the section is "Serial Numbers", make everything uppercase + { + StringUpper, REValue, REValue ; Makes it uppercase + WinWaitNotActive, GloVar.ini ; Just to make sure + { + ini_write(glovarini, REKey, REValue) + FileGetTime, gvMod, %glovarini% + } + } + If InStr(REKey, "case") ; If a key contains "case". Case numbers are all in the format "LETTERS-NUMBERS". + { + StringUpper, REValue, REValue ; Makes it uppercase + RegExMatch(REValue, "(?<=\().*(?=\))", REMatch) ; Match everything but the parenthesis. When the case numbers are shown they have parenthesis, and those are annoying. + If (REMatch) ; If there's anything there + { + WinWaitNotActive, GloVar.ini + { + ini_write(glovarini, REKey, REMatch) ; Writes the properly formatted case number to glovar.ini + FileGetTime, gvMod, %glovarini% + } + REValue := REMatch + } Else { + WinWaitNotActive, GloVar.ini + { + ini_write(glovarini, REKey, REValue) ; Writes the properly formatted case number to glovar.ini + FileGetTime, gvMod, %glovarini% + } + } + } + writethis := ":*:$" REKey "::" REValue "`n" ; Save the hotstring to a variable + FileAppend, %writethis%, glovar.ahk ; Write the variable to glovar.ahk + } + If (RESection) ; If we have a section + { + StoredSection := RESection + If InStr(RESection, "clear") ; Will clear the ini and save its and the documentation file's contents to a log + { + FileRead, doctemp, %docfile% ; Read documentation file, set in settings + FileRead, initemp, %glovarini% ; Read the ini + initemp := RegExReplace(initemp, "(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info + CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + FileAppend, % "`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath + FileAppend,, temptemp + FileCopy, glovarsource, %glovarini%, 1 ; Copies and replaces any text in glovar.ini with the template + FileCopy, temptemp, %docfile%, 1 ; These two this close together makes it look like they get cleared at the same time + FileDelete, temptemp + fileread, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + FileDelete, glovar.ahk ; THE CLEAN SLATE + FileAppend, %glovarstart%, glovar.ahk + Sleep, 500 + FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + If FileExist("glovar.ahk") + { + Run glovar.ahk + } + Return + } + } + } Until (file.AtEOF) + file.Close() + FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + If FileExist("glovar.ahk") + { + Run glovar.ahk + ToolTip, glovar updated, 50, 50 + Sleep, 500 + ToolTip } } - } Until (File.AtEOF) - File.Close() - Return out + } + Return } -ini_get(location, inSec, inKey) + +;------------------------------------------------------------------------------ +; Settings window +;------------------------------------------------------------------------------ + +!+\::Run Settings.ahk ; Alt+Shift+\ + +Mouse_Mover: + Run, msmv.ahk +Return + +;------------------------------------------------------------------------------ +; DTAC Solution Opener +;------------------------------------------------------------------------------ + +#If, mansol = "1" ; checks from the variable thats set from the .ini file + !+S::Run Mansol_Opener.ahk ; Alt+Shift+S +#If ; these are to make sure one "if" doesn't influence the next accidentially + + +;------------------------------------------------------------------------------ +; Case Formatter +;------------------------------------------------------------------------------ + +#If, CaseFormatter = "1" + Pause::Run Case_Formatter.ahk ; The Pause|Break key +#If + + +;------------------------------------------------------------------------------- +; Special Characters +;------------------------------------------------------------------------------- + +#If, ger = "1" +; scharfes s / Eszett / ß + !s::Send {U+00DF} ;Alt+S + +; ä + !a::Send {U+00E4} ;Alt+a + +; ö + !o::Send {U+00F6} ;Alt+o + +; ü + !u::Send {U+00FC} ;Alt+u + +; Ä + +!A::Send {U+00C4} ;Alt+A + +; Ö + +!O::Send {U+00D6} ;Alt+O + +; Ü + +!U::Send {U+00DC} ;Alt+U + +#If + +;------------------------------------------------------------------------------- +; Capitalise dates +;------------------------------------------------------------------------------- + +::monday::Monday +::tuesday::Tuesday +::wednesday::Wednesday +::thursday::Thursday +::friday::Friday +::saturday::Saturday +::sunday::Sunday + +::january::January +::february::February +; ::march::March ; Commented out because it matches the common word "march". +::april::April +; ::may::May ; Commented out because it matches the common word "may". +::june::June +::july::July +::august::August +::september::September +::october::October +::november::November +::december::December + + +; German +#If, ger = "1" + ::montag::Montag + ::dienstag::Dienstag + ::mittwoch::Mittwoch + ::donnerstag::Donnerstag + ::freitag:: Freitag + ::samstag::Samstag + ::sonntag::Sonntag + + ::januar::Januar + ::februar::Februar + ::märz::März + ::mai::Mai + ::juni::Juni + ::juli::Juli + ::oktober::Oktober + ::dezebmer::Dezember +#If + + + +;------------------------------------------------------------------------------ +; Copypastas +;------------------------------------------------------------------------------ +;STWA Applied +:*:]cms:: + Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} + Return + +;------------------------------------------------------------------------------ +; Email +;------------------------------------------------------------------------------ + +; Regular +:*:]email:: + Send Hello,{Enter 2}{Space 3} + Return + + +; German +#If, ger = "1" + +; Regular +:*:[email:: + Send Hallo,{Enter 2}{Space 3} + Return +#If + + + +;------------------------------------------------------------------------------ +; Profile email paste +;------------------------------------------------------------------------------ +; So when editing Profiles, it won't let you paste in the email field. We don't like that. Make sure to let go of all keys immediatley after pressing this + +#If, mjdpaste = "1" + #v:: + sleep, 750 + Send %clipboard% + sleep, 500 + send # ; to make sure the start menu isn't open for some reason + return +#If + + + +;------------------------------------------------------------------------------ +; Common Terms autocorrect and replacement +;------------------------------------------------------------------------------ + +#If, not(racf = "LF01234") ; So that it doesn't put the fake RACF from the default ini file + :*:]me:: + Send, %racf% + return + + :*:[me:: + Send, %racf% + return +#If + +#If, not(email = "LastnameFirstname@JohnDeere.com") ; Same as above + :*:@me:: + Send, %email% + Return +#If + +; JD Names +#If, jdpn = "1" + + :*:[xx::XXXXXXXXXXXXX ; I'm not gonna try and find the right amount of X's to appease the CCMS demons + :*:]xx::XXXXXXXXXXXXX + +; English + :*:]at::AutoTrac + :*:]sf::StarFire + :*:]jdld::JDLink Dashboard + :*:]jdlc::JDLink Connectivity + :*:]jdls::JDLink Subscription + :*:]jdll::JDLink + :*:]jdp::JDParts + :*:]mjd::MyJohnDeere + :*:]opsc::Operations Center + :*:]seccon::Section Control + :*:]gs::GreenStar + :*:]cc::CommandCenter + :*:]fc::Field Connect + :*:]rs::RowSense + :*:]sub::subscription + :*:]ss::Stellar Support + :*:]tman::Technical Manual + :*:]oman::Operator's Manual + :*:]hl3::HarvestLab 3000 + :*:]hlo::Original HarvestLab + :*:]bin::Virtual Inventory + :*:]warrep::Warranty Reports + :*:]tcsm::Territory Customer Support Manager + :*:]macrep::Machine Reports + :*:]jdsm::John Deere Software Manager + :*:]jddm::John Deere Data Manager + :*:]serva::Service Advisor + :*:]muc::Master Unlock Code + :*:]asmn::Asset Manager + :*:]bsm::Base Station Manager + + + ::rowsense::RowSense + :*:comar::COMAR + ::mrtk::mRTK + ::rda::RDA + ::rtk::RTK + ::autotrac::AutoTrac + :*:ccms::CCMS + :*:dtac::DTAC + ::tcsm::TCSM + ::itec::iTEC Pro + ::ssu::SSU + ::atu::ATU + :*:mtg::MTG + ::wdt::WDT + ::itc::iTC + :*:vin::Machine PIN ; Not actually vehicles, so they don't have VINs + ::gs2::GS2 + ::gs3::GS3 + ::sf1::SF1 + ::sf2::SF2 + ::sf3::SF3 + ::sf4::SF4 + ::xid::xID + ::pmcalc::PMCalc + ::vat::VAT + :*:racf::RACF + ::igrade::iGrade + :*:JDCP::JDCP + :*:ISOBUS::ISOBUS + + +; German +#If, ger = "1" + :*:[at::AutoTrac + :*:[sf::StarFire + :*:[jdlw::JDLink Web + :*:[jdld::JDLink Dashboard + :*:[jdl2::JDLink Dashboard 2.0 + :*:[jdlc::JDLink Connectivity + :*:[jdls::JDLink Abonnement + :*:[jdll::JDLink + :*:[jdp::JDParts + :*:[mjd::MyJohnDeere + :*:[opsc::Einsatzzentrale + :*:[seccon::Teilbreitensteuerung + :*:[gs::GreenStar + :*:[cc::CommandCenter + :*:[fc::Field Connect + :*:[rs::RowSense + :*:[sub::Abonnement + :*:[ss::Stellar Support + :*:[tman::Technische Betriebsanleitung + :*:[oman::Betriebsanleitung + :*:[hl3::HarvestLab 3000 + :*:[hlo::Originales HarvestLab + :*:[bin::Virtuellen Bestand + :*:[warrep::Warranty Reports + :*:[tp::TouchPoint + :*:[tcsm::Technischer Bezirksleiter + :*:[macrep::Machine Reports + :*:[jdsm::John Deere Software Manager + :*:[jddm::John Deere Data Manager + :*:[serva::Service Advisor + :*:[muc::Master Unlock Code + :*:[asmn::Asset Manager + :*:[bsm::Base Station Manager +#If + + + +;------------------------------------------------------------------------------ +; QoL Improvements +;------------------------------------------------------------------------------ + +#j:: ; Open the downloads folder on Win+J +Run, C:\Users\%racf%\Downloads +Return + +#w:: ; Open My Documents folder on Win+W +Run, C:\Users\%racf%\Documents +Return + +:*:[now:: ; Send the current time/date in ISO8601 format +:*:]now:: + d_t := GetDateTime("ISO8601") + SendInput, %d_t% +Return + +:*:[today:: ; Send the current date in ISO8601 format +:*:]today:: + d_t := GetDateTime("date") + SendInput, %d_t% +Return + +:*:[deg::{ASC 248} +:*:]deg::{ASC 248} +:*:[eq::{ASC 247} +:*:]eq::{ASC 247} + +:*:[shrug::¯\_(ツ)_/¯ +:*:]shrug::¯\_(ツ)_/¯ + +asciiart(art) { - ini_loaded := {} - ini_loaded := ini_load(location) - - inSec := StrReplace(inSec, " ", "_") - inKey := StrReplace(inKey, " ", "_") - - needed := ini_loaded[inSec][inKey] - - if (needed) ; Without this it doesn't know what to return and gets stuck - { - Return needed - } Else Return false + For index, value in art + { + SendInput, %value%{ShiftDown}{Enter}{ShiftUp} + } + Return } -ini_write(location, inKey, inValue) -{ - FileRead, tempini, %location% - needle := inKey . "=.*" - replacement := inKey . "=" . inValue - tempini := RegExReplace(tempini, needle, replacement,, 1) - tempini := RegExReplace(tempini, "\R+\R", "`r`n") - FileAppend, %tempini%, tempini ; Append the fixed ini to a new file - FileCopy, tempini, %location%, 1 ; Copy the file over, overwriting existing contents - FileDelete, tempini ; Delete the fixed temporary ini -} \ No newline at end of file +:*:]yee:: + art := ["░░░░░░░░░░░░░▄███▄▄▄░░░░░░░","░░░░░░░░░▄▄▄██▀▀▀▀███▄░░░░░","░░░░░░░▄▀▀░░░░░░░░░░░▀█░░░░","░░░░▄▄▀░░░░░░░░░░░░░░░▀█░░░","░░░█░░░░░▀▄░░▄▀░░░░░░░░█░░░","░░░▐██▄░░▀▄▀▀▄▀░░▄██▀░▐▌░░░","░░░█▀█░▀░░░▀▀░░░▀░█▀░░▐▌░░░","░░░█░░▀▐░░░░░░░░▌▀░░░░░█░░░","░░░█░░░░░░░░░░░░░░░░░░░█░░░","░░░░█░░▀▄░░░░▄▀░░░░░░░░█░░░","░░░░█░░░░░░░░░░░▄▄░░░░█░░░░","░░░░░█▀██▀▀▀▀██▀░░░░░░█░░░░","░░░░░█░░▀████▀░░░░░░░█░░░░░","░░░░░░█░░░░░░░░░░░░▄█░░░░░░","░░░░░░░██░░░░░█▄▄▀▀░█░░░░░░","░░░░░░░░▀▀█▀▀▀▀░░░░░░█░░░░░", "yee ░░░░░█░░░░░░░░░░░░█░░░░"] + asciiart(art) +Return + +:*:]glass:: + art := ["▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄", "█░░░░░░░░▀█▄▀▄▀██████░▀█▄▀▄▀██████░", "░░░░░░░░░░░▀█▄█▄███▀░░░▀██▄█▄███▀░"] + asciiart(art) +Return + +docs: + run https://www.autohotkey.com/docs/AutoHotkey.htm +Return \ No newline at end of file -- 2.54.0 From 2eff8ca4ad00495b078ecf6105e242cad3908cda Mon Sep 17 00:00:00 2001 From: David Daily Date: Wed, 1 Feb 2023 14:41:14 -0600 Subject: [PATCH 13/34] improve everything --- msmv.ahk | 50 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/msmv.ahk b/msmv.ahk index 14f782f..b95b9dc 100644 --- a/msmv.ahk +++ b/msmv.ahk @@ -1,16 +1,30 @@ #SingleInstance, force +CoordMode, Mouse, Screen +waittime := 180000 + +Switch A_Args[1] +{ +Case "on": + Menu, Tray, NoIcon + Goto, Start +Case "off": + ExitApp +} + +Menu, Tray, Add, Hide GUI, GuiToggle ; Adds a button to toggle the gui +Menu, Tray, Add, Exit, GuiClose ; Exit button +Menu, Tray, NoStandard ; None of the standard tray buttons Gui, +AlwaysOnTop +ToolWindow - -Gui, Add, Button, x3 y3 w55 h20 gStart vStart +Center, Start -Gui, Add, Button, x3 y3 w55 h20 gStop vStop +Center, Stop +Gui, Add, Button, x3 y3 w55 h20 gStart +Center, Start +Gui, Add, Button, x3 y3 w55 h20 gStop +Center, Stop Gui, Show, h28 w60, msmv -GuiControl, Hide, Stop +GuiControl, Hide, Stop ; Since we want the Start button to show first Return Start: GuiControl, Hide, Start - SetTimer, Msmv, 480000 + SetTimer, Msmv, %waittime% ; Checks if the has been input in the last 2 minutes every 30 secs, easier to stop a loop with SetTimer GuiControl, Show, Stop Return @@ -21,11 +35,29 @@ Stop: Return Msmv: - MouseMove, 100, 0 - Sleep, 240000 - MouseMove, 0, 0 + If (A_TimeIdle > waittime) ; https://www.autohotkey.com/docs/Variables.htm#User_Idle_Time + { + Random, x,, %A_ScreenWidth% + Random, y,, %A_ScreenHeight% + MouseMove %x%, %y% + } +Return + +GuiToggle: + If !nogui + { + Gui, Hide + Menu, Tray, Check, Hide GUI + nogui := True + } + Else + { + Menu, Tray, uncheck, Hide GUI + nogui := False + Gui, Show + } Return GuiClose: GuiEscape: -ExitApp ; Closes the app when escape or the exit button is pressed +ExitApp ; Closes the app when escape or the exit button is pressed \ No newline at end of file -- 2.54.0 From d537a9bf7bb2a4edfbe81e8de22eccf193508a91 Mon Sep 17 00:00:00 2001 From: David Daily Date: Wed, 1 Feb 2023 14:43:37 -0600 Subject: [PATCH 14/34] Update 'D3K.ahk' --- D3K.ahk | 553 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 287 insertions(+), 266 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 0ba7cc6..52846ed 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -1,168 +1,128 @@ #Include, func.ahk Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard -Menu, Tray, Add, Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse +Menu, Tray, Add, &Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse +Menu, Tray, Add, Settings, D3K_Settings ; Add item to the tray to move the mouse Menu, Tray, Add, %A_AhkVersion%, docs -;------------------------------------------------------------------------------ -; Make sure the settings file exists, if not, create it -;------------------------------------------------------------------------------ - -If !FileExist(ini) ; Check if the ini doesn't exist -{ -FileAppend, -( -; 0 is off, 1 is on -[USpec] -RACF=LF01234 -Email=LastnameFirstname@JohnDeere.com -Name=Firstname -DocFile=Select File -[Main] -Mansol=1 -MJDPaste=1 -CaseFormatter=1 -CFmail=0 -[Replacement] -JDProductNames=1 -GloVar=0 -[Language] -German=0 -), %ini% -Run Settings.ahk ; Runs the GUI for changing the settings, also accessible with Alt+Shift+\ (also easy way to restart this script) -} - -;------------------------------------------------------------------------------ -; Read the ini -;------------------------------------------------------------------------------ -; This is the part that reads the file to see what your settings are. Variables in the ini file are in all lowercase, variables here are CamelCase for more distinction - -; User Specific things: -racf := ini_get(ini, "USpec", "RACF") -email := ini_get(ini, "USpec", "Email") -name := ini_get(ini, "USpec", "Name") -docfile := ini_get(ini, "USpec", "DocFile") - -; General Settings -mansol := ini_get(ini, "Main", "Mansol") -supadmin := ini_get(ini, "Main", "Supadmin") -mjdpaste := ini_get(ini, "Main", "MJDPaste") -caseformatter := ini_get(ini, "Main", "CaseFormatter") - -; Replacement -jdpn := ini_get(ini, "Replacement", "JDProductNames") -glovar := ini_get(ini, "Replacement", "GloVar") - -; Language -ger := ini_get(ini, "Language", "German") ;------------------------------------------------------------------------------ ; Global Variables ;------------------------------------------------------------------------------ - -If (glovar = 1) +If (glovar) { - glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies - - glovarstart := "#SingleInstance force`n`n" - SetTimer, GloVar, 2000 ; Check every 2 seconds GloVar: - WinWaitNotActive, GloVar.ini ; So that we don't get any problems with the file on disk being out of date. I use VSCode with the "Save on lose focus" option on, YMMV - { - FileGetTime, gvModNew, %glovarini% - if !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. + glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies + glovarscript := A_Temp "\GloVar.ahk" ; Doesn't need to be anywhere useful as it doesn't contain any external references + ;FileGetTime, gvMod, %glovarini%, M + glovarstart := "#SingleInstance force`n#NoTrayIcon`nSendMode, Input`nFileEncoding, UTF-8`n" + If (WinActive("GloVar.ini")) ; Only run when the window isn't active, prevents accidential editing by this while the user is { - gvMod := gvModNew - FileDelete, glovar.ahk ; Start with a clean slate - FileAppend, %glovarstart%, glovar.ahk ; makes sure we only have one instance of the script running at a time - - RESection := "" ; Make sure that its clear - file := FileOpen(glovarini, "r") - Loop ; Read one line at a time + Return + } + FileGetTime, gvModNew, %glovarini%, M + If !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. + { + SetTimer, GloVar, Off + hotstrings := "" + glovar_array := ini_load(glovarini) + For sec in glovar_array { - Line := file.ReadLine() - RegExMatch(Line, "(?<=\[).*(?=\])", RESection) ; explained above - RegExMatch(Line, "^(?.*)=(?.*)", RE) ; Key = REKey, Value = REValue - - If !(RESection) ; If the RegEx doesn't find antything, its empty + For key, value in glovar_array[sec] { - If !(REValue) ; If there is no value for the key, skip it (Continue the loop at the next line) - { - Continue - } - If InStr(StoredSection, "Serial Numbers") ; If the section is "Serial Numbers", make everything uppercase + If (value) { - StringUpper, REValue, REValue ; Makes it uppercase - WinWaitNotActive, GloVar.ini ; Just to make sure + sec := StrReplace(sec, "§", " ") ; AHK can't handle spaces in nested array names, so they're substituted with § when entered into the array. This reverses that. + StringCaseSense, Off ; Make sure the capitalization doesn't matter + Switch sec { - ini_write(glovarini, REKey, REValue) - FileGetTime, gvMod, %glovarini% + Case "Serial Numbers": + StringUpper, value, value ; Makes it uppercase + ini_write(glovarini, key, value) + Case "Info": + If (key = "case") + { + StringUpper, value, value ; Makes it uppercase, just in case it was manually typed + value := Trim(value, "()") + ini_write(glovarini, key, value) ; Writes the properly formatted case number to glovar.ini + } + Case "Clear": ; Will clear the ini and save its and the documentation file's contents to a log + temp := FileOpen(docfile, "r") + doctemp := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "r") + initemp := temp.Read() + temp.Close() + initemp := RegExReplace(initemp, "i)(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info, case insensitive + CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" + temp := FileOpen(A_MyDocuments "/D3KLog.txt", "a") + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + temp.Write("`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + temp.Close() + temp := FileOpen("glovarsource", "r") + glovarsource := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "w") + temp.Write(glovarsource) ; Overwrite .ini for a clean slate + temp.Close() + temp := FileOpen(docfile, "w") ; Overwrites documentation for a clean slate + temp.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart) + script.Close() + Run, %A_AhkPath% %glovarscript% ; Just in case. Don't want an old version running. + ToolTip, Cleared + Sleep, 500 + ToolTip + FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer, GloVar, On + Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable + Case (RegExMatch(sec, "i)sdrbr(\d*)", m) ? sec : !sec): ; for cases with Stolen displays + If (m1) ; sometimes there are multiple stolen displays, this is to account for that. + { + writethis := "[Serial Numbers]" + Loop, % m1 + writethis .= "`ns" A_Index "=`nr" A_Index "=`ncc" A_Index "=`nv" A_Index "=" + writethis .= "`n[Info]" + Loop, % m1 + writethis .= "`ncase" A_Index "=" + } Else { + writethis := "[Serial Numbers]`ns=`nr=`ncc=`nv=`n[Info]`ncase=" glovar_array[sec, "case"] + } + temp := FileOpen(glovarini, "w") + temp.Write(writethis) + temp.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart) + script.Close() + SetTimer, GloVar, On + Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable } + hotstrings .= "`n:*:$" key "::" value } - If InStr(REKey, "case") ; If a key contains "case". Case numbers are all in the format "LETTERS-NUMBERS". - { - StringUpper, REValue, REValue ; Makes it uppercase - RegExMatch(REValue, "(?<=\().*(?=\))", REMatch) ; Match everything but the parenthesis. When the case numbers are shown they have parenthesis, and those are annoying. - If (REMatch) ; If there's anything there - { - WinWaitNotActive, GloVar.ini - { - ini_write(glovarini, REKey, REMatch) ; Writes the properly formatted case number to glovar.ini - FileGetTime, gvMod, %glovarini% - } - REValue := REMatch - } Else { - WinWaitNotActive, GloVar.ini - { - ini_write(glovarini, REKey, REValue) ; Writes the properly formatted case number to glovar.ini - FileGetTime, gvMod, %glovarini% - } - } - } - writethis := ":*:$" REKey "::" REValue "`n" ; Save the hotstring to a variable - FileAppend, %writethis%, glovar.ahk ; Write the variable to glovar.ahk } - If (RESection) ; If we have a section - { - StoredSection := RESection - If InStr(RESection, "clear") ; Will clear the ini and save its and the documentation file's contents to a log - { - FileRead, doctemp, %docfile% ; Read documentation file, set in settings - FileRead, initemp, %glovarini% ; Read the ini - initemp := RegExReplace(initemp, "(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info - CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" - writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable - FileAppend, % "`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath - FileAppend,, temptemp - FileCopy, glovarsource, %glovarini%, 1 ; Copies and replaces any text in glovar.ini with the template - FileCopy, temptemp, %docfile%, 1 ; These two this close together makes it look like they get cleared at the same time - FileDelete, temptemp - fileread, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - FileDelete, glovar.ahk ; THE CLEAN SLATE - FileAppend, %glovarstart%, glovar.ahk - Sleep, 500 - FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - If FileExist("glovar.ahk") - { - Run glovar.ahk - } - Return - } - } - } Until (file.AtEOF) + } + file := FileOpen(glovarini, "r") + temp := file.Read() + file.Close() + temp := RegExReplace(temp, "`am)^[\s\R]*") ; Get rid of empty lines + temp := RegExReplace(temp, "m)[ \t]+$") ; Get rid of extra space at the end of strings + temp := Trim(temp, " `t`r`n") ; Remove pesky newlines and extra space at the end + file := FileOpen(glovarini, "w") + file.Write(temp) file.Close() - FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - If FileExist("glovar.ahk") - { - Run glovar.ahk - ToolTip, glovar updated, 50, 50 - Sleep, 500 - ToolTip - } + script := FileOpen(glovarscript, "w") + script.Write(glovarstart hotstrings) + script.Close() + Run, %A_AhkPath% %glovarscript% + ToolTip, GloVars updated + Sleep, 500 + ToolTip + FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer, GloVar, On } - } Return } @@ -170,27 +130,43 @@ If (glovar = 1) ;------------------------------------------------------------------------------ ; Settings window ;------------------------------------------------------------------------------ - +D3K_Settings: !+\::Run Settings.ahk ; Alt+Shift+\ - -Mouse_Mover: - Run, msmv.ahk Return + +;------------------------------------------------------------------------------ +; Mouse Mover +;------------------------------------------------------------------------------ +Mouse_Mover: + If (msmv_active = True) + { + Run, %A_AhkPath% "msmv.ahk" "off" + msmv_active := False ; Have to do this cause AHK doesn't have a builtin function to detect if something is checked or not. + Menu, Tray, Uncheck, &Mouse Mover + + } + Else + { + Run, %A_AhkPath% "msmv.ahk" "on" + msmv_active := True + Menu, Tray, Check, &Mouse Mover + } +Return + + ;------------------------------------------------------------------------------ ; DTAC Solution Opener ;------------------------------------------------------------------------------ - -#If, mansol = "1" ; checks from the variable thats set from the .ini file +#If (mansol) ; checks from the variable thats set from the .sett_ini file !+S::Run Mansol_Opener.ahk ; Alt+Shift+S -#If ; these are to make sure one "if" doesn't influence the next accidentially +#If ;------------------------------------------------------------------------------ ; Case Formatter ;------------------------------------------------------------------------------ - -#If, CaseFormatter = "1" +#If (CaseFormatter) Pause::Run Case_Formatter.ahk ; The Pause|Break key #If @@ -198,35 +174,19 @@ Return ;------------------------------------------------------------------------------- ; Special Characters ;------------------------------------------------------------------------------- - -#If, ger = "1" -; scharfes s / Eszett / ß - !s::Send {U+00DF} ;Alt+S - -; ä - !a::Send {U+00E4} ;Alt+a - -; ö - !o::Send {U+00F6} ;Alt+o - -; ü - !u::Send {U+00FC} ;Alt+u - -; Ä - +!A::Send {U+00C4} ;Alt+A - -; Ö - +!O::Send {U+00D6} ;Alt+O - -; Ü - +!U::Send {U+00DC} ;Alt+U - +#If (ger) + !s::Send {U+00DF} ;Alt+S scharfes s / Eszett / ß + !a::Send {U+00E4} ;Alt+a ä + +!A::Send {U+00C4} ;Alt+A Ä + !o::Send {U+00F6} ;Alt+o ö + +!O::Send {U+00D6} ;Alt+O Ö + !u::Send {U+00FC} ;Alt+u ü + +!U::Send {U+00DC} ;Alt+U Ü #If ;------------------------------------------------------------------------------- ; Capitalise dates ;------------------------------------------------------------------------------- - ::monday::Monday ::tuesday::Tuesday ::wednesday::Wednesday @@ -234,12 +194,9 @@ Return ::friday::Friday ::saturday::Saturday ::sunday::Sunday - ::january::January ::february::February -; ::march::March ; Commented out because it matches the common word "march". ::april::April -; ::may::May ; Commented out because it matches the common word "may". ::june::June ::july::July ::august::August @@ -248,9 +205,8 @@ Return ::november::November ::december::December - ; German -#If, ger = "1" +#If (ger) ::montag::Montag ::dienstag::Dienstag ::mittwoch::Mittwoch @@ -270,85 +226,160 @@ Return #If - ;------------------------------------------------------------------------------ ; Copypastas ;------------------------------------------------------------------------------ -;STWA Applied -:*:]cms:: - Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} - Return +; STWA Applied +:*:]cmy:: + Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} +Return + +; STWA not available +:*:]cmn:: + Send STWA not available{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} +Return + +; Need info +:*:]cmr:: + Send STWA available{Enter 2}Status: Requesting information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}Verify information{Enter 2}SQL:{Enter} +Return + +:*:]sdrbr:: + glovar_array := ini_load(glovarini) + For sec in glovar_array + { + For key, value in glovar_array[sec] + { + If (value) + { + stln_%key% := value + } + } + } + If (glovar_array["Info"].Count() > 1) + { + Send Stolen Display Replacement Basics Requests{Tab} + Send Received some requests for replacement Basics for Stolen displays @ + } Else { + Send %stln_case%{Tab} + Send Received a request for replacement Basics for a Stolen display @ + } + Sleep, 1000 + Send Stellar + Sleep, 1500 + Send {Down}{Tab}:{Enter 2} + Sleep, 1000 + Send {ShiftDown}{Tab 2}{ShiftUp} + Sleep, 1000 + Send {Right 17} + Sleep, 1000 + Send {Enter} + Sleep, 1000 + Send {Right} + Send {Enter} + Sleep, 1000 + If (glovar_array["Info"].Count() > 1) + { + Loop, % glovar_array["Info"].Count() { + If (A_Index < glovar_array["Info"].Count()) + { + table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?{Tab 2}" + } Else { + table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?" + } ; That way it doesn't put the extra line at the very end + Send %table% + } + } Else { + Send Case{Tab}%stln_case%{Tab}Stolen{Tab}%stln_s%{Tab}Replacement{Tab}%stln_r%{Enter}%stln_cc%{Tab}Machine PIN{Tab}%stln_v%{Tab}Model, Year{Tab 2}Should it qualify?{Up 2}{Tab} + } +Return + +; Transferring to DTAC +:*:]DTAC:: + Send The ISG Global Support Center has determined that this case is hardware related`; therefore, this case is being transferred from the Global Support Center to the ISG DTAC group. A DTAC technician will now work this case via the DTAC system and provide a recommendation in the case Text if more information is needed or if a solution has been found. Please continue to update or check on the progress of this case by using the DTAC system Case Text section moving forward. +Return + +; Transferring to Tier2 +:*:]rrt:: + Send This case was unable to be resolved and has been transferred to another team. Our Tier 2 team is investigating the issue to find a short-term resolution. We will update you as soon as we have a recommendation. +Return + +; Update after 5 business days +:*:]upd:: + Send A short-term resolution still has not been identified. We are requesting an immediate update on this case from our Tier 2 team. We will contact you as soon as we have a status update. +Return + +; Requesting info +:*:]req:: + Send A request has been made for additional information in this case. Please provide the following information as soon as possible so this case can be resolved. +Return + +; Dealer defect +:*:]ddefect:: + Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please have your field team contact the appropriate Product Support Representative. +Return + +; Customer defect +:*:]cdefect:: + Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please contact your preferred dealer and the field team can contact the appropriate Product Support Representative. +Return + +; Workbasket shortcuts, place mouse over Transfer button before typing +:*:]pd:: +Send PCDSC +Send {Click} +Return + +:*:]pr:: +Send PCRRT +Send {Click} +Return + +:*:]p2:: +Send PCTIER2 +Send {Click} +Return ;------------------------------------------------------------------------------ ; Email ;------------------------------------------------------------------------------ - -; Regular :*:]email:: Send Hello,{Enter 2}{Space 3} - Return - +Return ; German -#If, ger = "1" - -; Regular +#If (ger) :*:[email:: Send Hallo,{Enter 2}{Space 3} - Return +Return #If - ;------------------------------------------------------------------------------ ; Profile email paste ;------------------------------------------------------------------------------ ; So when editing Profiles, it won't let you paste in the email field. We don't like that. Make sure to let go of all keys immediatley after pressing this - -#If, mjdpaste = "1" - #v:: - sleep, 750 - Send %clipboard% - sleep, 500 - send # ; to make sure the start menu isn't open for some reason - return +#If (mjdpaste) +#v:: + sleep, 750 + SendInput %clipboard% + sleep, 500 + send # ; to make sure the start menu isn't open for some reason +Return #If - - ;------------------------------------------------------------------------------ ; Common Terms autocorrect and replacement ;------------------------------------------------------------------------------ - -#If, not(racf = "LF01234") ; So that it doesn't put the fake RACF from the default ini file - :*:]me:: - Send, %racf% - return - - :*:[me:: - Send, %racf% - return -#If - -#If, not(email = "LastnameFirstname@JohnDeere.com") ; Same as above - :*:@me:: - Send, %email% - Return -#If - ; JD Names -#If, jdpn = "1" - +#If (jdpn) :*:[xx::XXXXXXXXXXXXX ; I'm not gonna try and find the right amount of X's to appease the CCMS demons :*:]xx::XXXXXXXXXXXXX - ; English :*:]at::AutoTrac + :*:]ba::Basics & AutoTrac :*:]sf::StarFire - :*:]jdld::JDLink Dashboard - :*:]jdlc::JDLink Connectivity - :*:]jdls::JDLink Subscription - :*:]jdll::JDLink + :*:]jdl::JDLink :*:]jdp::JDParts :*:]mjd::MyJohnDeere :*:]opsc::Operations Center @@ -366,7 +397,6 @@ Return :*:]bin::Virtual Inventory :*:]warrep::Warranty Reports :*:]tcsm::Territory Customer Support Manager - :*:]macrep::Machine Reports :*:]jdsm::John Deere Software Manager :*:]jddm::John Deere Data Manager :*:]serva::Service Advisor @@ -390,7 +420,7 @@ Return :*:mtg::MTG ::wdt::WDT ::itc::iTC - :*:vin::VIN + :*:vin::Machine PIN ; Not actually vehicles, so they don't have VINs ::gs2::GS2 ::gs3::GS3 ::sf1::SF1 @@ -407,15 +437,11 @@ Return ; German -#If, ger = "1" +#If (ger) :*:[at::AutoTrac + :*:[ba::Basics & AutoTrac :*:[sf::StarFire - :*:[jdlw::JDLink Web - :*:[jdld::JDLink Dashboard - :*:[jdl2::JDLink Dashboard 2.0 - :*:[jdlc::JDLink Connectivity - :*:[jdls::JDLink Abonnement - :*:[jdll::JDLink + :*:[jdl::JDLink :*:[jdp::JDParts :*:[mjd::MyJohnDeere :*:[opsc::Einsatzzentrale @@ -434,7 +460,6 @@ Return :*:[warrep::Warranty Reports :*:[tp::TouchPoint :*:[tcsm::Technischer Bezirksleiter - :*:[macrep::Machine Reports :*:[jdsm::John Deere Software Manager :*:[jddm::John Deere Data Manager :*:[serva::Service Advisor @@ -444,23 +469,35 @@ Return #If - ;------------------------------------------------------------------------------ ; QoL Improvements ;------------------------------------------------------------------------------ +:*:]me:: + Send, % Format("{:U}", A_UserName) +Return + +:*:[me:: + Send, % Format("{:U}", A_UserName) +Return + +#If !(email = "LastnameFirstname@JohnDeere.com") + :*:@me:: + Send, %email% +Return +#If #j:: ; Open the downloads folder on Win+J -Run, C:\Users\%racf%\Downloads + Run, C:\Users\%A_UserName%\Downloads Return -#w:: ; Open My Documents folder on Win+W -Run, C:\Users\%racf%\Documents -Return - -:*:[now:: ; Send the current time/date in ISO8601 format +:*:[now:: :*:]now:: - d_t := GetDateTime("ISO8601") - SendInput, %d_t% + SendInput, % GetDateTime("ISO8601") ; Send the current time/date in ISO8601 format +Return + +:*:[today:: +:*:]today:: + SendInput, % GetDateTime("date") ; Send the current date in ISO8601 format Return :*:[deg::{ASC 248} @@ -471,25 +508,9 @@ Return :*:[shrug::¯\_(ツ)_/¯ :*:]shrug::¯\_(ツ)_/¯ -asciiart(art) -{ - For index, value in art - { - SendInput, %value%{ShiftDown}{Enter}{ShiftUp} - } - Return -} - -:*:]yee:: - asc_yee := ["░░░░░░░░░░░░░▄███▄▄▄░░░░░░░","░░░░░░░░░▄▄▄██▀▀▀▀███▄░░░░░","░░░░░░░▄▀▀░░░░░░░░░░░▀█░░░░","░░░░▄▄▀░░░░░░░░░░░░░░░▀█░░░","░░░█░░░░░▀▄░░▄▀░░░░░░░░█░░░","░░░▐██▄░░▀▄▀▀▄▀░░▄██▀░▐▌░░░","░░░█▀█░▀░░░▀▀░░░▀░█▀░░▐▌░░░","░░░█░░▀▐░░░░░░░░▌▀░░░░░█░░░","░░░█░░░░░░░░░░░░░░░░░░░█░░░","░░░░█░░▀▄░░░░▄▀░░░░░░░░█░░░","░░░░█░░░░░░░░░░░▄▄░░░░█░░░░","░░░░░█▀██▀▀▀▀██▀░░░░░░█░░░░","░░░░░█░░▀████▀░░░░░░░█░░░░░","░░░░░░█░░░░░░░░░░░░▄█░░░░░░","░░░░░░░██░░░░░█▄▄▀▀░█░░░░░░","░░░░░░░░▀▀█▀▀▀▀░░░░░░█░░░░░", "yee ░░░░░█░░░░░░░░░░░░█░░░░"] - asciiart(asc_yee) -Return - -:*:]sunglass:: - sunglass := ["▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄", "█░░░░░░░░▀█▄▀▄▀██████░▀█▄▀▄▀██████░", "░░░░░░░░░░░▀█▄█▄███▀░░░▀██▄█▄███▀░"] - asciiart(sunglass) -Return docs: run https://www.autohotkey.com/docs/AutoHotkey.htm -Return \ No newline at end of file +Return + +F19:: Run D3K.ahk \ No newline at end of file -- 2.54.0 From e10c04c253a4913433db365e4cfa7801a3a88385 Mon Sep 17 00:00:00 2001 From: David Daily Date: Mon, 13 Feb 2023 16:20:22 -0600 Subject: [PATCH 15/34] minor updates --- func.ahk | 632 ++++++++++++--------------------------------------- glovarsource | 10 +- msmv.ahk | 2 +- 3 files changed, 153 insertions(+), 491 deletions(-) diff --git a/func.ahk b/func.ahk index 4058edd..cc8d08d 100644 --- a/func.ahk +++ b/func.ahk @@ -1,501 +1,169 @@ -#Include, func.ahk +#SingleInstance force ; Only one instance at a time +SendMode, Input +FileEncoding, UTF-8 ; Makes sure the special characters dont break stuff +SetWorkingDir, %A_MyDocuments%\D3K ; Make sure we can find the .ahks linked below +SetTitleMatchMode, 2 + +d3k_version := 3 ; The current version + +GetDateTime(lang) +{ + FormatStr := "yyyy-MM-dd" ; The Date + FormatTime, DateStr, %A_NowUTC%, %FormatStr% ; format it to make it look like the Date we want + FormatStr := "H:mm'Z'" ; The time + FormatTime, TimeStr, %A_NowUTC%, %FormatStr% ; Format the string to be better + if (lang = "en") + { + Return DateStr " at " TimeStr + } + + if (lang = "de") + { + Return DateStr " um " TimeStr + } + + if (lang = "ISO8601") + { + Return DateStr "T" TimeStr + } + + if (lang = "date") + { + Return DateStr + } +} + +GetInfo(xID) +{ + if (xID) + { + File := FileOpen(A_MyDocuments "\emails.csv", "r") + Loop + { + Line := File.ReadLine() + Array := StrSplit(Line,",") ; split the line at its separating commas to get separate "columns" AKA elements + if InStr(Array[1], xID) ; if at the specified element (1) the specified content (dealers xID) has been found + { + Test := {xid: Array[1], email: Array[2], name: Array[3], user: Array[4], org: Array[5]} ; Return the array so we can do {variable}.email and so on + File.Close() ; Close the file + Return Test ; Return the array with the deets that we found + } + } Until (File.AtEOF) + File.Close() + Return false + } + if !(xID) + { + Return false + } +} + +;------------------------------------------------------------------------------ +; INI Manipulation that supports UTF-8 +;------------------------------------------------------------------------------ + +ini_load(location) +{ + out := {} + File := FileOpen(location, "r") + cleaner := File.Read() + File.Close() + cleaner := RegExReplace(cleaner, "`am)^[\s\R]*") ; Remove empty lines + cleaner := RegExReplace(cleaner, "m)[ \t]+$") ; Get rid of extra space at the end of values (NEEDS FIXED) + File := FileOpen(location, "w") + File.Write(cleaner) + File.Close() + File := FileOpen(location, "r") + Loop + { + Line := File.ReadLine() + RegExMatch(Line, "(?
(?<=\[).*(?=\]))|(?.*)=(?.*)", r) ; Key = rKey, Value = rValue, Section = rSection + If (rSection) + { + rSection := Trim(rSection, " `t`r`n") ; Remove pesky newlines and extra space + rSection := StrReplace(rSection, " ", "§") ; AHK can't handle spaces in nested array names, so they're substituted with § + out[rSection]:={} + c_Section := rSection + } Else + { + rKey := Trim(rKey, " `t`r`n") + rValue := Trim(rValue, " `t`r`n") + out[c_Section, rKey] := rValue + } + } Until (File.AtEOF) + File.Close() + Return out +} + + +ini_write(location, inKey, inValue) ; Don't need to specify section because you can only have one hotstring anyway +{ + Critical, On + file := FileOpen(location, "r") + temp := file.Read() + file.Close() + inKey := "(?<=" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key + temp := RegExReplace(temp, inKey, inValue) + ; msgbox, % temp "`n`nRegex:`t" inKey "`nReplacing match with:`t" inValue + file := FileOpen(location, "w") + file.Write(temp) + file.Close() +} -Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard -Menu, Tray, Add, Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse -Menu, Tray, Add, %A_AhkVersion%, docs ;------------------------------------------------------------------------------ ; Make sure the settings file exists, if not, create it ;------------------------------------------------------------------------------ +sett_ini := A_MyDocuments "\D3Ksettings.ini" ; Where the settings ini is -If !FileExist(ini) ; Check if the ini doesn't exist +If !FileExist(sett_ini) ; Check if the sett_ini doesn't exist { -FileAppend, -( -; 0 is off, 1 is on -[USpec] -RACF=LF01234 -Email=LastnameFirstname@JohnDeere.com -Name=Firstname -DocFile=Select File -[Main] -Mansol=1 -MJDPaste=1 -CaseFormatter=1 -CFmail=0 -[Replacement] -JDProductNames=1 -GloVar=0 -[Language] -German=0 -), %ini% -Run Settings.ahk ; Runs the GUI for changing the settings, also accessible with Alt+Shift+\ (also easy way to restart this script) + file := FileOpen(sett_ini, "w") + writethis := " + ( LTrim + [USpec] + Email=LastnameFirstname@JohnDeere.com + Name=Firstname + DocFile=Select File + [Main] + Mansol=1 + MJDPaste=1 + CaseFormatter=1 + CFmail=0 + [Replacement] + JDProductNames=1 + GloVar=0 + [Language] + German=0 + )" + file.Write(writethis) + file.Close() + Run Settings.ahk ; Runs the GUI for changing the settings, accessible with Alt+Shift+\ (also easy way to restart this script) } ;------------------------------------------------------------------------------ -; Read the ini +; Read the sett_ini ;------------------------------------------------------------------------------ -; This is the part that reads the file to see what your settings are. Variables in the ini file are in all lowercase, variables here are CamelCase for more distinction +; This is the part that reads the file to see what your settings are. Variables in the sett_ini file are in all CamelCase, variables here are lowercase for more distinction + +settings := {} +settings := ini_load(sett_ini) ; User Specific things: -racf := ini_get(ini, "USpec", "RACF") -email := ini_get(ini, "USpec", "Email") -name := ini_get(ini, "USpec", "Name") -docfile := ini_get(ini, "USpec", "DocFile") +email := settings["USpec", "Email"] +name := settings["USpec", "Name"] +docfile := settings["USpec", "DocFile"] ; General Settings -mansol := ini_get(ini, "Main", "Mansol") -supadmin := ini_get(ini, "Main", "Supadmin") -mjdpaste := ini_get(ini, "Main", "MJDPaste") -caseformatter := ini_get(ini, "Main", "CaseFormatter") +mansol := settings["Main", "Mansol"] +supadmin := settings["Main", "Supadmin"] +mjdpaste := settings["Main", "MJDPaste"] +caseformatter := settings["Main", "CaseFormatter"] +cfmail := settings["Main", "CFmail"] ; Replacement -jdpn := ini_get(ini, "Replacement", "JDProductNames") -glovar := ini_get(ini, "Replacement", "GloVar") +jdpn := settings["Replacement", "JDProductNames"] +glovar := settings["Replacement", "GloVar"] ; Language -ger := ini_get(ini, "Language", "German") - -;------------------------------------------------------------------------------ -; Global Variables -;------------------------------------------------------------------------------ - -If (glovar = 1) -{ - glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies - - glovarstart := "#SingleInstance force`n`n" - - SetTimer, GloVar, 2000 ; Check every 2 seconds - - GloVar: - WinWaitNotActive, GloVar.ini ; So that we don't get any problems with the file on disk being out of date. I use VSCode with the "Save on lose focus" option on, YMMV - { - FileGetTime, gvModNew, %glovarini% - if !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. - { - gvMod := gvModNew - FileDelete, glovar.ahk ; Start with a clean slate - FileAppend, %glovarstart%, glovar.ahk ; makes sure we only have one instance of the script running at a time - - RESection := "" ; Make sure that its clear - file := FileOpen(glovarini, "r") - Loop ; Read one line at a time - { - Line := file.ReadLine() - RegExMatch(Line, "(?<=\[).*(?=\])", RESection) ; explained above - RegExMatch(Line, "^(?.*)=(?.*)", RE) ; Key = REKey, Value = REValue - - If !(RESection) ; If the RegEx doesn't find antything, its empty - { - If !(REValue) ; If there is no value for the key, skip it (Continue the loop at the next line) - { - Continue - } - If InStr(StoredSection, "Serial Numbers") ; If the section is "Serial Numbers", make everything uppercase - { - StringUpper, REValue, REValue ; Makes it uppercase - WinWaitNotActive, GloVar.ini ; Just to make sure - { - ini_write(glovarini, REKey, REValue) - FileGetTime, gvMod, %glovarini% - } - } - If InStr(REKey, "case") ; If a key contains "case". Case numbers are all in the format "LETTERS-NUMBERS". - { - StringUpper, REValue, REValue ; Makes it uppercase - RegExMatch(REValue, "(?<=\().*(?=\))", REMatch) ; Match everything but the parenthesis. When the case numbers are shown they have parenthesis, and those are annoying. - If (REMatch) ; If there's anything there - { - WinWaitNotActive, GloVar.ini - { - ini_write(glovarini, REKey, REMatch) ; Writes the properly formatted case number to glovar.ini - FileGetTime, gvMod, %glovarini% - } - REValue := REMatch - } Else { - WinWaitNotActive, GloVar.ini - { - ini_write(glovarini, REKey, REValue) ; Writes the properly formatted case number to glovar.ini - FileGetTime, gvMod, %glovarini% - } - } - } - writethis := ":*:$" REKey "::" REValue "`n" ; Save the hotstring to a variable - FileAppend, %writethis%, glovar.ahk ; Write the variable to glovar.ahk - } - If (RESection) ; If we have a section - { - StoredSection := RESection - If InStr(RESection, "clear") ; Will clear the ini and save its and the documentation file's contents to a log - { - FileRead, doctemp, %docfile% ; Read documentation file, set in settings - FileRead, initemp, %glovarini% ; Read the ini - initemp := RegExReplace(initemp, "(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info - CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" - writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable - FileAppend, % "`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", %A_MyDocuments%/D3KLog.txt ; Write a few new lines , the content, and a line underneath - FileAppend,, temptemp - FileCopy, glovarsource, %glovarini%, 1 ; Copies and replaces any text in glovar.ini with the template - FileCopy, temptemp, %docfile%, 1 ; These two this close together makes it look like they get cleared at the same time - FileDelete, temptemp - fileread, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - FileDelete, glovar.ahk ; THE CLEAN SLATE - FileAppend, %glovarstart%, glovar.ahk - Sleep, 500 - FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - If FileExist("glovar.ahk") - { - Run glovar.ahk - } - Return - } - } - } Until (file.AtEOF) - file.Close() - FileGetTime, gvMod, %glovarini% ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - If FileExist("glovar.ahk") - { - Run glovar.ahk - ToolTip, glovar updated, 50, 50 - Sleep, 500 - ToolTip - } - } - } - Return -} - - -;------------------------------------------------------------------------------ -; Settings window -;------------------------------------------------------------------------------ - -!+\::Run Settings.ahk ; Alt+Shift+\ - -Mouse_Mover: - Run, msmv.ahk -Return - -;------------------------------------------------------------------------------ -; DTAC Solution Opener -;------------------------------------------------------------------------------ - -#If, mansol = "1" ; checks from the variable thats set from the .ini file - !+S::Run Mansol_Opener.ahk ; Alt+Shift+S -#If ; these are to make sure one "if" doesn't influence the next accidentially - - -;------------------------------------------------------------------------------ -; Case Formatter -;------------------------------------------------------------------------------ - -#If, CaseFormatter = "1" - Pause::Run Case_Formatter.ahk ; The Pause|Break key -#If - - -;------------------------------------------------------------------------------- -; Special Characters -;------------------------------------------------------------------------------- - -#If, ger = "1" -; scharfes s / Eszett / ß - !s::Send {U+00DF} ;Alt+S - -; ä - !a::Send {U+00E4} ;Alt+a - -; ö - !o::Send {U+00F6} ;Alt+o - -; ü - !u::Send {U+00FC} ;Alt+u - -; Ä - +!A::Send {U+00C4} ;Alt+A - -; Ö - +!O::Send {U+00D6} ;Alt+O - -; Ü - +!U::Send {U+00DC} ;Alt+U - -#If - -;------------------------------------------------------------------------------- -; Capitalise dates -;------------------------------------------------------------------------------- - -::monday::Monday -::tuesday::Tuesday -::wednesday::Wednesday -::thursday::Thursday -::friday::Friday -::saturday::Saturday -::sunday::Sunday - -::january::January -::february::February -; ::march::March ; Commented out because it matches the common word "march". -::april::April -; ::may::May ; Commented out because it matches the common word "may". -::june::June -::july::July -::august::August -::september::September -::october::October -::november::November -::december::December - - -; German -#If, ger = "1" - ::montag::Montag - ::dienstag::Dienstag - ::mittwoch::Mittwoch - ::donnerstag::Donnerstag - ::freitag:: Freitag - ::samstag::Samstag - ::sonntag::Sonntag - - ::januar::Januar - ::februar::Februar - ::märz::März - ::mai::Mai - ::juni::Juni - ::juli::Juli - ::oktober::Oktober - ::dezebmer::Dezember -#If - - - -;------------------------------------------------------------------------------ -; Copypastas -;------------------------------------------------------------------------------ -;STWA Applied -:*:]cms:: - Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments:{Space}{Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} - Return - -;------------------------------------------------------------------------------ -; Email -;------------------------------------------------------------------------------ - -; Regular -:*:]email:: - Send Hello,{Enter 2}{Space 3} - Return - - -; German -#If, ger = "1" - -; Regular -:*:[email:: - Send Hallo,{Enter 2}{Space 3} - Return -#If - - - -;------------------------------------------------------------------------------ -; Profile email paste -;------------------------------------------------------------------------------ -; So when editing Profiles, it won't let you paste in the email field. We don't like that. Make sure to let go of all keys immediatley after pressing this - -#If, mjdpaste = "1" - #v:: - sleep, 750 - Send %clipboard% - sleep, 500 - send # ; to make sure the start menu isn't open for some reason - return -#If - - - -;------------------------------------------------------------------------------ -; Common Terms autocorrect and replacement -;------------------------------------------------------------------------------ - -#If, not(racf = "LF01234") ; So that it doesn't put the fake RACF from the default ini file - :*:]me:: - Send, %racf% - return - - :*:[me:: - Send, %racf% - return -#If - -#If, not(email = "LastnameFirstname@JohnDeere.com") ; Same as above - :*:@me:: - Send, %email% - Return -#If - -; JD Names -#If, jdpn = "1" - - :*:[xx::XXXXXXXXXXXXX ; I'm not gonna try and find the right amount of X's to appease the CCMS demons - :*:]xx::XXXXXXXXXXXXX - -; English - :*:]at::AutoTrac - :*:]sf::StarFire - :*:]jdld::JDLink Dashboard - :*:]jdlc::JDLink Connectivity - :*:]jdls::JDLink Subscription - :*:]jdll::JDLink - :*:]jdp::JDParts - :*:]mjd::MyJohnDeere - :*:]opsc::Operations Center - :*:]seccon::Section Control - :*:]gs::GreenStar - :*:]cc::CommandCenter - :*:]fc::Field Connect - :*:]rs::RowSense - :*:]sub::subscription - :*:]ss::Stellar Support - :*:]tman::Technical Manual - :*:]oman::Operator's Manual - :*:]hl3::HarvestLab 3000 - :*:]hlo::Original HarvestLab - :*:]bin::Virtual Inventory - :*:]warrep::Warranty Reports - :*:]tcsm::Territory Customer Support Manager - :*:]macrep::Machine Reports - :*:]jdsm::John Deere Software Manager - :*:]jddm::John Deere Data Manager - :*:]serva::Service Advisor - :*:]muc::Master Unlock Code - :*:]asmn::Asset Manager - :*:]bsm::Base Station Manager - - - ::rowsense::RowSense - :*:comar::COMAR - ::mrtk::mRTK - ::rda::RDA - ::rtk::RTK - ::autotrac::AutoTrac - :*:ccms::CCMS - :*:dtac::DTAC - ::tcsm::TCSM - ::itec::iTEC Pro - ::ssu::SSU - ::atu::ATU - :*:mtg::MTG - ::wdt::WDT - ::itc::iTC - :*:vin::Machine PIN ; Not actually vehicles, so they don't have VINs - ::gs2::GS2 - ::gs3::GS3 - ::sf1::SF1 - ::sf2::SF2 - ::sf3::SF3 - ::sf4::SF4 - ::xid::xID - ::pmcalc::PMCalc - ::vat::VAT - :*:racf::RACF - ::igrade::iGrade - :*:JDCP::JDCP - :*:ISOBUS::ISOBUS - - -; German -#If, ger = "1" - :*:[at::AutoTrac - :*:[sf::StarFire - :*:[jdlw::JDLink Web - :*:[jdld::JDLink Dashboard - :*:[jdl2::JDLink Dashboard 2.0 - :*:[jdlc::JDLink Connectivity - :*:[jdls::JDLink Abonnement - :*:[jdll::JDLink - :*:[jdp::JDParts - :*:[mjd::MyJohnDeere - :*:[opsc::Einsatzzentrale - :*:[seccon::Teilbreitensteuerung - :*:[gs::GreenStar - :*:[cc::CommandCenter - :*:[fc::Field Connect - :*:[rs::RowSense - :*:[sub::Abonnement - :*:[ss::Stellar Support - :*:[tman::Technische Betriebsanleitung - :*:[oman::Betriebsanleitung - :*:[hl3::HarvestLab 3000 - :*:[hlo::Originales HarvestLab - :*:[bin::Virtuellen Bestand - :*:[warrep::Warranty Reports - :*:[tp::TouchPoint - :*:[tcsm::Technischer Bezirksleiter - :*:[macrep::Machine Reports - :*:[jdsm::John Deere Software Manager - :*:[jddm::John Deere Data Manager - :*:[serva::Service Advisor - :*:[muc::Master Unlock Code - :*:[asmn::Asset Manager - :*:[bsm::Base Station Manager -#If - - - -;------------------------------------------------------------------------------ -; QoL Improvements -;------------------------------------------------------------------------------ - -#j:: ; Open the downloads folder on Win+J -Run, C:\Users\%racf%\Downloads -Return - -#w:: ; Open My Documents folder on Win+W -Run, C:\Users\%racf%\Documents -Return - -:*:[now:: ; Send the current time/date in ISO8601 format -:*:]now:: - d_t := GetDateTime("ISO8601") - SendInput, %d_t% -Return - -:*:[today:: ; Send the current date in ISO8601 format -:*:]today:: - d_t := GetDateTime("date") - SendInput, %d_t% -Return - -:*:[deg::{ASC 248} -:*:]deg::{ASC 248} -:*:[eq::{ASC 247} -:*:]eq::{ASC 247} - -:*:[shrug::¯\_(ツ)_/¯ -:*:]shrug::¯\_(ツ)_/¯ - -asciiart(art) -{ - For index, value in art - { - SendInput, %value%{ShiftDown}{Enter}{ShiftUp} - } - Return -} - -:*:]yee:: - art := ["░░░░░░░░░░░░░▄███▄▄▄░░░░░░░","░░░░░░░░░▄▄▄██▀▀▀▀███▄░░░░░","░░░░░░░▄▀▀░░░░░░░░░░░▀█░░░░","░░░░▄▄▀░░░░░░░░░░░░░░░▀█░░░","░░░█░░░░░▀▄░░▄▀░░░░░░░░█░░░","░░░▐██▄░░▀▄▀▀▄▀░░▄██▀░▐▌░░░","░░░█▀█░▀░░░▀▀░░░▀░█▀░░▐▌░░░","░░░█░░▀▐░░░░░░░░▌▀░░░░░█░░░","░░░█░░░░░░░░░░░░░░░░░░░█░░░","░░░░█░░▀▄░░░░▄▀░░░░░░░░█░░░","░░░░█░░░░░░░░░░░▄▄░░░░█░░░░","░░░░░█▀██▀▀▀▀██▀░░░░░░█░░░░","░░░░░█░░▀████▀░░░░░░░█░░░░░","░░░░░░█░░░░░░░░░░░░▄█░░░░░░","░░░░░░░██░░░░░█▄▄▀▀░█░░░░░░","░░░░░░░░▀▀█▀▀▀▀░░░░░░█░░░░░", "yee ░░░░░█░░░░░░░░░░░░█░░░░"] - asciiart(art) -Return - -:*:]glass:: - art := ["▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄", "█░░░░░░░░▀█▄▀▄▀██████░▀█▄▀▄▀██████░", "░░░░░░░░░░░▀█▄█▄███▀░░░▀██▄█▄███▀░"] - asciiart(art) -Return - -docs: - run https://www.autohotkey.com/docs/AutoHotkey.htm -Return \ No newline at end of file +ger := settings["Language", "German"] \ No newline at end of file diff --git a/glovarsource b/glovarsource index e3902ec..ef1fddb 100644 --- a/glovarsource +++ b/glovarsource @@ -1,11 +1,5 @@ [Serial Numbers] 1= -ch= -2= -MTG= -VIN= -[Operations Center] -usr= -org= +cm= [Info] -ccms= +case= \ No newline at end of file diff --git a/msmv.ahk b/msmv.ahk index b95b9dc..1e3e33e 100644 --- a/msmv.ahk +++ b/msmv.ahk @@ -1,7 +1,7 @@ #SingleInstance, force CoordMode, Mouse, Screen -waittime := 180000 +waittime := 160000 Switch A_Args[1] { -- 2.54.0 From d02ef808f865eaec07626e699912c87a13cbbec0 Mon Sep 17 00:00:00 2001 From: David Daily Date: Mon, 13 Feb 2023 16:21:14 -0600 Subject: [PATCH 16/34] update to new function --- Settings.ahk | 81 +++++++++++++++++----------------------------------- 1 file changed, 26 insertions(+), 55 deletions(-) diff --git a/Settings.ahk b/Settings.ahk index 070d3b5..af6296f 100644 --- a/Settings.ahk +++ b/Settings.ahk @@ -1,44 +1,17 @@ #Include, func.ahk +#NoTrayIcon Menu, Tray, Icon, shell32.dll, 283 -;------------------------------------------------------------------------------ -; Read ini -;------------------------------------------------------------------------------ -/* -This is the part that reads the file to see what your settings are. Variables in the ini file are in CamelCase, variables here are lowercase for more distinction -*/ - -; User Specific things: -racf := ini_get(ini, "USpec", "RACF") -email := ini_get(ini, "USpec", "Email") -docfile := ini_get(ini, "USpec", "DocFile") - -; General Settings -mansol := ini_get(ini, "Main", "Mansol") -mjdpaste := ini_get(ini, "Main", "MJDPaste") -caseformatter := ini_get(ini, "Main", "CaseFormatter") -cfmail := ini_get(ini, "Main", "CFmail") - -; Replacement -jdpn := ini_get(ini, "Replacement", "JDProductNames") -glovar := ini_get(ini, "Replacement", "GloVar") - -; Language -ger := ini_get(ini, "Language", "German") - ;------------------------------------------------------------------------------ ; Create GUI ;------------------------------------------------------------------------------ Gui, -MaximizeBox -MinimizeBox ; Remove the max+min buttons -Gui, Add, GroupBox, x8 y2 w67 h37, RACF -Gui, Add, Edit, x12 y15 w60 h20 vformRACF gRACF, %RACF% +Gui, Add, GroupBox, x8 y2 w193 h37, First Name +Gui, Add, Edit, x12 y15 w185 h20 vformName gName, %name% Gui, Add, GroupBox, x8 y40 w207 h37, Email Address -Gui, Add, Edit, x12 y53 w200 h20 vformEmail gEmail, %Email% - -Gui, Add, GroupBox, x77 y2 w207 h37, Documentation File -Gui, Add, Text, x81 y19 w200 h20 gDocFile, %docfile% +Gui, Add, Edit, x12 y53 w200 h20 vformEmail gEmail, %email% Gui, Add, GroupBox, x8 y83 w107 h130, Main Gui, Add, CheckBox, x12 y95 w100 h30 vformMansol Checked%mansol% gMansol, ManSol @@ -46,25 +19,28 @@ Gui, Add, CheckBox, x12 y125 w100 h30 vformMJDPaste Checked%mjdpaste% gMJDPaste, Gui, Add, CheckBox, x12 y155 w100 h30 vformCaseFormatter Checked%caseformatter% gCaseFormatter, Case Formatter Gui, Add, CheckBox, x25 y178 w75 h30 vformCFmail Checked%cfmail% gCFmail, Email option GuiControl, show%caseformatter%, formCFmail ; only shows the check box for emails if the Case Formatter box is checked +Gui, Add, GroupBox, x8 y215 w277 h50 vformDocFile, Documentation File +Gui, Add, Text, x15 y231 w260 h30 vformDocFile2 gDocFile, %docfile% Gui, Add, GroupBox, x128 y83 w157 h75, Text Replacement Gui, Add, CheckBox, x132 y95 w150 h30 vformJdpn Checked%jdpn% gJdpn, JD Product Names Gui, Add, CheckBox, x132 y125 w150 h30 vformGlovar Checked%glovar% gGlovar, Global Variables Gui, Add, CheckBox, x132 y155 w100 h30 vformGer Checked%ger% gGer, DE ([ as prefix) -Gui, Add, Link, x132 y190 w150 h23 gHelp, Click here for help (v%d3k_version%) +Gui, Add, Link, x132 y190 w150 h26 gHelp, Click here for help`n%A_AhkVersion% -Gui, Show, h225 w295, David 3000 Settings +Gui, Show, h273 w295, D3K version %d3k_version% Return ;------------------------------------------------------------------------------ ; Edit ini ;------------------------------------------------------------------------------ + /* Default ini, sections are in []: (0 is off, 1 is on) [USpec] -RACF=LF01234 Email=LastnameFirstname@JohnDeere.com +Name=Firstname DocFile=Select File [Main] Mansol=1 @@ -77,69 +53,64 @@ GloVar=0 [Language] German=0 -format for below: -Button G-label (executes when clicked): - Submit the gui so that it can change and don't hide it - write the state of the check box (a 0 for unchecked, 1 for checked), to the file at %ini%, section with this name, line with this name */ -RACF: +Name: Gui, Submit, NoHide - ini_write(ini, "RACF", formRACF) + ini_write(sett_ini, "Name", formName) Return Email: Gui, Submit, NoHide - ini_write(ini, "Email", formEmail) + ini_write(sett_ini, "Email", formEmail) Return DocFile: Gui, Submit - FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.txt; *.doc) - if SelectedFile = + FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.txt) + if !(SelectedFile) MsgBox, You have not selected a file, this will break some things. else - ini_write(ini, "DocFile", SelectedFile) - docfile := ini_get(ini, "USpec", "DocFile") - Gui, Show, h225 w295, David 3000 Settings + ini_write(sett_ini, "DocFile", SelectedFile) + Run, Settings.ahk Return Mansol: Gui, Submit, NoHide - ini_write(ini, "Mansol", formMansol) + ini_write(sett_ini, "Mansol", formMansol) Return MJDPaste: Gui, Submit, NoHide - ini_write(ini, "MJDPaste", formMJDPaste) + ini_write(sett_ini, "MJDPaste", formMJDPaste) Return CaseFormatter: Gui, Submit, NoHide GuiControl, show%formCaseFormatter%, formCFmail ; only shows the check box for emails if the Case Formatter box is checked GuiControl,, formCFmail, 0 - ini_write(ini, "CaseFormatter", formCaseFormatter) - ini_write(ini, "CFmail", "0") ; if you're toggling this, its either on or off, doesn't hurt to set it here + ini_write(sett_ini, "CaseFormatter", formCaseFormatter) + ini_write(sett_ini, "CFmail", "0") ; if you're toggling this, its either on or off, doesn't hurt to set it here Return CFmail: Gui, Submit, NoHide - ini_write(ini, "CFmail", formCFmail) + ini_write(sett_ini, "CFmail", formCFmail) Return Jdpn: Gui, Submit, NoHide - ini_write(ini, "JDProductNames", formJdpn) + ini_write(sett_ini, "JDProductNames", formJdpn) Return Glovar: Gui, Submit, NoHide - ini_write(ini, "GloVar", formGlovar) + ini_write(sett_ini, "GloVar", formGlovar) Return Ger: Gui, Submit, NoHide - ini_write(ini, "German", formGer) + ini_write(sett_ini, "German", formGer) Return Help: @@ -149,4 +120,4 @@ Return GuiClose: GuiEscape: Run D3K.ahk -ExitApp ; Closes the app when escape or the exit button is pressed +ExitApp ; Closes the app when escape or the exit button is pressed \ No newline at end of file -- 2.54.0 From 97f2d2382bf947275db8f31abb7d2139428fe532 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 14 Jul 2023 10:14:26 -0500 Subject: [PATCH 17/34] init --- .gitignore | 3 + Case_Formatter.ahk | 174 +++++++++++++++ D3K.ahk | 519 ++++++++++++++++++++++++++++++++++++++++++++ Mansol_Opener.ahk | 33 +++ Settings.ahk | 123 +++++++++++ addemail.ahk | 33 +++ func.ahk | 169 +++++++++++++++ glovarsource | 6 + icons/coffeecup.ico | Bin 0 -> 1081406 bytes icons/manual.ico | Bin 0 -> 165291 bytes msmv.ahk | 63 ++++++ 11 files changed, 1123 insertions(+) create mode 100644 .gitignore create mode 100644 Case_Formatter.ahk create mode 100644 D3K.ahk create mode 100644 Mansol_Opener.ahk create mode 100644 Settings.ahk create mode 100644 addemail.ahk create mode 100644 func.ahk create mode 100644 glovarsource create mode 100644 icons/coffeecup.ico create mode 100644 icons/manual.ico create mode 100644 msmv.ahk diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f18a7f9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.code-workspace +SmartGooey/* +Projects/* \ No newline at end of file diff --git a/Case_Formatter.ahk b/Case_Formatter.ahk new file mode 100644 index 0000000..94a3f8e --- /dev/null +++ b/Case_Formatter.ahk @@ -0,0 +1,174 @@ +#Include, func.ahk + +; Holy crap I need to rewrite this for v3... + + +SetTitleMatchMode, 2 + +; These next 3 options make it so that it's always on top, it there are no buttons, and doesn't show up in the alt-tab or taskbar +Gui,+AlwaysOnTop +Gui, +ToolWindow + +Contact := 2 + +CurrTimeEN := GetDateTime("en") +CurrTimeDE := GetDateTime("de") + +;------------------------------------------------------------------------------ +; GUI creation +;------------------------------------------------------------------------------ +; The & in front of the letters lets you hold alt and press the first letter instead of having to click on it. That is why its "Mail", not "E-Mail" + +Gui, Add, Radio, x12 y3 w60 h20 Group vLang Checked, &English ; First group of Radio buttons +Gui, Add, Radio, x12 y23 w60 h20, &German + +Gui, Add, Radio, x82 y3 w60 h20 Group vAct, &Warrant +Gui, Add, Radio, x82 y23 w60 h20, &Demo + +Gui, Add, Text, x75 y46 w150 h20 gTime, %CurrTimeEN% + +Gui, Add, Button, x12 y43 w55 h20 Default vHidden, Go ; That way you don't have to have an actual button, it just happens when you press enter. + +if (cfmail) +{ + Gui, Add, Radio, x142 y3 w80 h20 Group vContact Checked, E-&Mail ; Second group of Radio buttons + Gui, Add, Radio, x142 y23 w80 h20 , &Call + Gui, Show, h70 w210, Contact +} Else { + Gui, Show, h70 w145, Contact +} + +Return + +Time: +Run, addemail.ahk + +GuiClose: +GuiEscape: +ExitApp +;------------------------------------------------------------------------------ +; Buttons +;------------------------------------------------------------------------------ + + +ButtonGo: + Gui, submit + Goto, Write +Return + +/* +Contact +Mail: 1 +Call: 2 + +Lang +English: 1 +German: 2 + +Act +Warrant: 1 +Demo: 2 +*/ + +Write: +{ + FileRead, NewLine, %docfile% ; Read the documentation file + If (NewLine != "") ; If there is something in the file, this would return a string + { + FileAppend,`n`n`n`n, %docfile% ; Inserts a new line so that it isn't just appended directly to the end + } + NewLine := "" ; Free up Memory cause this could be quite a bit of stuff + + + ;------------------------------------------------------------------------------ + ; Email + ;------------------------------------------------------------------------------ + + If (Contact = "1") + { + If (Lang = "1") ; English + { + If (Act = "0") ; Not an activation + { + FileAppend,Dealer emailed: "", %docfile% + } + + If (Act = "1") ; Warrant + { + FileAppend,Dealer emailed for warrant transfer: ""`n`nOld SN: `nNew SN: `nChallenge Code: `n`n, %docfile% + } + + If (Act = "2") ; Demo + { + FileAppend,Dealer emailed for `n`nSN: `nChallenge Code: `n`n, %docfile% + } + } + + Else If (Lang = "2") ; German + { + If (Act = "0") ; Not an activation + { + FileAppend,Händler emailte: "", %docfile% + } + + Else If (Act = "1") ; Warrant + { + FileAppend,Händler emailte für Garantieübertragung`n`nAlte SN: `nNeue SN: `nAuthentisierungscode: `n`n, %docfile% + } + + Else If (Act = "2") ; Demo + { + FileAppend,Händler emailte für `n`nSN: `nAuthentisierungscode: `n`n, %docfile% + } + } + } + + + ;------------------------------------------------------------------------------ + ; Call + ;------------------------------------------------------------------------------ + + Else If (Contact = "2") + { + If (Lang = "1") ; English + { + FileAppend, Call received %CurrTimeEN%.`n`n, %docfile% + If (Act = "0") ; Not an activation + { + FileAppend,Dealer called for , %docfile% + } + + Else If (Act = "1") ; Warrant + { + FileAppend,Dealer called for Warrant transfer`nOld SN: `nNew SN: `nChallenge Code: `n`n, %docfile% + } + + Else If (Act = "2") ; Demo + { + FileAppend,Dealer called for Demo`nSN: `nChallenge Code: `n`n, %docfile% + } + } + + Else If (Lang = "2") ; German + { + FileAppend, Anruf wurde %CurrTimeDE% entgegengenommen.`n`n, %docfile% + + If (Act = "0") ; Not an activation + { + FileAppend,Händler rief an mit , %docfile% + } + + Else If (Act = "1") ; Warrant + { + FileAppend,Händler rief an für Garantieübertragung`nAlte SN: `nNeue SN: `nAuthentisierungscode: `n`n, %docfile% + } + + Else If (Act = "2") ; Demo + { + FileAppend,Händler rief an für Demo`nSN: `nAuthentisierungscode: `n`n, %docfile% + } + } + } + + ExitApp +} \ No newline at end of file diff --git a/D3K.ahk b/D3K.ahk new file mode 100644 index 0000000..074ee9f --- /dev/null +++ b/D3K.ahk @@ -0,0 +1,519 @@ +#Include, func.ahk + +Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard +Menu, Tray, Add, &Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse +Menu, Tray, Add, Settings, D3K_Settings ; Add item to the tray to move the mouse +Menu, Tray, Add, %A_AhkVersion%, docs + + +;------------------------------------------------------------------------------ +; Global Variables +;------------------------------------------------------------------------------ +If (glovar) +{ + SetTimer, GloVar, 2000 ; Check every 2 seconds + + GloVar: + glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies + glovarscript := A_Temp "\GloVar.ahk" ; Doesn't need to be anywhere useful as it doesn't contain any external references + ;FileGetTime, gvMod, %glovarini%, M + glovarstart := "#SingleInstance force`n#NoTrayIcon`nSendMode, Input`nFileEncoding, UTF-8`n" + If (WinActive("GloVar.ini")) ; Only run when the window isn't active, prevents accidential editing by this while the user is + { + Return + } + FileGetTime, gvModNew, %glovarini%, M + If !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. + { + SetTimer, GloVar, Off + hotstrings := "" + glovar_array := ini_load(glovarini) + For sec in glovar_array + { + For key, value in glovar_array[sec] + { + If (value) + { + sec := StrReplace(sec, "§", " ") ; AHK can't handle spaces in nested array names, so they're substituted with § when entered into the array. This reverses that. + StringCaseSense, Off ; Make sure the capitalization doesn't matter + Switch sec + { + Case "Serial Numbers": + StringUpper, value, value ; Makes it uppercase + ini_write(glovarini, key, value) + Case "Info": + If (key = "case") + { + StringUpper, value, value ; Makes it uppercase, just in case it was manually typed + value := Trim(value, "()") + ini_write(glovarini, key, value) ; Writes the properly formatted case number to glovar.ini + } + Case "Clear": ; Will clear the ini and save its and the documentation file's contents to a log + temp := FileOpen(docfile, "r") + doctemp := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "r") + initemp := temp.Read() + temp.Close() + initemp := RegExReplace(initemp, "i)(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info, case insensitive + CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" + temp := FileOpen(A_MyDocuments "/D3KLog.txt", "a") + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + temp.Write("`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + temp.Close() + temp := FileOpen("glovarsource", "r") + glovarsource := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "w") + temp.Write(glovarsource) ; Overwrite .ini for a clean slate + temp.Close() + temp := FileOpen(docfile, "w") ; Overwrites documentation for a clean slate + temp.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart) + script.Close() + Run, %A_AhkPath% %glovarscript% ; Just in case. Don't want an old version running. + ToolTip, Cleared + Sleep, 500 + ToolTip + FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer, GloVar, On + Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable + Case (RegExMatch(sec, "i)sdrbr(\d*)", m) ? sec : !sec): ; for cases with Stolen displays + If (m1) ; sometimes there are multiple stolen displays, this is to account for that. + { + writethis := "[Serial Numbers]" + Loop, % m1 + writethis .= "`ns" A_Index "=`nr" A_Index "=`ncc" A_Index "=`nv" A_Index "=" + writethis .= "`n[Info]" + Loop, % m1 + writethis .= "`ncase" A_Index "=" + } Else { + writethis := "[Serial Numbers]`ns=`nr=`ncc=`nv=`n[Info]`ncase=" glovar_array[sec, "case"] + } + temp := FileOpen(glovarini, "w") + temp.Write(writethis) + temp.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart) + script.Close() + SetTimer, GloVar, On + Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable + } + hotstrings .= "`n:*:$" key "::" value + } + } + } + file := FileOpen(glovarini, "r") + temp := file.Read() + file.Close() + temp := RegExReplace(temp, "`am)^[\s\R]*") ; Get rid of empty lines + temp := RegExReplace(temp, "m)[ \t]+$") ; Get rid of extra space at the end of strings + temp := Trim(temp, " `t`r`n") ; Remove pesky newlines and extra space at the end + file := FileOpen(glovarini, "w") + file.Write(temp) + file.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart hotstrings) + script.Close() + Run, %A_AhkPath% %glovarscript% + ToolTip, GloVars updated + Sleep, 500 + ToolTip + FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer, GloVar, On + } + Return +} + + +;------------------------------------------------------------------------------ +; Settings window +;------------------------------------------------------------------------------ +D3K_Settings: +!+\::Run Settings.ahk ; Alt+Shift+\ +Return + + +;------------------------------------------------------------------------------ +; Mouse Mover +;------------------------------------------------------------------------------ +Mouse_Mover: + If (msmv_active = True) + { + Run, %A_AhkPath% "msmv.ahk" "off" + msmv_active := False ; Have to do this cause AHK doesn't have a builtin function to detect if something is checked or not. + Menu, Tray, Uncheck, &Mouse Mover + + } + Else + { + Run, %A_AhkPath% "msmv.ahk" "on" + msmv_active := True + Menu, Tray, Check, &Mouse Mover + } +Return + + +;------------------------------------------------------------------------------ +; DTAC Solution Opener +;------------------------------------------------------------------------------ +#If (mansol) ; checks from the variable thats set from the .sett_ini file + !+S::Run Mansol_Opener.ahk ; Alt+Shift+S +#If + + +;------------------------------------------------------------------------------ +; Case Formatter +;------------------------------------------------------------------------------ +#If (CaseFormatter) + Pause::Run Case_Formatter.ahk ; The Pause|Break key +#If + + +;------------------------------------------------------------------------------- +; Special Characters +;------------------------------------------------------------------------------- +#If (ger) + !s::Send {U+00DF} ;Alt+S scharfes s / Eszett / ß + !a::Send {U+00E4} ;Alt+a ä + +!A::Send {U+00C4} ;Alt+A Ä + !o::Send {U+00F6} ;Alt+o ö + +!O::Send {U+00D6} ;Alt+O Ö + !u::Send {U+00FC} ;Alt+u ü + +!U::Send {U+00DC} ;Alt+U Ü +#If + +;------------------------------------------------------------------------------- +; Capitalise dates +;------------------------------------------------------------------------------- +::monday::Monday +::tuesday::Tuesday +::wednesday::Wednesday +::thursday::Thursday +::friday::Friday +::saturday::Saturday +::sunday::Sunday +::january::January +::february::February +::april::April +::june::June +::july::July +::august::August +::september::September +::october::October +::november::November +::december::December + +; German +#If (ger) + ::montag::Montag + ::dienstag::Dienstag + ::mittwoch::Mittwoch + ::donnerstag::Donnerstag + ::freitag:: Freitag + ::samstag::Samstag + ::sonntag::Sonntag + + ::januar::Januar + ::februar::Februar + ::märz::März + ::mai::Mai + ::juni::Juni + ::juli::Juli + ::oktober::Oktober + ::dezebmer::Dezember +#If + + +;------------------------------------------------------------------------------ +; Copypastas +;------------------------------------------------------------------------------ +; STWA Applied +:*:]cmy:: + Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} +Return + +; STWA not available +:*:]cmn:: + Send STWA not available{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} +Return + +; Need info +:*:]cmr:: + Send STWA available{Enter 2}Status: Requesting information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}Verify information{Enter 2}SQL:{Enter} +Return + +:*:]sdrbr:: + glovar_array := ini_load(glovarini) + For sec in glovar_array + { + For key, value in glovar_array[sec] + { + If (value) + { + stln_%key% := value + } + } + } + If (glovar_array["Info"].Count() > 1) + { + Send Stolen Display Replacement Basics Requests{Tab} + Send Received some requests for replacement Basics for Stolen displays @ + } Else { + Send %stln_case%{Tab} + Send Received a request for replacement Basics for a Stolen display @ + } + Sleep, 1000 + Send Stellar + Sleep, 1500 + Send {Down}{Tab}:{Enter 2} + Sleep, 1000 + Send {ShiftDown}{Tab 2}{ShiftUp} + Sleep, 1000 + Send {Right 17} + Sleep, 1000 + Send {Enter} + Sleep, 1000 + Send {Right} + Send {Enter} + Sleep, 1000 + If (glovar_array["Info"].Count() > 1) + { + Loop, % glovar_array["Info"].Count() { + If (A_Index < glovar_array["Info"].Count()) + { + table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?{Tab 2}" + } Else { + table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?" + } ; That way it doesn't put the extra line at the very end + Send %table% + } + } Else { + Send Case{Tab}%stln_case%{Tab}Stolen{Tab}%stln_s%{Tab}Replacement{Tab}%stln_r%{Enter}%stln_cc%{Tab}Machine PIN{Tab}%stln_v%{Tab}Model, Year{Tab 2}Should it qualify?{Up 2}{Tab} + } +Return + +; Transferring to DTAC +:*:]DTAC:: + Send The ISG Global Support Center has determined that this case is hardware related`; therefore, this case is being transferred from the Global Support Center to the ISG DTAC group. A DTAC technician will now work this case via the DTAC system and provide a recommendation in the case Text if more information is needed or if a solution has been found. Please continue to update or check on the progress of this case by using the DTAC system Case Text section moving forward. +Return + +; Transferring to Tier2 +:*:]rrt:: + Send This case was unable to be resolved and has been transferred to another team. Our Tier 2 team is investigating the issue to find a short-term resolution. We will update you as soon as we have a recommendation. +Return + +; Update after 5 business days +:*:]upd:: + Send A short-term resolution still has not been identified. We are requesting an immediate update on this case from our Tier 2 team. We will contact you as soon as we have a status update. +Return + +; Requesting info +:*:]req:: + Send A request has been made for additional information in this case. Please provide the following information as soon as possible so this case can be resolved. +Return + +; Dealer defect +:*:]ddefect:: + Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please have your field team contact the appropriate Product Support Representative. +Return + +; Customer defect +:*:]cdefect:: + Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please contact your preferred dealer and the field team can contact the appropriate Product Support Representative. +Return + +; Workbasket shortcuts, place mouse over Transfer button before typing +:*:]pd:: +Send PCDSC +Send {Click} +Return + +:*:]pr:: +Send PCRRT +Send {Click} +Return + +:*:]p2:: +Send PCTIER2 +Send {Click} +Return + +;------------------------------------------------------------------------------ +; Email +;------------------------------------------------------------------------------ +:*:]email:: + Send Hello,{Enter 2}{Space 3} +Return + +; German +#If (ger) +:*:[email:: + Send Hallo,{Enter 2}{Space 3} +Return +#If + + +;------------------------------------------------------------------------------ +; Profile email paste +;------------------------------------------------------------------------------ +; So when editing Profiles, it won't let you paste in the email field. We don't like that. Make sure to let go of all keys immediatley after pressing this +#If (mjdpaste) +#v:: + sleep, 750 + SendInput %clipboard% + sleep, 500 + send # ; to make sure the start menu isn't open for some reason +Return +#If + +;------------------------------------------------------------------------------ +; Common Terms autocorrect and replacement +;------------------------------------------------------------------------------ +; JD Names +#If (jdpn) + :*:[xx::XXXXXXXXXXXXX ; I'm not gonna try and find the right amount of X's to appease the CCMS demons + :*:]xx::XXXXXXXXXXXXX +; English + :*:]at::AutoTrac + :*:]ba::Basics & AutoTrac + :*:]sf::StarFire + :*:]jdl::JDLink + :*:]jdp::JDParts + :*:]mjd::MyJohnDeere + :*:]opsc::Operations Center + :*:]seccon::Section Control + :*:]gs::GreenStar + :*:]cc::CommandCenter + :*:]fc::Field Connect + :*:]rs::RowSense + :*:]sub::subscription + :*:]ss::Stellar Support + :*:]tman::Technical Manual + :*:]oman::Operator's Manual + :*:]hl3::HarvestLab 3000 + :*:]hlo::Original HarvestLab + :*:]bin::Virtual Inventory + :*:]warrep::Warranty Reports + :*:]tcsm::Territory Customer Support Manager + :*:]jdsm::John Deere Software Manager + :*:]jddm::John Deere Data Manager + :*:]serva::Service Advisor + :*:]muc::Master Unlock Code + :*:]asmn::Asset Manager + :*:]bsm::Base Station Manager + :*:]sas::See & Spray + + ::rowsense::RowSense + :*:comar::COMAR + ::mrtk::mRTK + ::rda::RDA + ::rtk::RTK + ::autotrac::AutoTrac + :*:ccms::CCMS + :*:dtac::DTAC + ::tcsm::TCSM + ::itec::iTEC Pro + ::ssu::SSU + ::atu::ATU + :*:mtg::MTG + ::wdt::WDT + ::itc::iTC + :*:vin::Machine PIN ; Not actually vehicles, so they don't have VINs + ::gs2::GS2 + ::gs3::GS3 + ::sf1::SF1 + ::sf2::SF2 + ::sf3::SF3 + ::sf4::SF4 + ::xid::xID + ::pmcalc::PMCalc + ::vat::VAT + :*:racf::RACF + ::igrade::iGrade + :*:JDCP::JDCP + :*:ISOBUS::ISOBUS + + +; German +#If (ger) + :*:[at::AutoTrac + :*:[ba::Basics & AutoTrac + :*:[sf::StarFire + :*:[jdl::JDLink + :*:[jdp::JDParts + :*:[mjd::MyJohnDeere + :*:[opsc::Einsatzzentrale + :*:[seccon::Teilbreitensteuerung + :*:[gs::GreenStar + :*:[cc::CommandCenter + :*:[fc::Field Connect + :*:[rs::RowSense + :*:[sub::Abonnement + :*:[ss::Stellar Support + :*:[tman::Technische Betriebsanleitung + :*:[oman::Betriebsanleitung + :*:[hl3::HarvestLab 3000 + :*:[hlo::Originales HarvestLab + :*:[bin::Virtuellen Bestand + :*:[warrep::Warranty Reports + :*:[tp::TouchPoint + :*:[tcsm::Technischer Bezirksleiter + :*:[jdsm::John Deere Software Manager + :*:[jddm::John Deere Data Manager + :*:[serva::Service Advisor + :*:[muc::Master Unlock Code + :*:[asmn::Asset Manager + :*:[bsm::Base Station Manager +#If + + +;------------------------------------------------------------------------------ +; QoL Improvements +;------------------------------------------------------------------------------ +:*:]me:: + Send, % Format("{:U}", A_UserName) +Return + +:*:[me:: + Send, % Format("{:U}", A_UserName) +Return + +#If !(email = "LastnameFirstname@JohnDeere.com") + :*:@me:: + Send, %email% +Return +#If + +#j:: ; Open the downloads folder on Win+J + Run, C:\Users\%A_UserName%\Downloads +Return + +:*:[now:: +:*:]now:: + SendInput, % GetDateTime("ISO8601") ; Send the current time/date in ISO8601 format +Return + +:*:[today:: +:*:]today:: + SendInput, % GetDateTime("date") ; Send the current date in ISO8601 format +Return + +:*:[deg::{ASC 248} +:*:]deg::{ASC 248} +:*:[eq::{ASC 247} +:*:]eq::{ASC 247} + +:*:[shrug::¯\_(ツ)_/¯ +:*:]shrug::¯\_(ツ)_/¯ + +:*:[ltd::License to Deere™ +:*:]ltd::License to Deere™ + + +docs: + run https://www.autohotkey.com/docs/AutoHotkey.htm +Return + +F19:: Run D3K.ahk \ No newline at end of file diff --git a/Mansol_Opener.ahk b/Mansol_Opener.ahk new file mode 100644 index 0000000..7cdbc96 --- /dev/null +++ b/Mansol_Opener.ahk @@ -0,0 +1,33 @@ +#SingleInstance force ; Only one instance at a time +SendMode, Input +FileEncoding, UTF-8 ; Makes sure the special characters don't break stuff + +Menu, Tray, Icon, %A_MyDocuments%\D3K\icons\manual.ico + +Gui, +AlwaysOnTop +ToolWindow + +Gui, Add, Edit, x2 y3 w78 h20 vNumber +Left, +Gui, Add, Button, x22 y43 w70 h20 Default vHidden, Ok +Gui, Add, Button, x81 y3 w17 h20 gHelp +Center, ? +Gui, Show, h28 w100, ManSol +GuiControl, Hide, Hidden + +Return + +ButtonOk: + Gui, submit ; I have no idea what the regex means any more... + If RegExMatch(Number, "[[:alpha:]]+") + run, % "http://serviceadvisor.deere.com/WebSA/manuals/" Number + Else If RegExMatch(Number, "[[:digit:]]+") + run, % "https://serviceadvisor.deere.com/WebSA/solutions/en/" Number + ExitApp +Return + + +Help: + Run, https://daviddaily.dev/david/d3k/wiki/ManSol +Return + +GuiClose: +GuiEscape: +ExitApp \ No newline at end of file diff --git a/Settings.ahk b/Settings.ahk new file mode 100644 index 0000000..af6296f --- /dev/null +++ b/Settings.ahk @@ -0,0 +1,123 @@ +#Include, func.ahk +#NoTrayIcon +Menu, Tray, Icon, shell32.dll, 283 + +;------------------------------------------------------------------------------ +; Create GUI +;------------------------------------------------------------------------------ +Gui, -MaximizeBox -MinimizeBox ; Remove the max+min buttons + +Gui, Add, GroupBox, x8 y2 w193 h37, First Name +Gui, Add, Edit, x12 y15 w185 h20 vformName gName, %name% + +Gui, Add, GroupBox, x8 y40 w207 h37, Email Address +Gui, Add, Edit, x12 y53 w200 h20 vformEmail gEmail, %email% + +Gui, Add, GroupBox, x8 y83 w107 h130, Main +Gui, Add, CheckBox, x12 y95 w100 h30 vformMansol Checked%mansol% gMansol, ManSol +Gui, Add, CheckBox, x12 y125 w100 h30 vformMJDPaste Checked%mjdpaste% gMJDPaste, MJDPaste +Gui, Add, CheckBox, x12 y155 w100 h30 vformCaseFormatter Checked%caseformatter% gCaseFormatter, Case Formatter +Gui, Add, CheckBox, x25 y178 w75 h30 vformCFmail Checked%cfmail% gCFmail, Email option + GuiControl, show%caseformatter%, formCFmail ; only shows the check box for emails if the Case Formatter box is checked +Gui, Add, GroupBox, x8 y215 w277 h50 vformDocFile, Documentation File +Gui, Add, Text, x15 y231 w260 h30 vformDocFile2 gDocFile, %docfile% + +Gui, Add, GroupBox, x128 y83 w157 h75, Text Replacement +Gui, Add, CheckBox, x132 y95 w150 h30 vformJdpn Checked%jdpn% gJdpn, JD Product Names +Gui, Add, CheckBox, x132 y125 w150 h30 vformGlovar Checked%glovar% gGlovar, Global Variables +Gui, Add, CheckBox, x132 y155 w100 h30 vformGer Checked%ger% gGer, DE ([ as prefix) + +Gui, Add, Link, x132 y190 w150 h26 gHelp, Click here for help`n%A_AhkVersion% + +Gui, Show, h273 w295, D3K version %d3k_version% +Return + +;------------------------------------------------------------------------------ +; Edit ini +;------------------------------------------------------------------------------ + +/* +Default ini, sections are in []: (0 is off, 1 is on) +[USpec] +Email=LastnameFirstname@JohnDeere.com +Name=Firstname +DocFile=Select File +[Main] +Mansol=1 +MJDPaste=1 +CaseFormatter=1 +CFmail=0 +[Replacement] +JDProductNames=1 +GloVar=0 +[Language] +German=0 + +*/ + +Name: + Gui, Submit, NoHide + ini_write(sett_ini, "Name", formName) +Return + +Email: + Gui, Submit, NoHide + ini_write(sett_ini, "Email", formEmail) +Return + +DocFile: + Gui, Submit + FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.txt) + if !(SelectedFile) + MsgBox, You have not selected a file, this will break some things. + else + ini_write(sett_ini, "DocFile", SelectedFile) + Run, Settings.ahk +Return + +Mansol: + Gui, Submit, NoHide + ini_write(sett_ini, "Mansol", formMansol) +Return + +MJDPaste: + Gui, Submit, NoHide + ini_write(sett_ini, "MJDPaste", formMJDPaste) +Return + +CaseFormatter: + Gui, Submit, NoHide + GuiControl, show%formCaseFormatter%, formCFmail ; only shows the check box for emails if the Case Formatter box is checked + GuiControl,, formCFmail, 0 + ini_write(sett_ini, "CaseFormatter", formCaseFormatter) + ini_write(sett_ini, "CFmail", "0") ; if you're toggling this, its either on or off, doesn't hurt to set it here +Return + + CFmail: + Gui, Submit, NoHide + ini_write(sett_ini, "CFmail", formCFmail) + Return + +Jdpn: + Gui, Submit, NoHide + ini_write(sett_ini, "JDProductNames", formJdpn) +Return + +Glovar: + Gui, Submit, NoHide + ini_write(sett_ini, "GloVar", formGlovar) +Return + +Ger: + Gui, Submit, NoHide + ini_write(sett_ini, "German", formGer) +Return + +Help: + Gui, Submit +Return + +GuiClose: +GuiEscape: + Run D3K.ahk +ExitApp ; Closes the app when escape or the exit button is pressed \ No newline at end of file diff --git a/addemail.ahk b/addemail.ahk new file mode 100644 index 0000000..a061ed0 --- /dev/null +++ b/addemail.ahk @@ -0,0 +1,33 @@ +#Include, func.ahk + +csv = %A_MyDocuments%\emails.csv ; Where the email CSV is + +glovarini := A_MyDocuments "\GloVar.ini" +Xid := ini_get(glovarini, "Info", "xID") + +Gui, +AlwaysOnTop +ToolWindow + +Gui, Add, Text, x2 y2 w60 h17 +Center, xID +Gui, Add, Text, x65 y2 w120 h17 +Center, Email +Gui, Add, Text, x190 y2 w100 h17 +Center, Name + +Gui, Add, Edit, x2 y17 w60 h20 vXid, %Xid% +Gui, Add, Edit, x65 y17 w120 h20 vEmail +Gui, Add, Edit, x190 y17 w100 h20 vName + +Gui, Add, Button, x172 y89 w70 h30 Default, OK + +Gui, Show, h39 w292, Add dealer to CSV +Return + +ButtonOK: + Gui, Submit + writethis := Xid . "," . Email . "," . Name + FileAppend, % "`n" writethis, %csv% + ini_write(A_MyDocuments "\GloVar.ini", "dem", Email) +Return + + +GuiEscape: +GuiClose: +ExitApp \ No newline at end of file diff --git a/func.ahk b/func.ahk new file mode 100644 index 0000000..cc8d08d --- /dev/null +++ b/func.ahk @@ -0,0 +1,169 @@ +#SingleInstance force ; Only one instance at a time +SendMode, Input +FileEncoding, UTF-8 ; Makes sure the special characters dont break stuff +SetWorkingDir, %A_MyDocuments%\D3K ; Make sure we can find the .ahks linked below +SetTitleMatchMode, 2 + +d3k_version := 3 ; The current version + +GetDateTime(lang) +{ + FormatStr := "yyyy-MM-dd" ; The Date + FormatTime, DateStr, %A_NowUTC%, %FormatStr% ; format it to make it look like the Date we want + FormatStr := "H:mm'Z'" ; The time + FormatTime, TimeStr, %A_NowUTC%, %FormatStr% ; Format the string to be better + if (lang = "en") + { + Return DateStr " at " TimeStr + } + + if (lang = "de") + { + Return DateStr " um " TimeStr + } + + if (lang = "ISO8601") + { + Return DateStr "T" TimeStr + } + + if (lang = "date") + { + Return DateStr + } +} + +GetInfo(xID) +{ + if (xID) + { + File := FileOpen(A_MyDocuments "\emails.csv", "r") + Loop + { + Line := File.ReadLine() + Array := StrSplit(Line,",") ; split the line at its separating commas to get separate "columns" AKA elements + if InStr(Array[1], xID) ; if at the specified element (1) the specified content (dealers xID) has been found + { + Test := {xid: Array[1], email: Array[2], name: Array[3], user: Array[4], org: Array[5]} ; Return the array so we can do {variable}.email and so on + File.Close() ; Close the file + Return Test ; Return the array with the deets that we found + } + } Until (File.AtEOF) + File.Close() + Return false + } + if !(xID) + { + Return false + } +} + +;------------------------------------------------------------------------------ +; INI Manipulation that supports UTF-8 +;------------------------------------------------------------------------------ + +ini_load(location) +{ + out := {} + File := FileOpen(location, "r") + cleaner := File.Read() + File.Close() + cleaner := RegExReplace(cleaner, "`am)^[\s\R]*") ; Remove empty lines + cleaner := RegExReplace(cleaner, "m)[ \t]+$") ; Get rid of extra space at the end of values (NEEDS FIXED) + File := FileOpen(location, "w") + File.Write(cleaner) + File.Close() + File := FileOpen(location, "r") + Loop + { + Line := File.ReadLine() + RegExMatch(Line, "(?
(?<=\[).*(?=\]))|(?.*)=(?.*)", r) ; Key = rKey, Value = rValue, Section = rSection + If (rSection) + { + rSection := Trim(rSection, " `t`r`n") ; Remove pesky newlines and extra space + rSection := StrReplace(rSection, " ", "§") ; AHK can't handle spaces in nested array names, so they're substituted with § + out[rSection]:={} + c_Section := rSection + } Else + { + rKey := Trim(rKey, " `t`r`n") + rValue := Trim(rValue, " `t`r`n") + out[c_Section, rKey] := rValue + } + } Until (File.AtEOF) + File.Close() + Return out +} + + +ini_write(location, inKey, inValue) ; Don't need to specify section because you can only have one hotstring anyway +{ + Critical, On + file := FileOpen(location, "r") + temp := file.Read() + file.Close() + inKey := "(?<=" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key + temp := RegExReplace(temp, inKey, inValue) + ; msgbox, % temp "`n`nRegex:`t" inKey "`nReplacing match with:`t" inValue + file := FileOpen(location, "w") + file.Write(temp) + file.Close() +} + + +;------------------------------------------------------------------------------ +; Make sure the settings file exists, if not, create it +;------------------------------------------------------------------------------ +sett_ini := A_MyDocuments "\D3Ksettings.ini" ; Where the settings ini is + +If !FileExist(sett_ini) ; Check if the sett_ini doesn't exist +{ + file := FileOpen(sett_ini, "w") + writethis := " + ( LTrim + [USpec] + Email=LastnameFirstname@JohnDeere.com + Name=Firstname + DocFile=Select File + [Main] + Mansol=1 + MJDPaste=1 + CaseFormatter=1 + CFmail=0 + [Replacement] + JDProductNames=1 + GloVar=0 + [Language] + German=0 + )" + file.Write(writethis) + file.Close() + Run Settings.ahk ; Runs the GUI for changing the settings, accessible with Alt+Shift+\ (also easy way to restart this script) +} + +;------------------------------------------------------------------------------ +; Read the sett_ini +;------------------------------------------------------------------------------ +; This is the part that reads the file to see what your settings are. Variables in the sett_ini file are in all CamelCase, variables here are lowercase for more distinction + +settings := {} +settings := ini_load(sett_ini) + +; User Specific things: +email := settings["USpec", "Email"] +name := settings["USpec", "Name"] +docfile := settings["USpec", "DocFile"] + +; General Settings +mansol := settings["Main", "Mansol"] +supadmin := settings["Main", "Supadmin"] +mjdpaste := settings["Main", "MJDPaste"] +caseformatter := settings["Main", "CaseFormatter"] +cfmail := settings["Main", "CFmail"] + +; Replacement +jdpn := settings["Replacement", "JDProductNames"] +glovar := settings["Replacement", "GloVar"] + +; Language +ger := settings["Language", "German"] \ No newline at end of file diff --git a/glovarsource b/glovarsource new file mode 100644 index 0000000..2490c55 --- /dev/null +++ b/glovarsource @@ -0,0 +1,6 @@ +[Serial Numbers] +1= +cm= +v= +[Info] +case= \ No newline at end of file diff --git a/icons/coffeecup.ico b/icons/coffeecup.ico new file mode 100644 index 0000000000000000000000000000000000000000..8d6b5d4fe04932c8a1330018e0d970631343bdb8 GIT binary patch literal 1081406 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 literal 0 HcmV?d00001 diff --git a/icons/manual.ico b/icons/manual.ico new file mode 100644 index 0000000000000000000000000000000000000000..9a7b5fe92337245e020d397541540cf62c7b5039 GIT binary patch literal 165291 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 literal 0 HcmV?d00001 diff --git a/msmv.ahk b/msmv.ahk new file mode 100644 index 0000000..1c4a871 --- /dev/null +++ b/msmv.ahk @@ -0,0 +1,63 @@ +#SingleInstance, force +CoordMode, Mouse, Screen + +waittime := 120000 + +Switch A_Args[1] +{ +Case "on": + Menu, Tray, NoIcon + Goto, Start +Case "off": + ExitApp +} + +Menu, Tray, Add, Hide GUI, GuiToggle ; Adds a button to toggle the gui +Menu, Tray, Add, Exit, GuiClose ; Exit button +Menu, Tray, NoStandard ; None of the standard tray buttons +Gui, +AlwaysOnTop +ToolWindow +Gui, Add, Button, x3 y3 w55 h20 gStart +Center, Start +Gui, Add, Button, x3 y3 w55 h20 gStop +Center, Stop +Gui, Show, h28 w60, msmv +GuiControl, Hide, Stop ; Since we want the Start button to show first +Return + +Start: + GuiControl, Hide, Start + SetTimer, Msmv, %waittime% ; Checks if the has been input in the last 2 minutes every 30 secs, easier to stop a loop with SetTimer + GuiControl, Show, Stop +Return + +Stop: + GuiControl, Hide, Stop + SetTimer, Msmv, off + GuiControl, Show, Start +Return + +Msmv: + If (A_TimeIdle > waittime) ; https://www.autohotkey.com/docs/Variables.htm#User_Idle_Time + { + Random, x,, %A_ScreenWidth% + Random, y,, %A_ScreenHeight% + MouseMove %x%, %y% + } +Return + +GuiToggle: + If !nogui + { + Gui, Hide + Menu, Tray, Check, Hide GUI + nogui := True + } + Else + { + Menu, Tray, uncheck, Hide GUI + nogui := False + Gui, Show + } +Return + +GuiClose: +GuiEscape: +ExitApp ; Closes the app when escape or the exit button is pressed \ No newline at end of file -- 2.54.0 From de5e7b88e6455a05ae1437b2661c64a2269eb922 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 14 Jul 2023 10:27:33 -0500 Subject: [PATCH 18/34] yes --- D3K.ahk | 521 +++++++++++++++++++++++++++++++++++++++++++++- Mansol_Opener.ahk | 29 +++ msmv.ahk | 59 ++++++ 3 files changed, 608 insertions(+), 1 deletion(-) diff --git a/D3K.ahk b/D3K.ahk index 5f28270..d7683d5 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -1 +1,520 @@ - \ No newline at end of file +#Include, func.ahk + +Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard +Menu, Tray, Add, &Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse +Menu, Tray, Add, Settings, D3K_Settings ; Add item to the tray to move the mouse +Menu, Tray, Add, %A_AhkVersion%, docs + + +;------------------------------------------------------------------------------ +; Global Variables +;------------------------------------------------------------------------------ +If (glovar) +{ + SetTimer, GloVar, 2000 ; Check every 2 seconds + + GloVar: + glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies + glovarscript := A_Temp "\GloVar.ahk" ; Doesn't need to be anywhere useful as it doesn't contain any external references + ;FileGetTime, gvMod, %glovarini%, M + glovarstart := "#SingleInstance force`n#NoTrayIcon`nSendMode, Input`nFileEncoding, UTF-8`n" + If (WinActive("GloVar.ini")) ; Only run when the window isn't active, prevents accidential editing by this while the user is + { + Return + } + FileGetTime, gvModNew, %glovarini%, M + If !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. + { + SetTimer, GloVar, Off + hotstrings := "" + glovar_array := ini_load(glovarini) + For sec in glovar_array + { + For key, value in glovar_array[sec] + { + If (value) + { + sec := StrReplace(sec, "§", " ") ; AHK can't handle spaces in nested array names, so they're substituted with § when entered into the array. This reverses that. + StringCaseSense, Off ; Make sure the capitalization doesn't matter + Switch sec + { + Case "Serial Numbers": + StringUpper, value, value ; Makes it uppercase + ini_write(glovarini, key, value) + Case "Info": + If (key = "case") + { + StringUpper, value, value ; Makes it uppercase, just in case it was manually typed + value := Trim(value, "()") + ini_write(glovarini, key, value) ; Writes the properly formatted case number to glovar.ini + } + Case "Clear": ; Will clear the ini and save its and the documentation file's contents to a log + temp := FileOpen(docfile, "r") + doctemp := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "r") + initemp := temp.Read() + temp.Close() + initemp := RegExReplace(initemp, "i)(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info, case insensitive + CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" + temp := FileOpen(A_MyDocuments "/D3KLog.txt", "a") + writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable + temp.Write("`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + temp.Close() + temp := FileOpen("glovarsource", "r") + glovarsource := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "w") + temp.Write(glovarsource) ; Overwrite .ini for a clean slate + temp.Close() + temp := FileOpen(docfile, "w") ; Overwrites documentation for a clean slate + temp.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart) + script.Close() + Run, %A_AhkPath% %glovarscript% ; Just in case. Don't want an old version running. + ToolTip, Cleared + Sleep, 500 + ToolTip + FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer, GloVar, On + Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable + Case (RegExMatch(sec, "i)sdrbr(\d*)", m) ? sec : !sec): ; for cases with Stolen displays + If (m1) ; sometimes there are multiple stolen displays, this is to account for that. + { + writethis := "[Serial Numbers]" + Loop, % m1 + writethis .= "`ns" A_Index "=`nr" A_Index "=`ncc" A_Index "=`nv" A_Index "=" + writethis .= "`n[Info]" + Loop, % m1 + writethis .= "`ncase" A_Index "=" + } Else { + writethis := "[Serial Numbers]`ns=`nr=`ncc=`nv=`n[Info]`ncase=" glovar_array[sec, "case"] + } + temp := FileOpen(glovarini, "w") + temp.Write(writethis) + temp.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart) + script.Close() + SetTimer, GloVar, On + Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable + } + hotstrings .= "`n:*:$" key "::" value + } + } + } + file := FileOpen(glovarini, "r") + temp := file.Read() + file.Close() + temp := RegExReplace(temp, "`am)^[\s\R]*") ; Get rid of empty lines + temp := RegExReplace(temp, "m)[ \t]+$") ; Get rid of extra space at the end of strings + temp := Trim(temp, " `t`r`n") ; Remove pesky newlines and extra space at the end + file := FileOpen(glovarini, "w") + file.Write(temp) + file.Close() + script := FileOpen(glovarscript, "w") + script.Write(glovarstart hotstrings) + script.Close() + Run, %A_AhkPath% %glovarscript% + ToolTip, GloVars updated + Sleep, 500 + ToolTip + FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer, GloVar, On + } + Return +} + + +;------------------------------------------------------------------------------ +; Settings window +;------------------------------------------------------------------------------ +D3K_Settings: +!+\::Run Settings.ahk ; Alt+Shift+\ +Return + + +;------------------------------------------------------------------------------ +; Mouse Mover +;------------------------------------------------------------------------------ +Mouse_Mover: + If (msmv_active = True) + { + Run, %A_AhkPath% "msmv.ahk" "off" + msmv_active := False ; Have to do this cause AHK doesn't have a builtin function to detect if something is checked or not. + Menu, Tray, Uncheck, &Mouse Mover + + } + Else + { + Run, %A_AhkPath% "msmv.ahk" "on" + msmv_active := True + Menu, Tray, Check, &Mouse Mover + } +Return + + +;------------------------------------------------------------------------------ +; DTAC Solution Opener +;------------------------------------------------------------------------------ +#If (mansol) ; checks from the variable thats set from the .sett_ini file + !+S::Run Mansol_Opener.ahk ; Alt+Shift+S +#If + + +;------------------------------------------------------------------------------ +; Case Formatter +;------------------------------------------------------------------------------ +#If (CaseFormatter) + Pause::Run Case_Formatter.ahk ; The Pause|Break key +#If + + +;------------------------------------------------------------------------------- +; Special Characters +;------------------------------------------------------------------------------- +#If (ger) + !s::Send {U+00DF} ;Alt+S scharfes s / Eszett / ß + !a::Send {U+00E4} ;Alt+a ä + +!A::Send {U+00C4} ;Alt+A Ä + !o::Send {U+00F6} ;Alt+o ö + +!O::Send {U+00D6} ;Alt+O Ö + !u::Send {U+00FC} ;Alt+u ü + +!U::Send {U+00DC} ;Alt+U Ü +#If + +;------------------------------------------------------------------------------- +; Capitalise dates +;------------------------------------------------------------------------------- +::monday::Monday +::tuesday::Tuesday +::wednesday::Wednesday +::thursday::Thursday +::friday::Friday +::saturday::Saturday +::sunday::Sunday +::january::January +::february::February +::april::April +::june::June +::july::July +::august::August +::september::September +::october::October +::november::November +::december::December + +; German +#If (ger) + ::montag::Montag + ::dienstag::Dienstag + ::mittwoch::Mittwoch + ::donnerstag::Donnerstag + ::freitag:: Freitag + ::samstag::Samstag + ::sonntag::Sonntag + + ::januar::Januar + ::februar::Februar + ::märz::März + ::mai::Mai + ::juni::Juni + ::juli::Juli + ::oktober::Oktober + ::dezebmer::Dezember +#If + + +;------------------------------------------------------------------------------ +; Copypastas +;------------------------------------------------------------------------------ +; STWA Applied +:*:]cmy:: + Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} +Return + +; STWA not available +:*:]cmn:: + Send STWA not available{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} +Return + +; Need info +:*:]cmr:: + Send STWA available{Enter 2}Status: Requesting information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}Verify information{Enter 2}SQL:{Enter} +Return + +:*:]sdrbr:: + glovar_array := ini_load(glovarini) + For sec in glovar_array + { + For key, value in glovar_array[sec] + { + If (value) + { + stln_%key% := value + } + } + } + If (glovar_array["Info"].Count() > 1) + { + Send Stolen Display Replacement Basics Requests{Tab} + Send Received some requests for replacement Basics for Stolen displays @ + } Else { + Send %stln_case%{Tab} + Send Received a request for replacement Basics for a Stolen display @ + } + Sleep, 1000 + Send Stellar + Sleep, 1500 + Send {Down}{Tab}:{Enter 2} + Sleep, 1000 + Send {ShiftDown}{Tab 2}{ShiftUp} + Sleep, 1000 + Send {Right 17} + Sleep, 1000 + Send {Enter} + Sleep, 1000 + Send {Right} + Send {Enter} + Sleep, 1000 + If (glovar_array["Info"].Count() > 1) + { + Loop, % glovar_array["Info"].Count() { + If (A_Index < glovar_array["Info"].Count()) + { + table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?{Tab 2}" + } Else { + table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?" + } ; That way it doesn't put the extra line at the very end + Send %table% + } + } Else { + Send Case{Tab}%stln_case%{Tab}Stolen{Tab}%stln_s%{Tab}Replacement{Tab}%stln_r%{Enter}%stln_cc%{Tab}Machine PIN{Tab}%stln_v%{Tab}Model, Year{Tab 2}Should it qualify?{Up 2}{Tab} + } +Return + +; Transferring to DTAC +:*:]DTAC:: + Send The ISG Global Support Center has determined that this case is hardware related`; therefore, this case is being transferred from the Global Support Center to the ISG DTAC group. A DTAC technician will now work this case via the DTAC system and provide a recommendation in the case Text if more information is needed or if a solution has been found. Please continue to update or check on the progress of this case by using the DTAC system Case Text section moving forward. +Return + +; Transferring to Tier2 +:*:]rrt:: + Send This case was unable to be resolved and has been transferred to another team. Our Tier 2 team is investigating the issue to find a short-term resolution. We will update you as soon as we have a recommendation. +Return + +; Update after 5 business days +:*:]upd:: + Send A short-term resolution still has not been identified. We are requesting an immediate update on this case from our Tier 2 team. We will contact you as soon as we have a status update. +Return + +; Requesting info +:*:]req:: + Send A request has been made for additional information in this case. Please provide the following information as soon as possible so this case can be resolved. +Return + +; Dealer defect +:*:]ddefect:: + Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please have your field team contact the appropriate Product Support Representative. +Return + +; Customer defect +:*:]cdefect:: + Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please contact your preferred dealer and the field team can contact the appropriate Product Support Representative. +Return + +; Workbasket shortcuts, place mouse over Transfer button before typing +:*:]pd:: +Send PCDSC +Send {Click} +Return + +:*:]pr:: +Send PCRRT +Send {Click} +Return + +:*:]p2:: +Send PCTIER2 +Send {Click} +Return + +;------------------------------------------------------------------------------ +; Email +;------------------------------------------------------------------------------ +:*:]email:: + Send Hello,{Enter 2}{Space 3} +Return + +; German +#If (ger) +:*:[email:: + Send Hallo,{Enter 2}{Space 3} +Return +#If + + +;------------------------------------------------------------------------------ +; Profile email paste +;------------------------------------------------------------------------------ +; So when editing Profiles, it won't let you paste in the email field. We don't like that. Make sure to let go of all keys immediatley after pressing this +#If (mjdpaste) +#v:: + sleep, 750 + SendInput %clipboard% + sleep, 500 + send # ; to make sure the start menu isn't open for some reason +Return +#If + +;------------------------------------------------------------------------------ +; Common Terms autocorrect and replacement +;------------------------------------------------------------------------------ +; JD Names +#If (jdpn) + :*:[xx::XXXXXXXXXXXXX ; I'm not gonna try and find the right amount of X's to appease the CCMS demons + :*:]xx::XXXXXXXXXXXXX +; English + :*:]at::AutoTrac + :*:]ba::Basics & AutoTrac + :*:]sf::StarFire + :*:]jdl::JDLink + :*:]jdp::JDParts + :*:]mjd::MyJohnDeere + :*:]opsc::Operations Center + :*:]seccon::Section Control + :*:]gs::GreenStar + :*:]cc::CommandCenter + :*:]fc::Field Connect + :*:]rs::RowSense + :*:]sub::subscription + :*:]ss::Stellar Support + :*:]tman::Technical Manual + :*:]oman::Operator's Manual + :*:]hl3::HarvestLab 3000 + :*:]hlo::Original HarvestLab + :*:]bin::Virtual Inventory + :*:]warrep::Warranty Reports + :*:]tcsm::Territory Customer Support Manager + :*:]jdsm::John Deere Software Manager + :*:]jddm::John Deere Data Manager + :*:]serva::Service Advisor + :*:]muc::Master Unlock Code + :*:]asmn::Asset Manager + :*:]bsm::Base Station Manager + + :*:]sas::See & Spray + + ::rowsense::RowSense + :*:comar::COMAR + ::mrtk::mRTK + ::rda::RDA + ::rtk::RTK + ::autotrac::AutoTrac + :*:ccms::CCMS + :*:dtac::DTAC + ::tcsm::TCSM + ::itec::iTEC Pro + ::ssu::SSU + ::atu::ATU + :*:mtg::MTG + ::wdt::WDT + ::itc::iTC + :*:vin::Machine PIN ; Not actually vehicles, so they don't have VINs + ::gs2::GS2 + ::gs3::GS3 + ::sf1::SF1 + ::sf2::SF2 + ::sf3::SF3 + ::sf4::SF4 + ::xid::xID + ::pmcalc::PMCalc + ::vat::VAT + :*:racf::RACF + ::igrade::iGrade + :*:JDCP::JDCP + :*:ISOBUS::ISOBUS + + +; German +#If (ger) + :*:[at::AutoTrac + :*:[ba::Basics & AutoTrac + :*:[sf::StarFire + :*:[jdl::JDLink + :*:[jdp::JDParts + :*:[mjd::MyJohnDeere + :*:[opsc::Einsatzzentrale + :*:[seccon::Teilbreitensteuerung + :*:[gs::GreenStar + :*:[cc::CommandCenter + :*:[fc::Field Connect + :*:[rs::RowSense + :*:[sub::Abonnement + :*:[ss::Stellar Support + :*:[tman::Technische Betriebsanleitung + :*:[oman::Betriebsanleitung + :*:[hl3::HarvestLab 3000 + :*:[hlo::Originales HarvestLab + :*:[bin::Virtuellen Bestand + :*:[warrep::Warranty Reports + :*:[tp::TouchPoint + :*:[tcsm::Technischer Bezirksleiter + :*:[jdsm::John Deere Software Manager + :*:[jddm::John Deere Data Manager + :*:[serva::Service Advisor + :*:[muc::Master Unlock Code + :*:[asmn::Asset Manager + :*:[bsm::Base Station Manager +#If + + +;------------------------------------------------------------------------------ +; QoL Improvements +;------------------------------------------------------------------------------ +:*:]me:: + Send, % Format("{:U}", A_UserName) +Return + +:*:[me:: + Send, % Format("{:U}", A_UserName) +Return + +#If !(email = "LastnameFirstname@JohnDeere.com") + :*:@me:: + Send, %email% +Return +#If + +#j:: ; Open the downloads folder on Win+J + Run, C:\Users\%A_UserName%\Downloads +Return + +:*:[now:: +:*:]now:: + SendInput, % GetDateTime("ISO8601") ; Send the current time/date in ISO8601 format +Return + +:*:[today:: +:*:]today:: + SendInput, % GetDateTime("date") ; Send the current date in ISO8601 format +Return + +:*:[deg::{ASC 248} +:*:]deg::{ASC 248} +:*:[eq::{ASC 247} +:*:]eq::{ASC 247} + +:*:[shrug::¯\_(ツ)_/¯ +:*:]shrug::¯\_(ツ)_/¯ + +:*:[ltd::License to Deere™ +:*:]ltd::License to Deere™ + + +docs: + run https://www.autohotkey.com/docs/AutoHotkey.htm +Return + +F19:: Run D3K.ahk \ No newline at end of file diff --git a/Mansol_Opener.ahk b/Mansol_Opener.ahk index bb7aa60..d3aee3e 100644 --- a/Mansol_Opener.ahk +++ b/Mansol_Opener.ahk @@ -1,3 +1,32 @@ +#SingleInstance force ; Only one instance at a time +SendMode, Input +FileEncoding, UTF-8 ; Makes sure the special characters don't break stuff + +Menu, Tray, Icon, %A_MyDocuments%\D3K\icons\manual.ico + +Gui, +AlwaysOnTop +ToolWindow + +Gui, Add, Edit, x2 y3 w78 h20 vNumber +Left, +Gui, Add, Button, x22 y43 w70 h20 Default vHidden, Ok +Gui, Add, Button, x81 y3 w17 h20 gHelp +Center, ? +Gui, Show, h28 w100, ManSol +GuiControl, Hide, Hidden + +Return + +ButtonOk: + Gui, submit ; I have no idea what the regex means any more... + If RegExMatch(Number, "[[:alpha:]]+") + run, % "http://serviceadvisor.deere.com/WebSA/manuals/" . Number + Else If RegExMatch(Number, "[[:digit:]]+") + run, % "https://serviceadvisor.deere.com/WebSA/solutions/en/" . Number + ExitApp +Return + + +Help: + MsgBox, 262176, Maual & Solution opener, Input the TM/OM SKU (easily ofund on TechPubs) or the DTAC solution number to open it in your default browser.`nTMs & OMs open in Service Advisor. +Return GuiClose: GuiEscape: diff --git a/msmv.ahk b/msmv.ahk index 932a0bf..1c4a871 100644 --- a/msmv.ahk +++ b/msmv.ahk @@ -1,3 +1,62 @@ +#SingleInstance, force +CoordMode, Mouse, Screen + +waittime := 120000 + +Switch A_Args[1] +{ +Case "on": + Menu, Tray, NoIcon + Goto, Start +Case "off": + ExitApp +} + +Menu, Tray, Add, Hide GUI, GuiToggle ; Adds a button to toggle the gui +Menu, Tray, Add, Exit, GuiClose ; Exit button +Menu, Tray, NoStandard ; None of the standard tray buttons +Gui, +AlwaysOnTop +ToolWindow +Gui, Add, Button, x3 y3 w55 h20 gStart +Center, Start +Gui, Add, Button, x3 y3 w55 h20 gStop +Center, Stop +Gui, Show, h28 w60, msmv +GuiControl, Hide, Stop ; Since we want the Start button to show first +Return + +Start: + GuiControl, Hide, Start + SetTimer, Msmv, %waittime% ; Checks if the has been input in the last 2 minutes every 30 secs, easier to stop a loop with SetTimer + GuiControl, Show, Stop +Return + +Stop: + GuiControl, Hide, Stop + SetTimer, Msmv, off + GuiControl, Show, Start +Return + +Msmv: + If (A_TimeIdle > waittime) ; https://www.autohotkey.com/docs/Variables.htm#User_Idle_Time + { + Random, x,, %A_ScreenWidth% + Random, y,, %A_ScreenHeight% + MouseMove %x%, %y% + } +Return + +GuiToggle: + If !nogui + { + Gui, Hide + Menu, Tray, Check, Hide GUI + nogui := True + } + Else + { + Menu, Tray, uncheck, Hide GUI + nogui := False + Gui, Show + } +Return GuiClose: GuiEscape: -- 2.54.0 From 0fb614940f002832aeab64c8add7c5a66e18b5cf Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 14 Jul 2023 11:10:18 -0500 Subject: [PATCH 19/34] update regex for ini key search --- func.ahk | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/func.ahk b/func.ahk index cc8d08d..73151fa 100644 --- a/func.ahk +++ b/func.ahk @@ -102,9 +102,8 @@ ini_write(location, inKey, inValue) ; Don't need to specify section because you file := FileOpen(location, "r") temp := file.Read() file.Close() - inKey := "(?<=" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key - temp := RegExReplace(temp, inKey, inValue) - ; msgbox, % temp "`n`nRegex:`t" inKey "`nReplacing match with:`t" inValue + inKeyReg := "(?<=^" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key + temp := RegExReplace(temp, inKeyReg, inValue) file := FileOpen(location, "w") file.Write(temp) file.Close() -- 2.54.0 From 9b9405c7d1a9bb85f19128ddaa61feeb508133e3 Mon Sep 17 00:00:00 2001 From: David Daily Date: Mon, 17 Jul 2023 12:30:38 -0500 Subject: [PATCH 20/34] minor changes --- D3K.ahk | 1 + 1 file changed, 1 insertion(+) diff --git a/D3K.ahk b/D3K.ahk index d7683d5..1a70f01 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -487,6 +487,7 @@ Return Return #If + #j:: ; Open the downloads folder on Win+J Run, C:\Users\%A_UserName%\Downloads Return -- 2.54.0 From 9e8ed05b4ec94e6f61db2d3c7075b0bdc84363fd Mon Sep 17 00:00:00 2001 From: David Daily Date: Wed, 17 Jun 2026 12:09:10 -0500 Subject: [PATCH 21/34] update to AHK v2 --- msmv.ahk | 96 ++++++++++++++++++++++++++++++++------------------------ 1 file changed, 55 insertions(+), 41 deletions(-) diff --git a/msmv.ahk b/msmv.ahk index 1c4a871..c701009 100644 --- a/msmv.ahk +++ b/msmv.ahk @@ -1,63 +1,77 @@ -#SingleInstance, force -CoordMode, Mouse, Screen +#Requires AutoHotkey v2.0 ; v2 only +#SingleInstance force +CoordMode("Mouse", "Screen") -waittime := 120000 +waittime := 5000 +ogcStop := 13 +global nogui := False -Switch A_Args[1] +Switch A_Args { Case "on": - Menu, Tray, NoIcon - Goto, Start + Goto(Start) Case "off": - ExitApp + ExitApp() +default: + for x in A_Args { + MsgBox(x) + } } -Menu, Tray, Add, Hide GUI, GuiToggle ; Adds a button to toggle the gui -Menu, Tray, Add, Exit, GuiClose ; Exit button -Menu, Tray, NoStandard ; None of the standard tray buttons -Gui, +AlwaysOnTop +ToolWindow -Gui, Add, Button, x3 y3 w55 h20 gStart +Center, Start -Gui, Add, Button, x3 y3 w55 h20 gStop +Center, Stop -Gui, Show, h28 w60, msmv -GuiControl, Hide, Stop ; Since we want the Start button to show first -Return +myGui := Gui() +A_TrayMenu.Delete() ; None of the standard tray buttons +A_TrayMenu.Add("Hide GUI", GuiToggle()) ; Adds a button to toggle the gui +A_TrayMenu.Add("Exit", ExtMen) ; Exit button +myGui.Opt("+AlwaysOnTop +ToolWindow") +ogcButtonStart := myGui.Add("Button", "x3 y3 w55 h20 +Center", "Start") +ogcButtonStart.OnEvent("Click", Start.Bind("Normal")) +ogcButtonStop := myGui.Add("Button", "x3 y3 w55 h20 +Center Hidden", "Stop") +ogcButtonStop.OnEvent("Click", Stop.Bind("Normal")) +myGui.Title := "msmv" +myGui.Show("h28 w60") -Start: - GuiControl, Hide, Start - SetTimer, Msmv, %waittime% ; Checks if the has been input in the last 2 minutes every 30 secs, easier to stop a loop with SetTimer - GuiControl, Show, Stop -Return +Start(A_GuiEvent, GuiCtrlObj, Info, *) +{ + ogcButtonStart.Visible := false + SetTimer(Msmv,waittime) ; Checks if the has been input in the last 2 minutes every 30 secs, easier to stop a loop with SetTimer + ogcButtonStop.Visible := true +} -Stop: - GuiControl, Hide, Stop - SetTimer, Msmv, off - GuiControl, Show, Start -Return +Stop(A_GuiEvent, GuiCtrlObj, Info, *) +{ + ogcButtonStop.Visible := false + SetTimer(Msmv,0) + ogcButtonStart.Visible := true +} -Msmv: - If (A_TimeIdle > waittime) ; https://www.autohotkey.com/docs/Variables.htm#User_Idle_Time +Msmv() +{ + If (A_TimeIdle > waittime) ; https://www.autohotkey.com/docs/Variables.htm#User_Idle_Time { - Random, x,, %A_ScreenWidth% - Random, y,, %A_ScreenHeight% - MouseMove %x%, %y% + x := Random(, A_ScreenWidth) + y := Random(, A_ScreenHeight) + MouseMove(x, y) } -Return +} -GuiToggle: +GuiToggle(){ + global If !nogui { - Gui, Hide - Menu, Tray, Check, Hide GUI + myGui.Hide() + A_TrayMenu.Check("1&") nogui := True } Else { - Menu, Tray, uncheck, Hide GUI + A_TrayMenu.Uncheck("1&") nogui := False - Gui, Show + myGui.Show() } -Return +} -GuiClose: -GuiEscape: -ExitApp ; Closes the app when escape or the exit button is pressed \ No newline at end of file +; exit option from tray menu +ExtMen(A_ThisMenuItem, A_ThisMenuItemPos, MyMenu) +{ + ExitApp() +} \ No newline at end of file -- 2.54.0 From 748e3ab321f730d346e6211ba57c54d2187aa0a3 Mon Sep 17 00:00:00 2001 From: David Daily Date: Wed, 8 Jul 2026 11:54:28 -0500 Subject: [PATCH 22/34] update to AHK v2 --- func.ahk | 153 ++++++++++++++++--------------------------------------- 1 file changed, 44 insertions(+), 109 deletions(-) diff --git a/func.ahk b/func.ahk index 73151fa..cec7aef 100644 --- a/func.ahk +++ b/func.ahk @@ -1,62 +1,11 @@ -#SingleInstance force ; Only one instance at a time -SendMode, Input -FileEncoding, UTF-8 ; Makes sure the special characters dont break stuff -SetWorkingDir, %A_MyDocuments%\D3K ; Make sure we can find the .ahks linked below -SetTitleMatchMode, 2 +#Requires AutoHotkey v2 ; v2 only +#SingleInstance force ; Only one instance at a time +FileEncoding("UTF-8") ; Makes sure the special characters dont break stuff +SetWorkingDir(A_MyDocuments "\D3K") ; Make sure we can find the .ahks linked below +SetTitleMatchMode(2) -d3k_version := 3 ; The current version +global d3k_version := 3 ; The current version -GetDateTime(lang) -{ - FormatStr := "yyyy-MM-dd" ; The Date - FormatTime, DateStr, %A_NowUTC%, %FormatStr% ; format it to make it look like the Date we want - FormatStr := "H:mm'Z'" ; The time - FormatTime, TimeStr, %A_NowUTC%, %FormatStr% ; Format the string to be better - if (lang = "en") - { - Return DateStr " at " TimeStr - } - - if (lang = "de") - { - Return DateStr " um " TimeStr - } - - if (lang = "ISO8601") - { - Return DateStr "T" TimeStr - } - - if (lang = "date") - { - Return DateStr - } -} - -GetInfo(xID) -{ - if (xID) - { - File := FileOpen(A_MyDocuments "\emails.csv", "r") - Loop - { - Line := File.ReadLine() - Array := StrSplit(Line,",") ; split the line at its separating commas to get separate "columns" AKA elements - if InStr(Array[1], xID) ; if at the specified element (1) the specified content (dealers xID) has been found - { - Test := {xid: Array[1], email: Array[2], name: Array[3], user: Array[4], org: Array[5]} ; Return the array so we can do {variable}.email and so on - File.Close() ; Close the file - Return Test ; Return the array with the deets that we found - } - } Until (File.AtEOF) - File.Close() - Return false - } - if !(xID) - { - Return false - } -} ;------------------------------------------------------------------------------ ; INI Manipulation that supports UTF-8 @@ -64,49 +13,48 @@ GetInfo(xID) ini_load(location) { - out := {} - File := FileOpen(location, "r") - cleaner := File.Read() - File.Close() + temp := FileOpen(location, "r") + cleaner := temp.Read() + temp.Close() cleaner := RegExReplace(cleaner, "`am)^[\s\R]*") ; Remove empty lines cleaner := RegExReplace(cleaner, "m)[ \t]+$") ; Get rid of extra space at the end of values (NEEDS FIXED) - File := FileOpen(location, "w") - File.Write(cleaner) - File.Close() - File := FileOpen(location, "r") + temp := FileOpen(location, "w") + temp.Write(cleaner) + temp.Close() + temp := FileOpen(location, "r") + out := Object() Loop { - Line := File.ReadLine() - RegExMatch(Line, "(?
(?<=\[).*(?=\]))|(?.*)=(?.*)", r) ; Key = rKey, Value = rValue, Section = rSection - If (rSection) + Line := temp.ReadLine() + RegExMatch(Line, "(?
(?<=\[).*(?=\]))|(?.*)=(?.*)", &r) ; Key = r.Key, Value = r.Value, Section = r.Section + If (r.Section) { - rSection := Trim(rSection, " `t`r`n") ; Remove pesky newlines and extra space - rSection := StrReplace(rSection, " ", "§") ; AHK can't handle spaces in nested array names, so they're substituted with § - out[rSection]:={} - c_Section := rSection + out.%r.Section% := Map() + current_Section := r.Section } Else { - rKey := Trim(rKey, " `t`r`n") - rValue := Trim(rValue, " `t`r`n") - out[c_Section, rKey] := rValue + trimKey := Trim(r.Key, " `t`r`n") + trimValue := Trim(r.Value, " `t`r`n") + out.%current_Section%[trimKey] := trimValue } - } Until (File.AtEOF) - File.Close() + } Until (temp.AtEOF) + temp.Close() Return out } ini_write(location, inKey, inValue) ; Don't need to specify section because you can only have one hotstring anyway { - Critical, On - file := FileOpen(location, "r") - temp := file.Read() - file.Close() - inKeyReg := "(?<=^" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key + Critical("On") + ini := FileOpen(location, "r") + temp := ini.Read() + ini.Close() + inKeyReg := "(?<=" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key temp := RegExReplace(temp, inKeyReg, inValue) - file := FileOpen(location, "w") - file.Write(temp) - file.Close() + ini := FileOpen(location, "w") + ini.Write(temp) + ini.Close() + Critical("Off") } @@ -117,52 +65,39 @@ sett_ini := A_MyDocuments "\D3Ksettings.ini" ; Where the settings ini is If !FileExist(sett_ini) ; Check if the sett_ini doesn't exist { - file := FileOpen(sett_ini, "w") + ini := FileOpen(sett_ini, "w") writethis := " ( LTrim [USpec] Email=LastnameFirstname@JohnDeere.com - Name=Firstname DocFile=Select File [Main] - Mansol=1 MJDPaste=1 - CaseFormatter=1 - CFmail=0 - [Replacement] JDProductNames=1 GloVar=0 [Language] German=0 )" - file.Write(writethis) + ini.Write(writethis) file.Close() - Run Settings.ahk ; Runs the GUI for changing the settings, accessible with Alt+Shift+\ (also easy way to restart this script) + Run("Settings.ahk") ; Runs the GUI for changing the settings, accessible with Alt+Shift+\ (also easy way to restart this script) } ;------------------------------------------------------------------------------ ; Read the sett_ini ;------------------------------------------------------------------------------ -; This is the part that reads the file to see what your settings are. Variables in the sett_ini file are in all CamelCase, variables here are lowercase for more distinction +; This is the part that reads the file to see what your settings are. -settings := {} -settings := ini_load(sett_ini) +global settings := ini_load(sett_ini) +; started as global variables, keeping this commented out in case there's some old script where I need to replace something ; User Specific things: -email := settings["USpec", "Email"] -name := settings["USpec", "Name"] -docfile := settings["USpec", "DocFile"] - -; General Settings -mansol := settings["Main", "Mansol"] -supadmin := settings["Main", "Supadmin"] -mjdpaste := settings["Main", "MJDPaste"] -caseformatter := settings["Main", "CaseFormatter"] -cfmail := settings["Main", "CFmail"] +;global email := settings.USpec["Email"] +;global docfile := settings.USpec["DocFile"] ; Replacement -jdpn := settings["Replacement", "JDProductNames"] -glovar := settings["Replacement", "GloVar"] +;global jdpn := settings.Replacement["JDProductNames"] +;global glovar := settings.Replacement["GloVar"] ; Language -ger := settings["Language", "German"] \ No newline at end of file +;global ger := settings.Language["German"] \ No newline at end of file -- 2.54.0 From 31ab7b9c590e9c544f6a61338aa8911642c610f2 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:14:42 -0500 Subject: [PATCH 23/34] Update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f18a7f9..6a38854 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ *.code-workspace SmartGooey/* -Projects/* \ No newline at end of file +Projects/* +emails.example.csv +.gitignore +.zip \ No newline at end of file -- 2.54.0 From a704be908820b1876ca71204b1bffbc59c799291 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:15:27 -0500 Subject: [PATCH 24/34] Delete Case_Formatter.ahk --- Case_Formatter.ahk | 346 --------------------------------------------- 1 file changed, 346 deletions(-) delete mode 100644 Case_Formatter.ahk diff --git a/Case_Formatter.ahk b/Case_Formatter.ahk deleted file mode 100644 index 8083979..0000000 --- a/Case_Formatter.ahk +++ /dev/null @@ -1,346 +0,0 @@ -#Include, func.ahk - -; Holy crap I need to rewrite this for v3... - - -SetTitleMatchMode, 2 - -; These next 3 options make it so that it's always on top, it there are no buttons, and doesn't show up in the alt-tab or taskbar -Gui,+AlwaysOnTop -Gui, +ToolWindow - -Contact := 2 - -CurrTimeEN := GetDateTime("en") -CurrTimeDE := GetDateTime("de") - -;------------------------------------------------------------------------------ -; GUI creation -;------------------------------------------------------------------------------ -; The & in front of the letters lets you hold alt and press the first letter instead of having to click on it. That is why its "Mail", not "E-Mail" - -Gui, Add, Radio, x12 y3 w60 h20 Group vLang Checked, &English ; First group of Radio buttons -Gui, Add, Radio, x12 y23 w60 h20, &German - -Gui, Add, Radio, x82 y3 w60 h20 Group vAct, &Warrant -Gui, Add, Radio, x82 y23 w60 h20, &Demo - -Gui, Add, Text, x75 y46 w150 h20 gTime, %CurrTimeEN% - -Gui, Add, Button, x12 y43 w55 h20 Default vHidden, Go ; That way you don't have to have an actual button, it just happens when you press enter. - -if (cfmail) -{ - Gui, Add, Radio, x142 y3 w80 h20 Group vContact Checked, E-&Mail ; Second group of Radio buttons - Gui, Add, Radio, x142 y23 w80 h20 , &Call - Gui, Show, h70 w210, Contact -} Else { - Gui, Show, h70 w145, Contact -} - -Return - -Time: -Run, addemail.ahk - -GuiClose: -GuiEscape: -ExitApp -;------------------------------------------------------------------------------ -; Buttons -;------------------------------------------------------------------------------ - - -ButtonGo: - Gui, submit - Goto, Write -Return - -/* -Contact -Mail: 1 -Call: 2 - -Lang -English: 1 -German: 2 - -Act -Warrant: 1 -Demo: 2 -*/ - -Write: -{ - FileRead, NewLine, %docfile% ; Read the documentation file - If (NewLine != "") ; If there is something in the file, this would return a string - { - FileAppend,`n`n`n`n, %docfile% ; Inserts a new line so that it isn't just appended directly to the end - } - NewLine := "" ; Free up Memory cause this could be quite a bit of stuff - - - ;------------------------------------------------------------------------------ - ; Email - ;------------------------------------------------------------------------------ - - If (Contact = "1") - { - If (Lang = "1") ; English - { - If (Act = "0") ; Not an activation - { - FileAppend,Dealer emailed: "", %docfile% - } - - - If (Act = "1") ; Warrant - { - FileAppend,Dealer emailed for warrant transfer: ""`n`nOld SN: `nNew SN: `nChallenge Code: `n`n, %docfile% - } - - If (Act = "2") ; Demo - { - FileAppend,Dealer emailed for `n`nSN: `nChallenge Code: `n`n, %docfile% - } - } - - Else If (Lang = "2") ; German - { - If (Act = "0") ; Not an activation - { - FileAppend,Händler emailte: "", %docfile% - } - - Else If (Act = "1") ; Warrant - { - FileAppend,Händler emailte für Garantieübertragung`n`nAlte SN: `nNeue SN: `nAuthentisierungscode: `n`n, %docfile% - } - - Else If (Act = "2") ; Demo - { - FileAppend,Händler emailte für `n`nSN: `nAuthentisierungscode: `n`n, %docfile% - } - } - } - - - ;------------------------------------------------------------------------------ - ; Call - ;------------------------------------------------------------------------------ - - Else If (Contact = "2") - { - If (Lang = "1") ; English - { - FileAppend, Call received %CurrTimeEN%.`n`n, %docfile% - If (Act = "0") ; Not an activation - { - FileAppend,Dealer called for , %docfile% - } - - Else If (Act = "1") ; Warrant - { - FileAppend,Dealer called for Warrant transfer`nOld SN: `nNew SN: `nChallenge Code: `n`n, %docfile% - } - - Else If (Act = "2") ; Demo - { - FileAppend,Dealer called for Demo`nSN: `nChallenge Code: `n`n, %docfile% - } - } - - Else If (Lang = "2") ; German - { - FileAppend, Anruf wurde %CurrTimeDE% entgegengenommen.`n`n, %docfile% - - If (Act = "0") ; Not an activation - { - FileAppend,Händler rief an mit , %docfile% - } - - Else If (Act = "1") ; Warrant - { - FileAppend,Händler rief an für Garantieübertragung`nAlte SN: `nNeue SN: `nAuthentisierungscode: `n`n, %docfile% - } - - Else If (Act = "2") ; Demo - { - FileAppend,Händler rief an für Demo`nSN: `nAuthentisierungscode: `n`n, %docfile% - } - } - } - - ExitApp -}#Include, func.ahk - -SetTitleMatchMode, 2 - -; These next 3 options make it so that it's always on top, it there are no buttons, and doesn't show up in the alt-tab or taskbar -Gui,+AlwaysOnTop -Gui, +ToolWindow - -docfile := ini_get(ini, "USpec", "DocFile") -cfmail := ini_get(ini, "Main", "CFmail") -Contact := 2 - -CurrTimeEN := GetDateTime("en") -CurrTimeDE := GetDateTime("de") - -;------------------------------------------------------------------------------ -; GUI creation -;------------------------------------------------------------------------------ -; The & in front of the letters lets you hold alt and press the first letter instead of having to click on it. That is why its "Mail", not "E-Mail" - -Gui, Add, Radio, x12 y3 w60 h20 Group vLang Checked, &English ; First group of Radio buttons -Gui, Add, Radio, x12 y23 w60 h20, &German - -Gui, Add, Radio, x82 y3 w60 h20 Group vAct, &Warrant -Gui, Add, Radio, x82 y23 w60 h20, &Demo - -Gui, Add, Button, x12 y43 w55 h20 Default vHidden, Go ; That way you don't have to have an actual button, it just happens when you press enter. - -if (cfmail) -{ - Gui, Add, Radio, x142 y3 w80 h20 Group vContact Checked, E-&Mail ; Second group of Radio buttons - Gui, Add, Radio, x142 y23 w80 h20 , &Call - Gui, Add, Text, x75 y46 w150 h20 gTime, %CurrTimeEN% - Gui, Show, h70 w210, Contact -} Else { - Gui, Show, h70 w145, Contact -} - -Return - -Time: -Run, addemail.ahk - -GuiClose: -GuiEscape: -ExitApp -;------------------------------------------------------------------------------ -; Buttons -;------------------------------------------------------------------------------ - - -ButtonGo: - Gui, submit - Goto, Write -Return - -/* -Contact -Mail: 1 -Call: 2 - -Lang -English: 1 -German: 2 - -Act -Warrant: 1 -Demo: 2 -*/ - -Write: -{ - FileRead, NewLine, %docfile% ; Read the documentation file - If (NewLine != "") ; If there is something in the file, this would return a string - { - FileAppend,`n`n`n`n, %docfile% ; Inserts a new line so that it isn't just appended directly to the end - } - NewLine := "" ; Free up Memory cause this could be quite a bit of stuff - - - ;------------------------------------------------------------------------------ - ; Email - ;------------------------------------------------------------------------------ - - If (Contact = "1") - { - If (Lang = "1") ; English - { - If (Act = "0") ; Not an activation - { - FileAppend,Dealer emailed: "", %docfile% - } - - If (Act = "1") ; Warrant - { - FileAppend,Dealer emailed for warrant transfer: ""`n`nOld SN: `nNew SN: `nChallenge Code: `n`n, %docfile% - } - - If (Act = "2") ; Demo - { - FileAppend,Dealer emailed for `n`nSN: `nChallenge Code: `n`n, %docfile% - } - } - - Else If (Lang = "2") ; German - { - If (Act = "0") ; Not an activation - { - FileAppend,Händler emailte: "", %docfile% - } - - Else If (Act = "1") ; Warrant - { - FileAppend,Händler emailte für Garantieübertragung`n`nAlte SN: `nNeue SN: `nAuthentisierungscode: `n`n, %docfile% - } - - Else If (Act = "2") ; Demo - { - FileAppend,Händler emailte für `n`nSN: `nAuthentisierungscode: `n`n, %docfile% - } - } - } - - - ;------------------------------------------------------------------------------ - ; Call - ;------------------------------------------------------------------------------ - - Else If (Contact = "2") - { - If (Lang = "1") ; English - { - FileAppend, Call received %CurrTimeEN%.`n`n, %docfile% - If (Act = "0") ; Not an activation - { - FileAppend,Dealer called for , %docfile% - } - - Else If (Act = "1") ; Warrant - { - FileAppend,Dealer called for Warrant transfer`nOld SN: `nNew SN: `nChallenge Code: `n`n, %docfile% - } - - Else If (Act = "2") ; Demo - { - FileAppend,Dealer called for Demo`nSN: `nChallenge Code: `n`n, %docfile% - } - } - - Else If (Lang = "2") ; German - { - FileAppend, Anruf wurde %CurrTimeDE% entgegengenommen.`n`n, %docfile% - - If (Act = "0") ; Not an activation - { - FileAppend,Händler rief an mit , %docfile% - } - - Else If (Act = "1") ; Warrant - { - FileAppend,Händler rief an für Garantieübertragung`nAlte SN: `nNeue SN: `nAuthentisierungscode: `n`n, %docfile% - } - - Else If (Act = "2") ; Demo - { - FileAppend,Händler rief an für Demo`nSN: `nAuthentisierungscode: `n`n, %docfile% - } - } - } - - ExitApp -} -- 2.54.0 From 03f34dd75e0369b288bb85edd1d224a9ec6a5cab Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:17:30 -0500 Subject: [PATCH 25/34] upgrade to ahk v2 --- D3K.ahk | 561 ++++++++++++++++++++++---------------------------------- 1 file changed, 221 insertions(+), 340 deletions(-) diff --git a/D3K.ahk b/D3K.ahk index 1a70f01..5088995 100644 --- a/D3K.ahk +++ b/D3K.ahk @@ -1,128 +1,100 @@ -#Include, func.ahk +#Include "func.ahk" +#Include Peep.v2.ahk -Menu, Tray, Icon, shell32.dll, 283 ; Set the tray icon to a keyboard -Menu, Tray, Add, &Mouse Mover, Mouse_Mover ; Add item to the tray to move the mouse -Menu, Tray, Add, Settings, D3K_Settings ; Add item to the tray to move the mouse -Menu, Tray, Add, %A_AhkVersion%, docs +DetectHiddenWindows true +A_TrayMenu.Add("&Mouse Mover", MsMv) ; Add item to the tray to move the mouse +A_TrayMenu.Add("&Settings", D3K_Settings) ; Add item to the tray for the settings window +A_TrayMenu.Add(A_AhkVersion, docs) ;------------------------------------------------------------------------------ ; Global Variables ;------------------------------------------------------------------------------ -If (glovar) +If (settings["GloVar"]) { - SetTimer, GloVar, 2000 ; Check every 2 seconds + global glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies + global gvMod := FileGetTime(glovarini) + SetTimer(GloVar, 2000) ; Check every 2 seconds - GloVar: - glovarini := A_MyDocuments "\GloVar.ini" ; Location of the ini that the user modifies - glovarscript := A_Temp "\GloVar.ahk" ; Doesn't need to be anywhere useful as it doesn't contain any external references - ;FileGetTime, gvMod, %glovarini%, M - glovarstart := "#SingleInstance force`n#NoTrayIcon`nSendMode, Input`nFileEncoding, UTF-8`n" - If (WinActive("GloVar.ini")) ; Only run when the window isn't active, prevents accidential editing by this while the user is - { - Return - } - FileGetTime, gvModNew, %glovarini%, M + GloVar(*){ + If !(WinActive("GloVar.ini")){ ; Only run when the window isn't active, prevents accidential editing by the script while the user is editing + gvModNew := FileGetTime(glovarini) If !(gvModNew = gvMod) ; Those two lines mean the rest of this only executes if there were changes to the ini. { - SetTimer, GloVar, Off - hotstrings := "" - glovar_array := ini_load(glovarini) - For sec in glovar_array + glovarscript := A_Temp "\GloVar.ahk" ; self-contained, no reference to any other AHK scripts + glovarstart := "#Requires AutoHotkey v2`n#SingleInstance force`n#NoTrayIcon`n" + hotstrings := "" ; Stop ahk from complaining about it not having a value. Just ignore it bro + SetTimer(GloVar, 0) ; Stop the timer while we work on the file + glovar_map := ini_load(glovarini) + For section in glovar_map { + For key, value in glovar_map[section] { - For key, value in glovar_array[sec] + Switch section, 0 { - If (value) - { - sec := StrReplace(sec, "§", " ") ; AHK can't handle spaces in nested array names, so they're substituted with § when entered into the array. This reverses that. - StringCaseSense, Off ; Make sure the capitalization doesn't matter - Switch sec + Case "Serial Numbers": + value := StrUpper(value) ; Makes it uppercase + ini_write(glovarini, key, value) + Case "Info": + If (key = "case") { - Case "Serial Numbers": - StringUpper, value, value ; Makes it uppercase - ini_write(glovarini, key, value) - Case "Info": - If (key = "case") - { - StringUpper, value, value ; Makes it uppercase, just in case it was manually typed - value := Trim(value, "()") - ini_write(glovarini, key, value) ; Writes the properly formatted case number to glovar.ini - } - Case "Clear": ; Will clear the ini and save its and the documentation file's contents to a log - temp := FileOpen(docfile, "r") - doctemp := temp.Read() - temp.Close() - temp := FileOpen(glovarini, "r") - initemp := temp.Read() - temp.Close() - initemp := RegExReplace(initemp, "i)(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info, case insensitive - CurrTime := GetDateTime("en") ; get the current date and time as "YYYY-MM-DD at HH:MM GMT" - temp := FileOpen(A_MyDocuments "/D3KLog.txt", "a") - writethis := "Case on " . CurrTime . "`n`n`n" . doctemp . "`n`n" . initemp ; Save the current time, what was in the doc file, and glovarini to a variable - temp.Write("`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") - temp.Close() - temp := FileOpen("glovarsource", "r") - glovarsource := temp.Read() - temp.Close() - temp := FileOpen(glovarini, "w") - temp.Write(glovarsource) ; Overwrite .ini for a clean slate - temp.Close() - temp := FileOpen(docfile, "w") ; Overwrites documentation for a clean slate - temp.Close() - script := FileOpen(glovarscript, "w") - script.Write(glovarstart) - script.Close() - Run, %A_AhkPath% %glovarscript% ; Just in case. Don't want an old version running. - ToolTip, Cleared - Sleep, 500 - ToolTip - FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - SetTimer, GloVar, On - Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable - Case (RegExMatch(sec, "i)sdrbr(\d*)", m) ? sec : !sec): ; for cases with Stolen displays - If (m1) ; sometimes there are multiple stolen displays, this is to account for that. - { - writethis := "[Serial Numbers]" - Loop, % m1 - writethis .= "`ns" A_Index "=`nr" A_Index "=`ncc" A_Index "=`nv" A_Index "=" - writethis .= "`n[Info]" - Loop, % m1 - writethis .= "`ncase" A_Index "=" - } Else { - writethis := "[Serial Numbers]`ns=`nr=`ncc=`nv=`n[Info]`ncase=" glovar_array[sec, "case"] - } - temp := FileOpen(glovarini, "w") - temp.Write(writethis) - temp.Close() - script := FileOpen(glovarscript, "w") - script.Write(glovarstart) - script.Close() - SetTimer, GloVar, On - Goto, GloVar ; Don't do anything else below this line, Break wasn't taking "GloVar" as a variable + value := StrUpper(value) ; Makes it uppercase, just in case it was manually typed + ini_write(glovarini, key, value) ; Writes the properly formatted case number to glovar.ini } - hotstrings .= "`n:*:$" key "::" value - } + Case "Clear": ; Will clear the ini and save its and the documentation file's contents to a log + temp := FileOpen(settings["DocFile"], "r") + doctemp := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "r") + initemp := temp.Read() + temp.Close() + initemp := RegExReplace(initemp, "i)(?<=\[)clear(?=\])", "Info") ; Replace the "clear" section we set with Info, case insensitive + temp := FileOpen(A_MyDocuments "/D3KLog.txt", "a") + writethis := "Case on " FormatTime(A_NowUTC, "yyyy-MM-dd") "`n`n" doctemp "`n`n" initemp ; Save the current time, what was in the doc file, and glovarini to a variable + temp.Write("`n`n" writethis "`n`n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~") + temp.Close() + temp := FileOpen("glovarsource", "r") + glovarsource := temp.Read() + temp.Close() + temp := FileOpen(glovarini, "w") + temp.Write(glovarsource) ; Overwrite .ini for a clean slate + temp.Close() + temp := FileOpen(settings["DocFile"], "w") ; Overwrites documentation for a clean slate + temp.Close() + script := FileOpen(glovarscript, "w") + script.Encoding := "UTF-8" + script.Write(glovarstart) + script.Close() + Run(glovarscript) ; Just in case. Don't want an old version running. + ToolTip("Cleared") + Sleep(500) + ToolTip() + global gvMod := FileGetTime(glovarini) ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer(GloVar, 2000) ; Check every 2 seconds + Return } + If (value){ ; skip trying to write a hotstring that doesn't do anything + hotstrings .= "`n:*:$" key "::" value + } + }} + If (hotstrings){ ; skip trying to write to the file if there aren't any hotstrings (as in any time it's cleared) + script := FileOpen(glovarscript, "w") + script.Write(glovarstart hotstrings) + script.Close() + Run(A_AhkPath " " glovarscript) + ToolTip("GloVars updated") + Sleep(500) + ToolTip() + } + global gvMod := FileGetTime(glovarini) ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code + SetTimer(GloVar, 2000) ; Check every 2 seconds + If (settings["msmv"] = "no-running" or settings["msmv"] = "yes-running") ; might as well update the checkboxes in the menu + { + A_TrayMenu.Check("&Mouse Mover") + } else { ; have to include ampersand to refer to it by name! + A_TrayMenu.UnCheck("&Mouse Mover") } - file := FileOpen(glovarini, "r") - temp := file.Read() - file.Close() - temp := RegExReplace(temp, "`am)^[\s\R]*") ; Get rid of empty lines - temp := RegExReplace(temp, "m)[ \t]+$") ; Get rid of extra space at the end of strings - temp := Trim(temp, " `t`r`n") ; Remove pesky newlines and extra space at the end - file := FileOpen(glovarini, "w") - file.Write(temp) - file.Close() - script := FileOpen(glovarscript, "w") - script.Write(glovarstart hotstrings) - script.Close() - Run, %A_AhkPath% %glovarscript% - ToolTip, GloVars updated - Sleep, 500 - ToolTip - FileGetTime, gvMod, %glovarini%, M ; Make sure that this script knows what the ini was changed to so it doesn't constantly run through the above code - SetTimer, GloVar, On } + }} Return } @@ -130,59 +102,60 @@ If (glovar) ;------------------------------------------------------------------------------ ; Settings window ;------------------------------------------------------------------------------ -D3K_Settings: -!+\::Run Settings.ahk ; Alt+Shift+\ -Return +!+\::D3K_Settings() ; Alt+Shift+\ +D3K_Settings(*) +{ + Run("Settings.ahk") +} +docs(*){ + Run("https://www.autohotkey.com/docs/AutoHotkey.htm") +} ;------------------------------------------------------------------------------ -; Mouse Mover +; Mouse Mover todo: autostart ;------------------------------------------------------------------------------ -Mouse_Mover: - If (msmv_active = True) - { - Run, %A_AhkPath% "msmv.ahk" "off" - msmv_active := False ; Have to do this cause AHK doesn't have a builtin function to detect if something is checked or not. - Menu, Tray, Uncheck, &Mouse Mover - +MsMv(ItemName, ItemPos, MyMenu) +{ + settings := ini_load(sett_ini) + switch settings["msmv"] { ; couldn't find a good way to detect if it's running or not so now we have this. + case "always-running": ; run at refresh of d3k. if currently running, stop + Run A_ScriptDir "\msmv.ahk off" + MyMenu.Uncheck(ItemName) + ini_write(sett_ini, "msmv", "always-stopped") + case "always-stopped": ; run at refresh, currently stopped. if currently stopped, start + Run A_ScriptDir "\msmv.ahk on" + MyMenu.Check(ItemName) + ini_write(sett_ini, "msmv", "always-running") + case "no-running": ; don't run at refresh, currently running. if currently running, stop + Run A_ScriptDir "\msmv.ahk off" + MyMenu.Uncheck(ItemName) + ini_write(sett_ini, "msmv", "no-stopped") + case "no-stopped": ; don't run at refresh, currently stopped. if currently stopped, start + Run A_ScriptDir "\msmv.ahk on" + MyMenu.Check(ItemName) + ini_write(sett_ini, "msmv", "no-running") + default: + MsgBox("Unexpected value `"" settings["msmv"] "`" in D3Ksettings.ini") + Reload } - Else - { - Run, %A_AhkPath% "msmv.ahk" "on" - msmv_active := True - Menu, Tray, Check, &Mouse Mover +} + +cleanup(*) ; to make sure msmv closes when we close d3k +{ + settings := ini_load(sett_ini) + switch settings["msmv"] { ; couldn't find a good way to detect if it's running or not so now we have this. + case "always-running": ; run at refresh of d3k. if currently running, stop + Run A_ScriptDir "\msmv.ahk off" + ini_write(sett_ini, "msmv", "always-stopped") + case "no-running": ; don't run at refresh, currently running. if currently running, stop + Run A_ScriptDir "\msmv.ahk off" + ini_write(sett_ini, "msmv", "no-stopped") } -Return +} +OnExit cleanup -;------------------------------------------------------------------------------ -; DTAC Solution Opener -;------------------------------------------------------------------------------ -#If (mansol) ; checks from the variable thats set from the .sett_ini file - !+S::Run Mansol_Opener.ahk ; Alt+Shift+S -#If - - -;------------------------------------------------------------------------------ -; Case Formatter -;------------------------------------------------------------------------------ -#If (CaseFormatter) - Pause::Run Case_Formatter.ahk ; The Pause|Break key -#If - - -;------------------------------------------------------------------------------- -; Special Characters -;------------------------------------------------------------------------------- -#If (ger) - !s::Send {U+00DF} ;Alt+S scharfes s / Eszett / ß - !a::Send {U+00E4} ;Alt+a ä - +!A::Send {U+00C4} ;Alt+A Ä - !o::Send {U+00F6} ;Alt+o ö - +!O::Send {U+00D6} ;Alt+O Ö - !u::Send {U+00FC} ;Alt+u ü - +!U::Send {U+00DC} ;Alt+U Ü -#If ;------------------------------------------------------------------------------- ; Capitalise dates @@ -206,7 +179,7 @@ Return ::december::December ; German -#If (ger) +#HotIf (settings["German"]) ::montag::Montag ::dienstag::Dienstag ::mittwoch::Mittwoch @@ -223,163 +196,45 @@ Return ::juli::Juli ::oktober::Oktober ::dezebmer::Dezember -#If +#HotIf -;------------------------------------------------------------------------------ -; Copypastas -;------------------------------------------------------------------------------ -; STWA Applied -:*:]cmy:: - Send STWA applied{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} -Return - -; STWA not available -:*:]cmn:: - Send STWA not available{Enter 2}Status: Providing information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}{Enter 2}SQL:{Enter} -Return - -; Need info -:*:]cmr:: - Send STWA available{Enter 2}Status: Requesting information{Enter 2}Comments: {Enter 2}Thank you,{Enter}%name%{Enter 2}Tier 2 internal steps:{Space}Verify information{Enter 2}SQL:{Enter} -Return - -:*:]sdrbr:: - glovar_array := ini_load(glovarini) - For sec in glovar_array - { - For key, value in glovar_array[sec] - { - If (value) - { - stln_%key% := value - } - } - } - If (glovar_array["Info"].Count() > 1) - { - Send Stolen Display Replacement Basics Requests{Tab} - Send Received some requests for replacement Basics for Stolen displays @ - } Else { - Send %stln_case%{Tab} - Send Received a request for replacement Basics for a Stolen display @ - } - Sleep, 1000 - Send Stellar - Sleep, 1500 - Send {Down}{Tab}:{Enter 2} - Sleep, 1000 - Send {ShiftDown}{Tab 2}{ShiftUp} - Sleep, 1000 - Send {Right 17} - Sleep, 1000 - Send {Enter} - Sleep, 1000 - Send {Right} - Send {Enter} - Sleep, 1000 - If (glovar_array["Info"].Count() > 1) - { - Loop, % glovar_array["Info"].Count() { - If (A_Index < glovar_array["Info"].Count()) - { - table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?{Tab 2}" - } Else { - table := "^{b}Case " A_Index "{Tab}^{b}" stln_case%A_Index% "{Tab}Stolen{Tab}" stln_s%A_Index% "{Tab}Replacement{Tab}" stln_r%A_Index% "{Enter}" stln_cc%A_Index% "{Tab}Machine PIN{Tab}" stln_v%A_Index% "{Tab}Model, Year{Tab 2}Should it qualify?" - } ; That way it doesn't put the extra line at the very end - Send %table% - } - } Else { - Send Case{Tab}%stln_case%{Tab}Stolen{Tab}%stln_s%{Tab}Replacement{Tab}%stln_r%{Enter}%stln_cc%{Tab}Machine PIN{Tab}%stln_v%{Tab}Model, Year{Tab 2}Should it qualify?{Up 2}{Tab} - } -Return - -; Transferring to DTAC -:*:]DTAC:: - Send The ISG Global Support Center has determined that this case is hardware related`; therefore, this case is being transferred from the Global Support Center to the ISG DTAC group. A DTAC technician will now work this case via the DTAC system and provide a recommendation in the case Text if more information is needed or if a solution has been found. Please continue to update or check on the progress of this case by using the DTAC system Case Text section moving forward. -Return - -; Transferring to Tier2 -:*:]rrt:: - Send This case was unable to be resolved and has been transferred to another team. Our Tier 2 team is investigating the issue to find a short-term resolution. We will update you as soon as we have a recommendation. -Return - -; Update after 5 business days -:*:]upd:: - Send A short-term resolution still has not been identified. We are requesting an immediate update on this case from our Tier 2 team. We will contact you as soon as we have a status update. -Return - -; Requesting info -:*:]req:: - Send A request has been made for additional information in this case. Please provide the following information as soon as possible so this case can be resolved. -Return - -; Dealer defect -:*:]ddefect:: - Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please have your field team contact the appropriate Product Support Representative. -Return - -; Customer defect -:*:]cdefect:: - Send We have communicated your issue to the Product Support and Development Teams. We do not have a timeframe in which your issue will be resolved. At this time, we are closing the case as those teams track the issue. If you have any questions, please contact your preferred dealer and the field team can contact the appropriate Product Support Representative. -Return - -; Workbasket shortcuts, place mouse over Transfer button before typing -:*:]pd:: -Send PCDSC -Send {Click} -Return - -:*:]pr:: -Send PCRRT -Send {Click} -Return - -:*:]p2:: -Send PCTIER2 -Send {Click} -Return - ;------------------------------------------------------------------------------ ; Email ;------------------------------------------------------------------------------ :*:]email:: - Send Hello,{Enter 2}{Space 3} -Return +{ + Send "Hello,{Enter 2}{Space 3}" +} ; German -#If (ger) -:*:[email:: - Send Hallo,{Enter 2}{Space 3} -Return -#If - +#HotIf (settings["German"]) +:*:[email::{ + Send "Hallo,{Enter 2}{Space 3}" +} +#HotIf ;------------------------------------------------------------------------------ ; Profile email paste ;------------------------------------------------------------------------------ ; So when editing Profiles, it won't let you paste in the email field. We don't like that. Make sure to let go of all keys immediatley after pressing this -#If (mjdpaste) #v:: - sleep, 750 - SendInput %clipboard% - sleep, 500 - send # ; to make sure the start menu isn't open for some reason -Return -#If +{ + Sleep(750) + SendInput(A_Clipboard) +} ;------------------------------------------------------------------------------ ; Common Terms autocorrect and replacement ;------------------------------------------------------------------------------ -; JD Names -#If (jdpn) - :*:[xx::XXXXXXXXXXXXX ; I'm not gonna try and find the right amount of X's to appease the CCMS demons - :*:]xx::XXXXXXXXXXXXX + +#HotIf (settings["JDProductNames"]) ; English :*:]at::AutoTrac - :*:]ba::Basics & AutoTrac - :*:]sf::StarFire - :*:]jdl::JDLink + :*:]bna::Basics & AutoTrac + :*:]bfs::Basics for Services + :*:]bas::Basics, AutoTrac, and Section Control + :*:]jlb::JDLink Boost :*:]jdp::JDParts :*:]mjd::MyJohnDeere :*:]opsc::Operations Center @@ -388,7 +243,6 @@ Return :*:]cc::CommandCenter :*:]fc::Field Connect :*:]rs::RowSense - :*:]sub::subscription :*:]ss::Stellar Support :*:]tman::Technical Manual :*:]oman::Operator's Manual @@ -401,48 +255,55 @@ Return :*:]jddm::John Deere Data Manager :*:]serva::Service Advisor :*:]muc::Master Unlock Code - :*:]asmn::Asset Manager :*:]bsm::Base Station Manager - - :*:]sas::See & Spray + :*:]lm::License Manager + :*:]sns::See & Spray + :*:]s4::SF-RTK + :*:]ls::licenses + :*:]sub::subscription + :*:]agt::AgTech Code ::rowsense::RowSense - :*:comar::COMAR + ::comar::COMAR + ::comars::COMARs ::mrtk::mRTK ::rda::RDA ::rtk::RTK ::autotrac::AutoTrac - :*:ccms::CCMS - :*:dtac::DTAC + ::ccms::CCMS + ::dtac::DTAC ::tcsm::TCSM ::itec::iTEC Pro ::ssu::SSU ::atu::ATU - :*:mtg::MTG - ::wdt::WDT + :*:mtg::modem ::itc::iTC - :*:vin::Machine PIN ; Not actually vehicles, so they don't have VINs + ::vin::Machine PIN ; Not actually vehicles, so they don't have VINs ::gs2::GS2 ::gs3::GS3 + ::g4::G4 + ::g5::G5 ::sf1::SF1 ::sf2::SF2 ::sf3::SF3 - ::sf4::SF4 ::xid::xID ::pmcalc::PMCalc - ::vat::VAT - :*:racf::RACF + ::VAT::VAT + ::RACF::RACF ::igrade::iGrade - :*:JDCP::JDCP - :*:ISOBUS::ISOBUS - + ::ISOBUS::ISOBUS + ::JDCP::JDCP + ::LORT::LORT + ::ISG::ISG ; German -#If (ger) +#HotIf (settings["German"]) :*:[at::AutoTrac - :*:[ba::Basics & AutoTrac - :*:[sf::StarFire - :*:[jdl::JDLink + :*:[bna::Basics & AutoTrac + :*:[bfs::Basics for Services + :*:[bas::Basics, AutoTrac, and Section Control + :*:[sf4::SF-RTK + :*:[jlb::JDLink Boost :*:[jdp::JDParts :*:[mjd::MyJohnDeere :*:[opsc::Einsatzzentrale @@ -459,7 +320,6 @@ Return :*:[hlo::Originales HarvestLab :*:[bin::Virtuellen Bestand :*:[warrep::Warranty Reports - :*:[tp::TouchPoint :*:[tcsm::Technischer Bezirksleiter :*:[jdsm::John Deere Software Manager :*:[jddm::John Deere Data Manager @@ -467,55 +327,76 @@ Return :*:[muc::Master Unlock Code :*:[asmn::Asset Manager :*:[bsm::Base Station Manager -#If + :*:[lm::License Manager + :*:[sns::See & Spray + :*:[s4::SF-RTK + :*:[ls::Lizenz + :*:[agt::AgTech Code +#HotIf + ;------------------------------------------------------------------------------ ; QoL Improvements ;------------------------------------------------------------------------------ :*:]me:: - Send, % Format("{:U}", A_UserName) -Return - :*:[me:: - Send, % Format("{:U}", A_UserName) -Return - -#If !(email = "LastnameFirstname@JohnDeere.com") - :*:@me:: - Send, %email% -Return -#If +{ + Send StrUpper(A_UserName) +} -#j:: ; Open the downloads folder on Win+J - Run, C:\Users\%A_UserName%\Downloads -Return +#HotIf !(settings["Email"] = "LastnameFirstname@JohnDeere.com") + :*:@em:: + { + SendInput(settings["Email"]) + } +#HotIf + +; Open the downloads folder on Win+J +#j::Run("C:\Users\" A_UserName "\Downloads") + :*:[now:: :*:]now:: - SendInput, % GetDateTime("ISO8601") ; Send the current time/date in ISO8601 format -Return +{ + SendInput(FormatTime(A_NowUTC, "yyyy-MM-dd") "T" FormatTime(A_NowUTC, "H:mm'Z'")) ; Send the current time & date in ISO8601 format +} +; Send the current date in ISO8601 format :*:[today:: :*:]today:: - SendInput, % GetDateTime("date") ; Send the current date in ISO8601 format -Return +{ + + SendInput(FormatTime(A_NowUTC, "yyyy-MM-dd")) +} :*:[deg::{ASC 248} :*:]deg::{ASC 248} :*:[eq::{ASC 247} :*:]eq::{ASC 247} -:*:[shrug::¯\_(ツ)_/¯ -:*:]shrug::¯\_(ツ)_/¯ -:*:[ltd::License to Deere™ -:*:]ltd::License to Deere™ +:*:[shrug:: +:*:]shrug:: +{ + SendInput("¯\_(ツ)_/¯ ") ; Somehow the space at the end is very important +} +:*:[pwd:: +:*:]pwd:: +{ + Send "{AppsKey}" + Sleep(100) + Send "{Up}" + Sleep(50) + Send "{Enter}" + Sleep(50) + Send "{Enter}" + Sleep(100) + Send "{Enter}" + Sleep(750) + Send "{Enter}" +} -docs: - run https://www.autohotkey.com/docs/AutoHotkey.htm -Return - -F19:: Run D3K.ahk \ No newline at end of file +F19::Reload \ No newline at end of file -- 2.54.0 From c9ef223131578806e2c92ddb01a0f86e13a98f2a Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:18:05 -0500 Subject: [PATCH 26/34] no longer needed --- Mansol_Opener.ahk | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 Mansol_Opener.ahk diff --git a/Mansol_Opener.ahk b/Mansol_Opener.ahk deleted file mode 100644 index d3aee3e..0000000 --- a/Mansol_Opener.ahk +++ /dev/null @@ -1,33 +0,0 @@ -#SingleInstance force ; Only one instance at a time -SendMode, Input -FileEncoding, UTF-8 ; Makes sure the special characters don't break stuff - -Menu, Tray, Icon, %A_MyDocuments%\D3K\icons\manual.ico - -Gui, +AlwaysOnTop +ToolWindow - -Gui, Add, Edit, x2 y3 w78 h20 vNumber +Left, -Gui, Add, Button, x22 y43 w70 h20 Default vHidden, Ok -Gui, Add, Button, x81 y3 w17 h20 gHelp +Center, ? -Gui, Show, h28 w100, ManSol -GuiControl, Hide, Hidden - -Return - -ButtonOk: - Gui, submit ; I have no idea what the regex means any more... - If RegExMatch(Number, "[[:alpha:]]+") - run, % "http://serviceadvisor.deere.com/WebSA/manuals/" . Number - Else If RegExMatch(Number, "[[:digit:]]+") - run, % "https://serviceadvisor.deere.com/WebSA/solutions/en/" . Number - ExitApp -Return - - -Help: - MsgBox, 262176, Maual & Solution opener, Input the TM/OM SKU (easily ofund on TechPubs) or the DTAC solution number to open it in your default browser.`nTMs & OMs open in Service Advisor. -Return - -GuiClose: -GuiEscape: -ExitApp \ No newline at end of file -- 2.54.0 From 2129e733d1bcf30c8e9f3fb0cfddb2af8bc1f252 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:18:25 -0500 Subject: [PATCH 27/34] Update Settings.ahk --- Settings.ahk | 150 ++++++++++++++++++++------------------------------- 1 file changed, 59 insertions(+), 91 deletions(-) diff --git a/Settings.ahk b/Settings.ahk index af6296f..0cd79e4 100644 --- a/Settings.ahk +++ b/Settings.ahk @@ -1,123 +1,91 @@ -#Include, func.ahk -#NoTrayIcon -Menu, Tray, Icon, shell32.dll, 283 +#Include "func.ahk" ;------------------------------------------------------------------------------ ; Create GUI ;------------------------------------------------------------------------------ -Gui, -MaximizeBox -MinimizeBox ; Remove the max+min buttons +myGui := Gui() +myGui.Opt("-MaximizeBox -MinimizeBox") ; Remove the max+min buttons -Gui, Add, GroupBox, x8 y2 w193 h37, First Name -Gui, Add, Edit, x12 y15 w185 h20 vformName gName, %name% +myGui.Add("Edit", "w200 vEmail", settings["Email"]).OnEvent("LoseFocus", ProcessUserInput) ; settings["Email"] -Gui, Add, GroupBox, x8 y40 w207 h37, Email Address -Gui, Add, Edit, x12 y53 w200 h20 vformEmail gEmail, %email% +myGui.Add("Text",, "Documentation file:") ; settings["DocFile"] +myGui.Add("Text",, settings["DocFile"]) +myGui.Add("Button",, "Pick a different file").OnEvent("Click", DocSelect) -Gui, Add, GroupBox, x8 y83 w107 h130, Main -Gui, Add, CheckBox, x12 y95 w100 h30 vformMansol Checked%mansol% gMansol, ManSol -Gui, Add, CheckBox, x12 y125 w100 h30 vformMJDPaste Checked%mjdpaste% gMJDPaste, MJDPaste -Gui, Add, CheckBox, x12 y155 w100 h30 vformCaseFormatter Checked%caseformatter% gCaseFormatter, Case Formatter -Gui, Add, CheckBox, x25 y178 w75 h30 vformCFmail Checked%cfmail% gCFmail, Email option - GuiControl, show%caseformatter%, formCFmail ; only shows the check box for emails if the Case Formatter box is checked -Gui, Add, GroupBox, x8 y215 w277 h50 vformDocFile, Documentation File -Gui, Add, Text, x15 y231 w260 h30 vformDocFile2 gDocFile, %docfile% +myGui.Add("Text", "Section", "Text Replacement") +myGui.Add("CheckBox", "vJDPN Checked" . settings["JDProductNames"], "JD Product Names").OnEvent("Click", ProcessUserInput) +myGui.Add("CheckBox", "vGloVar Checked" . settings["GloVar"], "Global Variables").OnEvent("Click", ProcessUserInput) +myGui.Add("CheckBox", "vDE Checked" . settings["German"], "DE ([ as prefix)").OnEvent("Click", ProcessUserInput) -Gui, Add, GroupBox, x128 y83 w157 h75, Text Replacement -Gui, Add, CheckBox, x132 y95 w150 h30 vformJdpn Checked%jdpn% gJdpn, JD Product Names -Gui, Add, CheckBox, x132 y125 w150 h30 vformGlovar Checked%glovar% gGlovar, Global Variables -Gui, Add, CheckBox, x132 y155 w100 h30 vformGer Checked%ger% gGer, DE ([ as prefix) +switch settings["msmv"] { + case "always-running": ; run at refresh of d3k, currently running + msmv_check := 1 + case "always-stopped": ; run at refresh, currently stopped + msmv_check := 1 + case "no-running": ; don't run at refresh, currently running + msmv_check := 0 + case "no-stopped": ; don't run at refresh, currently stopped + msmv_check := 0 + default: + MsgBox("Unexpected value `"" settings["msmv"] "`" in D3Ksettings.ini") + Reload +} -Gui, Add, Link, x132 y190 w150 h26 gHelp, Click here for help`n%A_AhkVersion% +myGui.Add("Checkbox", "vMsmv Checked" . msmv_check, "Mouse Mover: silently start on startup").OnEvent("Click", ProcessUserInput) -Gui, Show, h273 w295, D3K version %d3k_version% +myGui.Add("Link",, "Click here for help") +myGui.Add("Text",, "AHK Version: " . A_AhkVersion) +myGui.Add("Text",, "D3K version " . d3k_version) +myGui.Title := "D3K settings" +MyGui.OnEvent("Close", ProcessUserInput) +myGui.OnEvent("Escape", End) +myGui.Show("AutoSize") Return + ;------------------------------------------------------------------------------ ; Edit ini ;------------------------------------------------------------------------------ /* Default ini, sections are in []: (0 is off, 1 is on) -[USpec] Email=LastnameFirstname@JohnDeere.com -Name=Firstname DocFile=Select File -[Main] -Mansol=1 -MJDPaste=1 -CaseFormatter=1 -CFmail=0 -[Replacement] JDProductNames=1 GloVar=0 -[Language] German=0 */ -Name: - Gui, Submit, NoHide - ini_write(sett_ini, "Name", formName) -Return -Email: - Gui, Submit, NoHide - ini_write(sett_ini, "Email", formEmail) -Return +ProcessUserInput(*) +{ + Saved := MyGui.Submit(0) ; Save the contents of named controls into an object. + ini_write(sett_ini, "Email", Saved.Email) + ini_write(sett_ini, "JDProductNames", Saved.JDPN) + ini_write(sett_ini, "GloVar", Saved.GloVar) + ini_write(sett_ini, "German", Saved.DE) + if (Saved.Msmv = 1) + { + ini_write(sett_ini, "msmv", "always-stopped") + } else { + ini_write(sett_ini, "msmv", "no-stopped") + } +} -DocFile: - Gui, Submit - FileSelectFile, SelectedFile, 3, , Open a file, Text Documents (*.txt) +DocSelect(*) +{ + oSaved := myGui.Submit() + SelectedFile := FileSelect(3,, "Open a file", "Text Documents (*.txt)") if !(SelectedFile) - MsgBox, You have not selected a file, this will break some things. + MsgBox("You have not selected a file, this will break some things.") else ini_write(sett_ini, "DocFile", SelectedFile) - Run, Settings.ahk -Return + Run("Settings.ahk") +} -Mansol: - Gui, Submit, NoHide - ini_write(sett_ini, "Mansol", formMansol) -Return - -MJDPaste: - Gui, Submit, NoHide - ini_write(sett_ini, "MJDPaste", formMJDPaste) -Return - -CaseFormatter: - Gui, Submit, NoHide - GuiControl, show%formCaseFormatter%, formCFmail ; only shows the check box for emails if the Case Formatter box is checked - GuiControl,, formCFmail, 0 - ini_write(sett_ini, "CaseFormatter", formCaseFormatter) - ini_write(sett_ini, "CFmail", "0") ; if you're toggling this, its either on or off, doesn't hurt to set it here -Return - - CFmail: - Gui, Submit, NoHide - ini_write(sett_ini, "CFmail", formCFmail) - Return - -Jdpn: - Gui, Submit, NoHide - ini_write(sett_ini, "JDProductNames", formJdpn) -Return - -Glovar: - Gui, Submit, NoHide - ini_write(sett_ini, "GloVar", formGlovar) -Return - -Ger: - Gui, Submit, NoHide - ini_write(sett_ini, "German", formGer) -Return - -Help: - Gui, Submit -Return - -GuiClose: -GuiEscape: - Run D3K.ahk -ExitApp ; Closes the app when escape or the exit button is pressed \ No newline at end of file +End(*) +{ + ProcessUserInput() + ExitApp +} \ No newline at end of file -- 2.54.0 From 946e4b7be8d9314308342f9bd2239e52e65cdbce Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:26:42 -0500 Subject: [PATCH 28/34] no longer needed --- addemail.ahk | 33 --------------------------------- 1 file changed, 33 deletions(-) delete mode 100644 addemail.ahk diff --git a/addemail.ahk b/addemail.ahk deleted file mode 100644 index a061ed0..0000000 --- a/addemail.ahk +++ /dev/null @@ -1,33 +0,0 @@ -#Include, func.ahk - -csv = %A_MyDocuments%\emails.csv ; Where the email CSV is - -glovarini := A_MyDocuments "\GloVar.ini" -Xid := ini_get(glovarini, "Info", "xID") - -Gui, +AlwaysOnTop +ToolWindow - -Gui, Add, Text, x2 y2 w60 h17 +Center, xID -Gui, Add, Text, x65 y2 w120 h17 +Center, Email -Gui, Add, Text, x190 y2 w100 h17 +Center, Name - -Gui, Add, Edit, x2 y17 w60 h20 vXid, %Xid% -Gui, Add, Edit, x65 y17 w120 h20 vEmail -Gui, Add, Edit, x190 y17 w100 h20 vName - -Gui, Add, Button, x172 y89 w70 h30 Default, OK - -Gui, Show, h39 w292, Add dealer to CSV -Return - -ButtonOK: - Gui, Submit - writethis := Xid . "," . Email . "," . Name - FileAppend, % "`n" writethis, %csv% - ini_write(A_MyDocuments "\GloVar.ini", "dem", Email) -Return - - -GuiEscape: -GuiClose: -ExitApp \ No newline at end of file -- 2.54.0 From 9fd247681a9529494e51206ec6dc8301452a905b Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:27:28 -0500 Subject: [PATCH 29/34] Update func.ahk --- func.ahk | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/func.ahk b/func.ahk index cec7aef..faec437 100644 --- a/func.ahk +++ b/func.ahk @@ -16,26 +16,31 @@ ini_load(location) temp := FileOpen(location, "r") cleaner := temp.Read() temp.Close() - cleaner := RegExReplace(cleaner, "`am)^[\s\R]*") ; Remove empty lines - cleaner := RegExReplace(cleaner, "m)[ \t]+$") ; Get rid of extra space at the end of values (NEEDS FIXED) + cleaner := RegExReplace(cleaner, "`m)[ \t]+$|^[\s\R]*$") ; Remove empty lines, spaces, tabs temp := FileOpen(location, "w") temp.Write(cleaner) temp.Close() temp := FileOpen(location, "r") - out := Object() + out := Map() ; I tried an object, it was too complicated for what I'm doing. Nested map is good enough + curr_section := 0 ; v2 won't evaluate a true/false to false if a variable isn't set to false + r := Object() ; bruh why do I have to set up variables now suddenly Loop { Line := temp.ReadLine() RegExMatch(Line, "(?
(?<=\[).*(?=\]))|(?.*)=(?.*)", &r) ; Key = r.Key, Value = r.Value, Section = r.Section If (r.Section) { - out.%r.Section% := Map() - current_Section := r.Section - } Else + out[r.Section] := Map() + curr_section := r.Section + } Else { - trimKey := Trim(r.Key, " `t`r`n") - trimValue := Trim(r.Value, " `t`r`n") - out.%current_Section%[trimKey] := trimValue + If (curr_section) + { + out[curr_section].Set(Trim(r.Key, " `t`r`n"), Trim(r.Value, " `t`r`n")) + } Else + { + out.Set(Trim(r.Key, " `t`r`n"), Trim(r.Value, " `t`r`n")) ; this handles things with no section + } } } Until (temp.AtEOF) temp.Close() @@ -45,16 +50,13 @@ ini_load(location) ini_write(location, inKey, inValue) ; Don't need to specify section because you can only have one hotstring anyway { - Critical("On") ini := FileOpen(location, "r") temp := ini.Read() ini.Close() - inKeyReg := "(?<=" inKey "=)\S*" ; Regex to make sure we're matching only the value for the requested key - temp := RegExReplace(temp, inKeyReg, inValue) + temp := RegExReplace(temp, "(?<=" inKey "=).*", inValue) ini := FileOpen(location, "w") ini.Write(temp) ini.Close() - Critical("Off") } @@ -68,18 +70,16 @@ If !FileExist(sett_ini) ; Check if the sett_ini doesn't exist ini := FileOpen(sett_ini, "w") writethis := " ( LTrim - [USpec] Email=LastnameFirstname@JohnDeere.com - DocFile=Select File - [Main] - MJDPaste=1 + DocFile=0 JDProductNames=1 GloVar=0 - [Language] German=0 + msmv=always + msmv_status=stopped )" ini.Write(writethis) - file.Close() + ini.Close() Run("Settings.ahk") ; Runs the GUI for changing the settings, accessible with Alt+Shift+\ (also easy way to restart this script) } @@ -92,12 +92,8 @@ global settings := ini_load(sett_ini) ; started as global variables, keeping this commented out in case there's some old script where I need to replace something ; User Specific things: -;global email := settings.USpec["Email"] -;global docfile := settings.USpec["DocFile"] - -; Replacement -;global jdpn := settings.Replacement["JDProductNames"] -;global glovar := settings.Replacement["GloVar"] - -; Language -;global ger := settings.Language["German"] \ No newline at end of file +;global email := settings["Email"] +;global docfile := settings["DocFile"] +;global jdpn := settings["JDProductNames"] +;global glovar := settings["GloVar"] +;global ger := settings["German"] \ No newline at end of file -- 2.54.0 From 32a5b74f71d433fd7578a6e9722294581409f48e Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:27:48 -0500 Subject: [PATCH 30/34] Delete icons/manual.ico --- icons/manual.ico | Bin 165291 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/manual.ico diff --git a/icons/manual.ico b/icons/manual.ico deleted file mode 100644 index 9a7b5fe92337245e020d397541540cf62c7b5039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165291 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 -- 2.54.0 From 409f6b9b4c9e19ed5f9c79c173431ffc02a7c6ad Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:28:29 -0500 Subject: [PATCH 31/34] Delete directory 'standalones' --- standalones/Mansol_Opener - standalone.ahk | 40 ---------------------- standalones/README.md | 6 ---- 2 files changed, 46 deletions(-) delete mode 100644 standalones/Mansol_Opener - standalone.ahk delete mode 100644 standalones/README.md diff --git a/standalones/Mansol_Opener - standalone.ahk b/standalones/Mansol_Opener - standalone.ahk deleted file mode 100644 index 81e3e3e..0000000 --- a/standalones/Mansol_Opener - standalone.ahk +++ /dev/null @@ -1,40 +0,0 @@ -#SingleInstance force - -; The exe this is compiled into has manual.ico set as its icon. - -!+S::gui() - -gui() -{ - static Number - static Hidden - - Gui, +AlwaysOnTop +ToolWindow - - Gui, Add, Edit, x2 y3 w78 h20 vNumber +Left, - Gui, Add, Button, x22 y43 w70 h20 Default vHidden, Ok - Gui, Add, Button, x81 y3 w17 h20 gHelp +Center, ? - Gui, Show, h28 w100, ManSol - GuiControl, Hide, Hidden - - Return - - ButtonOk: - Gui, submit ; I have no idea what the regex means any more... - If RegExMatch(Number, "[[:alpha:]]+") - run, % "http://serviceadvisor.deere.com/WebSA/manuals/" . Number - Else If RegExMatch(Number, "[[:digit:]]+") - run, % "https://ccms.deere.com/prweb/PRServletCustomAuth/ZDate_MgiNPn1ccL6O6pyBurDs0hjFQ8*/!STANDARD?pyActivity=SolutionsSnapStart&Action=showHarness&className=Deere-Int-Solr-Docs&Purpose=SolutionDescriptionNew&SolutionID=" . Number . "&Language=Default" - ExitApp -Return - - - Help: - Run, https://daviddaily.dev/david/d3k/wiki/ManSol - Return - - GuiClose: - GuiEscape: - Gui, Destroy - Return -} diff --git a/standalones/README.md b/standalones/README.md deleted file mode 100644 index c15930d..0000000 --- a/standalones/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Standalone ManSol Opener - -This is a standalone version, the help guide can be found [here](https://daviddaily.dev/david/d3k/wiki/ManSol) - -## [Download the executable here](https://files.daviddaily.dev/.d3k/ManSol%20Opener.exe) -I would recommend putting it in your startup folder (`%appdata%\Microsoft\Windows\Start Menu\Programs\Startup`) so that it starts automagically when you start your computer. -- 2.54.0 From 5aa7108086086381a3e7a85400c59dee28162613 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:29:20 -0500 Subject: [PATCH 32/34] Update glovarsource --- glovarsource | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/glovarsource b/glovarsource index 2490c55..d05524b 100644 --- a/glovarsource +++ b/glovarsource @@ -1,6 +1,8 @@ [Serial Numbers] 1= -cm= v= +cm= +do= +co= [Info] case= \ No newline at end of file -- 2.54.0 From ec815b5314106fb857d9e7977891f574c8518740 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:29:32 -0500 Subject: [PATCH 33/34] Delete emails.example.csv --- emails.example.csv | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 emails.example.csv diff --git a/emails.example.csv b/emails.example.csv deleted file mode 100644 index 6fb0790..0000000 --- a/emails.example.csv +++ /dev/null @@ -1,4 +0,0 @@ -xID,Email,Name,Demo Username,Dealer Org -X1,test1@example.com,Person 1,User 1,554866 -X2,test2@example.com,Person 2,User 2,69983 -X3,test3@example.com,Person 3,,4832 \ No newline at end of file -- 2.54.0 From a54571f6cd0464f1546f009ab527c2c8dcb8a1c4 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 28 Aug 2026 12:29:53 -0500 Subject: [PATCH 34/34] Update msmv.ahk --- msmv.ahk | 85 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 35 deletions(-) diff --git a/msmv.ahk b/msmv.ahk index c701009..d0d3700 100644 --- a/msmv.ahk +++ b/msmv.ahk @@ -1,50 +1,65 @@ -#Requires AutoHotkey v2.0 ; v2 only +#Requires AutoHotkey v2 ; v2 only #SingleInstance force CoordMode("Mouse", "Screen") -waittime := 5000 -ogcStop := 13 -global nogui := False +waittime := 10000 -Switch A_Args +for i in A_Args { -Case "on": - Goto(Start) -Case "off": - ExitApp() -default: - for x in A_Args { - MsgBox(x) + if (i = "on") + { + A_IconHidden := 1 + Start(1,2,3) + } + else if (i = "off") + { + ExitApp() + } + else + { + MsgBox (i) } } -myGui := Gui() + A_TrayMenu.Delete() ; None of the standard tray buttons -A_TrayMenu.Add("Hide GUI", GuiToggle()) ; Adds a button to toggle the gui +A_TrayMenu.Add("Hide GUI", GuiToggle) ; Adds a button to toggle the gui A_TrayMenu.Add("Exit", ExtMen) ; Exit button + +myGui := Gui() myGui.Opt("+AlwaysOnTop +ToolWindow") -ogcButtonStart := myGui.Add("Button", "x3 y3 w55 h20 +Center", "Start") -ogcButtonStart.OnEvent("Click", Start.Bind("Normal")) -ogcButtonStop := myGui.Add("Button", "x3 y3 w55 h20 +Center Hidden", "Stop") -ogcButtonStop.OnEvent("Click", Stop.Bind("Normal")) +ButtonStart := myGui.Add("Button", "x3 y3 w55 h20 +Center", "Start") +ButtonStart.OnEvent("Click", Start.Bind("Normal")) +ButtonStop := myGui.Add("Button", "x3 y3 w55 h20 +Center Hidden", "Stop") +ButtonStop.OnEvent("Click", Stop.Bind("Normal")) myGui.Title := "msmv" -myGui.Show("h28 w60") +If (A_IconHidden = false) +{ + myGui.Show("h28 w60") +} -Start(A_GuiEvent, GuiCtrlObj, Info, *) + +Start(A_GuiEvent, GuiCtrlObj, Info) { - ogcButtonStart.Visible := false SetTimer(Msmv,waittime) ; Checks if the has been input in the last 2 minutes every 30 secs, easier to stop a loop with SetTimer - ogcButtonStop.Visible := true + If (A_IconHidden = false) + { + ButtonStart.Visible := false + ButtonStop.Visible := true + } } -Stop(A_GuiEvent, GuiCtrlObj, Info, *) +Stop(A_GuiEvent, GuiCtrlObj, Info) { - ogcButtonStop.Visible := false SetTimer(Msmv,0) - ogcButtonStart.Visible := true + If (A_IconHidden = false) + { + ButtonStop.Visible := false + ButtonStart.Visible := true + } } -Msmv() +Msmv(*) { If (A_TimeIdle > waittime) ; https://www.autohotkey.com/docs/Variables.htm#User_Idle_Time { @@ -54,24 +69,24 @@ Msmv() } } -GuiToggle(){ +GuiToggle(ItemName, ItemPos, MenuObj) +{ global - If !nogui + If (WinExist("msmv")) { - myGui.Hide() - A_TrayMenu.Check("1&") - nogui := True + myGui.Destroy() + MenuObj.Check(ItemName) } Else { - A_TrayMenu.Uncheck("1&") - nogui := False - myGui.Show() + MenuObj.Uncheck(ItemName) + myGui.Restore() } + Return } ; exit option from tray menu -ExtMen(A_ThisMenuItem, A_ThisMenuItemPos, MyMenu) +ExtMen(*) { ExitApp() } \ No newline at end of file -- 2.54.0