This commit is contained in:
David Daily 2023-07-14 10:14:26 -05:00
commit 97f2d2382b
11 changed files with 1123 additions and 0 deletions

3
.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.code-workspace
SmartGooey/*
Projects/*

174
Case_Formatter.ahk Normal file
View File

@ -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
}

519
D3K.ahk Normal file
View File

@ -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

33
Mansol_Opener.ahk Normal file
View File

@ -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

123
Settings.ahk Normal file
View File

@ -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, <a href="https://daviddaily.dev/david/d3k/wiki">Click here for help</a>`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

33
addemail.ahk Normal file
View File

@ -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

169
func.ahk Normal file
View File

@ -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, "(?<Section>(?<=\[).*(?=\]))|(?<Key>.*)=(?<Value>.*)", 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"]

6
glovarsource Normal file
View File

@ -0,0 +1,6 @@
[Serial Numbers]
1=
cm=
v=
[Info]
case=

BIN
icons/coffeecup.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 MiB

BIN
icons/manual.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

63
msmv.ahk Normal file
View File

@ -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