From 97f2d2382bf947275db8f31abb7d2139428fe532 Mon Sep 17 00:00:00 2001 From: David Daily Date: Fri, 14 Jul 2023 10:14:26 -0500 Subject: [PATCH] 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