#cs----------------------------------------------------------------------------
;AutoIt Version: 3.2.8.1
;Author: DarkSideOfSanta
;function: ping and show result in info-window + write in .ini-file
;Version 1.1 
#ce----------------------------------------------------------------------------


#include <Array.au3>
#include <GUIConstants.au3>
#include <GuiListView.au3>
#include <file.au3>
#include <Date.au3>
#include <Constants.au3>

Opt("TrayOnEventMode",1)
Opt("TrayMenuMode",1)

$xmax = @DesktopWidth
$ymax = @DesktopHeight
$routine = 0
$zeit = 0
$hour = 0
$min = 0
$sec = 0
$i = 0
$tool = 0
$pause = 1

dim $ip[200][2]
dim $status[200][2]

$title = "pingTooL"

Global $Paused
HotKeySet("{PAUSE}", "TogglePause")
hotkeyset("^!c","Terminate")
HotKeySet("^!v",'stealth')
TrayCreateItem("Ping jetzt ausführen")
TrayItemSetOnEvent(-1,"pingnow")
TrayCreateItem("About")
TrayItemSetOnEvent(-1,"about")
TrayCreateItem("Hide Time")
TrayItemSetOnEvent(-1,"hidetime")
TrayCreateItem("Hide/Show")
TrayItemSetOnEvent(-1,"stealth")
TrayCreateItem("Exit")
TrayItemSetOnEvent(-1,"Terminate")

Func pingnow()
	$routine1 = 0
EndFunc

;function shows msgbox with author-info
Func about()
	MsgBox(0,'PingTooL',Chr(169)&'DarkSideOfSanta'& @CRLF & @CRLF &'darksideofsanta@hotmail.com')
EndFunc

;function to terminate script
Func Terminate()
    Exit 0
EndFunc

;function to pause script
Func TogglePause()
    $Paused = Not $paused
    While 1
        sleep(100)
        ToolTip('Script is "Paused"',$xmax-90,$ymax-70,'','',2)
    WEnd
    ToolTip("")
EndFunc

;function to hide/show window
Func stealth()
	$state = WinGetState('pingTooL','')
	If BitAnd($state, 2) Then
		WinSetState('pingTooL','',@SW_HIDE)
		ToolTip('',-1,-1,'','',2)
		$tool = 1
	Else
		WinSetState('pingTooL','',@SW_SHOW)
		$tool = 0
	EndIf
EndFunc

;function to hide/show the time left to the next routine
Func hidetime()
	If $tool = 1 Then
		$tool = 0
		GUICtrlSetState($Label1,$GUI_SHOW)
	Else
		$tool = 1
		GUICtrlSetState($Label1,$GUI_HIDE)
	EndIf
EndFunc

;auslesen der pingzeit in ms aus config
$pingtime = IniRead('ping_config.ini','config','pingtime',2000)

;auslesen der intervallzeiten(zwischen den versch. ip-adressen) aus config
$intervall = IniRead('ping_config.ini','config','intervall',10000)

;auslesen der zeit zwischen der routine aus config
$routine = IniRead('ping_config.ini','config','routine',600000)

;auslesen der ip-adressen/namen aus config
$ip = IniReadSection("ping_config.ini", "rechner")

;auslesen des letzten status aus log
For $n = 1 To $ip[0][0]
	$status = IniReadSection("ping_log.ini",$ip[$n][0])
	If Not @error Then 
		$help = $status[0][0]
		$ip[$n][1] = $status[$help][1]
	EndIf
Next

;erzeugen eines info-fensters
GUICreate($title,140,200,$xmax-160,$ymax-260, $WS_POPUPWINDOW, $WS_EX_TRANSPARENT)
WinSetOnTop('pingTooL','',1)

;einstellen der transparenzstärke
;0 = komplett sichtbar
;255 = tranzparent
WinSetTrans('pingTooL','',100)

;erstellen der liste im fenster für name/ip und status
$listview1 = GUICtrlCreateListView('IP                  |Status',-1,-1,140,180)

;erstellen eines labels für die anzeige der zeit
$Label1 = GUICtrlCreateLabel('',5,182,135,20,$SS_RIGHT)

GUISetState ()

while 1
	for $n = 1 to $ip[0][0]
		$ping = ping($ip[$n][0],$pingtime)
		if $ping then
			
			;zur richtigen anordnung der einträge in das info-fenster wird element an der stelle gelöscht
			_GUICtrlListViewDeleteItem($listview1,$n-1)
			GUICtrlSetColor($Listview1,0x000000)
			
			;eintrag in die liste im info-fenster
			_GUICtrlListViewInsertItem($listview1,$n-1,$ip[$n][0] & " | online")
			;GUICtrlSetColor($Listview1,0x000000)
			
			;eintrag in der config.ini über letzten status
			IniWrite(@ScriptDir&'\ping_config.ini','rechner',$ip[$n][0],' - online - '&@YEAR&'-'&@MON&'-'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC)
			
			;eintrag in die log.ini, wenn status geändert
			If $ip[$n][1] = 'offline' Then
				IniWrite(@ScriptDir&'\ping_log.ini',$ip[$n][0],@YEAR&'-'&@MON&'-'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC,'online')
				$ip[$n][1] = 'online'
			EndIf
		Elseif Not $ping Then
		
			;zur richtigen anordnung der einträge in das info-fenster wird element an der stelle gelöscht
			_GUICtrlListViewDeleteItem($listview1,$n-1)
			GUICtrlSetColor($Listview1,0xff0000)
			
			;eintrag in die liste im info-fenster
			_GUICtrlListViewInsertItem($listview1,$n-1,$ip[$n][0] & " | -")
			
			;eintrag in der config.ini über letzten status
			IniWrite(@ScriptDir&'\ping_config.ini','rechner',$ip[$n][0],' - offline - '&@YEAR&'-'&@MON&'-'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC)
			
			;eintrag in die log.ini, wenn status geändert
			If  $ip[$n][1] = 'online' Then
				IniWrite(@ScriptDir&'\ping_log.ini',$ip[$n][0],@YEAR&'-'&@MON&'-'&@MDAY&' '&@HOUR&':'&@MIN&':'&@SEC,'offline')
				$ip[$n][1] = 'offline'
			EndIf
		endif
		sleep($intervall)
	Next
	
	$routine1 = $routine
	
	;aufteilen der millisekunden in h,min,sec + ausgabe im label
	For $i = 1 To $routine1/1000
			$zeit = $routine1/1000-$i
			$hour = $zeit/3600
			$zeit = Mod($zeit,3600)
			$min = $zeit/60
			$zeit = Mod($zeit,60)
			$sec = $zeit
			If $routine < 0 Or $zeit < 0 Or $hour < 0 Or $min < 0 Or $sec < 0 Then
				GUICtrlSetData($Label1,'')
				ExitLoop
			EndIf
			If $tool = 0 Then
				GUICtrlSetFont (-1,8.5, 600)
				GUICtrlSetData($Label1,Int($hour)&':'&Int($min)&':'&$sec&' bis zur Routine ')
				GUICtrlSetColor(-1,0x000000)
			EndIf
			sleep(1000)
			GUICtrlSetData($Label1,'')
	Next
WEnd























