#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=TA.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <Chrome.au3> ;Дополнительная библиотека, которой нет в стандартном издании SciTE.
#include <Media.au3>
#Include <GuiEdit.au3>
#include <Crypt.au3>
#Include <ClipBoard.au3> ;Дополнительная библиотека, которой нет в стандартном издании SciTE.
#include <Sound.au3>
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <ScreenCapture.au3>
#include <WinAPI.au3>
#include <StaticConstants.au3>
#include <TabConstants.au3>
#Include <Skin.au3>
#include "_TCP_filesend.au3"
#Include <GDIPlus.au3>
#include <array.au3>
#include <File.au3>
#include <BlockInputEx.au3>

Global $ico = @ScriptDir & "\Pictures\TA.ico"

#Region AppStarted ;Чтобы программа могла быть запущена только 1 раз.
$pList = ProcessList() ;Записываем в массив все открытые приложения.
$k = 0

For $i = 1 to UBound($pList)-1
	If $pList[$i][0] = "Управляющий.exe" Then $k = $k + 1 ;Если программа уже запущена, записываем это
Next

If $k > 1 then
    Msgbox(0, "", "Teacher Assistant уже запущен", 2)
    Exit
EndIf
#EndRegion

Global $ico = @ScriptDir & "\TA.ico", $n  = 0, $block = 1

IniReadSection(@ScriptDir & '\settingsS.ini', 'Address')
	If @error Then _settingsSetup()

IniReadSection(@ScriptDir & '\settingsS.ini', 'Google') ;Считываем местоположение ярлыка браузера.
   If @error Then _settingsSetup()

TCPStartup() ;Начать использование службы TCP.
    While 1
		$address = IniReadSection(@ScriptDir & '\settingsS.ini', 'Address')
		$socket = TCPListen(@IPAddress1, $address[1][1], 1) ;Создаем слушающий сокет
	    If @error Then
			MsgBox(0, 'Ошибка', 'Ошибка при создании запроса. Проверьте файл с настройками.')
		    Exit ;Выйти при ошибке.
		    EndIf
		$Connect = -1 ;Указываем, что подключения не произошло.
	Do
		$Connect = TCPAccept($socket) ;Создать сокет, если есть входящее подключение.
	Until $Connect <> -1 ;Если клиент подключился, то выйти из цикла, если ошибка или никто не подключился, то продолжить цикл.
		While 1
			$dannie = TCPRecv($Connect, 2048) ;Получаем максимум 2048 символов.
			If @error Then ExitLoop ;Если символы не получены - выход.
            If $dannie <> "" Then ;Если данные получены.
		    Global $instruction = StringLeft ($dannie, 4) ;Смотрим на первые два символа от полученной строки, чтобы определить, какая команда требуется.
			Switch $instruction ;Анализируем пришедший сигнал.

    Case '#sdn' ;Выключение.
        Shutdown(1)

	Case '#rbt' ;Перезагрузка.
        Shutdown(2)

    Case '#lgt' ;Выйти из системы.
        Shutdown(0)

    Case '#pbk' ;Воспроизведение аудиофайла.
		Local $File
	    $File = FileOpenDialog ("", "@WindowsDir", "Wave files (*.wav)") ;Открытие диалоговго окна для выбора файла.
		If $File = 1 Or 2 Then ;При закрытии окна.
		    MsgBox(0, 'Уведомление', 'Вы ничего не выбрали.')
		Else
		    SoundPlay($File) ;Воспроизведение выбранного файла.
		EndIf

    Case '#msg' ;Отправка сообщения.
	    $text = StringTrimLeft($dannie, 4) ;Убираем технические символы, оставляя только текст, направленный на компьютер ученика.
		MsgBox ( 0, "Оповещение", $text)

    Case '#wpg' ;Открыть веб-страницу.
	    $google = IniReadSection(@ScriptDir & '\settingsS.ini', 'Google')
		$text = StringTrimLeft($dannie, 4) ;Убираем технические символы, оставляя только адрес веб-страницы.
		_ChromeStartup($text, $google[1][1]) ;Открываем веб-страницу, используя указанный адрес и местоположение ярлыка браузера.

    Case '#rcd' ;Запись аудиофайла.
        $address = IniReadSection(@ScriptDir & '\settingsS.ini', 'Address')
		MsgBox(0,"Teacher Assistant","Нажмите ОК для начала записи. Нажмите ESC для окончания записи.")
	    HotKeySet("{ESC}","StopRecording") ;ESC завершает запись аудио.
	    $stop = 1 ;Алгоритм будет работать, пока значение = 1.
	    $media = _MediaCreate(6) ;Создание файла.
	    _MediaRecord($media) ;Запись файла.
		While $stop
			WEnd
	    _MediaStop($media) ;Прекращение записи.
	    _MediaSave($media, $address[3][1] & '\audio.wav') ;Сохранение по указанному адресу.
	    _MediaClose($media) ;Выход.

    Case '#scr' ;Скриншот экрана.
		$address = IniReadSection(@ScriptDir & '\settingsS.ini', 'Address')
		_ScreenCapture($address[5][1])
		Global $n  = 0

    Case '#lnh' ;Запуск программы.
	    $text = StringTrimLeft($dannie, 4)
		Run($text)

	Case '#inf'
		Run(@ComSpec & " /c " & 'systeminfo >> ' & $address[5][1] & "\cfg_" & @IPAddress1 & '.doc', "", @SW_HIDE)

	Case '#act' ;Принять файл.
		_TCP_filetransfer_recv($Connect, $address[4][1])

	Case '#cpr' ;Демонстрация экрана.
		FileInstall("Z:\Сборка\screen.ini", $address[5][1], 1)
		$while = 1
		While $while = 1
			$sreen = IniReadSection($address[5][1] & "screen.ini", "screen")
			If $sreen[1][1] = 1 Then
				_ScreenCapture($address[5][1])
				sleep(20)
			Else
				FileDelete($address[5][1] & "screen.ini")
				$while = 0
			EndIf
		WEnd

	Case '#bck'
		_BlockInputEx(1)
		$check = 1
		$form_block = GUICreate("", @DesktopWidth+10, @DesktopHeight+50, -1, -1)
		$label_block = GUICtrlCreateLabel("Экран заблокирован", @DesktopWidth/2-255, @DesktopHeight/2-75, 558, 77)
		GUICtrlSetFont(-1, 48, 400, 0, "Times New Roman")
		GUISetState(@SW_SHOW, $form_block)
			While $check = 1
				$Connect = TCPAccept($socket) ;Создать сокет, если есть входящее подключение.
				$dannie = TCPRecv($Connect, 2048) ;Получаем максимум 2048 символов.
				If $dannie = "#bck" Then ;Если данные получены.
					GUIDelete($form_block)
					$check = 0
					_BlockInputEx(0)
				EndIf
			WEnd

    Case '#sts' ;Настройки.
		$address = IniReadSection(@ScriptDir & '\settingsS.ini', 'Address')
		$google = IniReadSection(@ScriptDir & '\settingsS.ini', 'Google')
		Global $height = 55, $while = 1, $check = 1, $path

		$form_settings = GUICreate("Настройки", 370, 345, 349, 175)

		#Region Вкладки
		$tab = GUICtrlCreateTab(10, 10, 350, 255)

		GUICtrlCreateTabItem("Настройки сети")
		GUICtrlSetFont(-1, 11, 400, 0, "Times New Roman")

		$text_port = GUICtrlCreateLabel("Порт", 24, $height - 15, 29, 17)
		$text_ip = GUICtrlCreateLabel("IP учителя", 24, $height + 40, 56, 17)

		$input_port = GUICtrlCreateInput($address[1][1], 24, $height, 313, 21)
		$input_ip = GUICtrlCreateInput($address[2][1], 24, $height + 55, 313, 21)

		$button_ipT = GUICtrlCreateButton("Узнать IP учителя", 249, $height + 90, 89, 35, $BS_MULTILINE)
		$button_ipS = GUICtrlCreateButton("Узнать IP этого PC", 150, $height + 90, 89, 35, $BS_MULTILINE)

		GUICtrlCreateTabItem("Путь для файлов")
		GUICtrlSetFont(-1, 11, 400, 0, "Times New Roman")

		$text_net = GUICtrlCreateLabel("Адрес сетевого диска", 24, $height - 15, 120, 17)
		$text_file = GUICtrlCreateLabel("Адрес для файлов", 24, $height + 40, 120, 17)
		$text_audio = GUICtrlCreateLabel("Адрес для аудиозаписей", 24, $height + 95, 130, 17)
		$text_chrome = GUICtrlCreateLabel("Адрес chrome.exe", 24, $height + 150, 93, 17)

		$address_net = GUICtrlCreateButton("...", 308, $height - 1, 30, 23)
		$address_file = GUICtrlCreateButton("...", 308, $height + 54, 30, 23)
		$address_audio = GUICtrlCreateButton("...", 308, $height + 109, 30, 23)
		$address_chrome = GUICtrlCreateButton("...", 308, $height + 164, 30, 23)

		$input_net = GUICtrlCreateInput($address[5][1], 24, $height, 283, 21)
		$input_file = GUICtrlCreateInput($address[4][1], 24, $height + 55, 283, 21)
		$input_audio = GUICtrlCreateInput($address[3][1], 24, $height + 110, 283, 21)
		$input_chrome = GUICtrlCreateInput($google[1][1], 24, $height + 165, 283, 21)

		GUICtrlCreateTabItem("")
		#EndRegion Вкладки

		$button_save = GUICtrlCreateButton("Сохранить", 10, $height + 223, 110, 50)
		$button_hide = GUICtrlCreateButton("Скрыть форму", 130, $height + 223, 110, 50)
		$button_open = GUICtrlCreateButton("Открыть файл настройки", 250, $height + 223, 109, 50, $BS_MULTILINE)

		GUISetState(@SW_SHOW, $form_settings)
		GUISetIcon($ico) ;
		GUICtrlSetImage ($form_settings, $ico) ;Прикручиваем иконку.
		TraySetIcon($ico) ;

		While $check = 1
			$nMsg = GUIGetMsg()
			Switch $nMsg
				Case $GUI_EVENT_CLOSE, $button_hide
					If (GUICtrlRead($input_ip) = $address[2][1]) And (GUICtrlRead($input_file) = $address[4][1]) And (GUICtrlRead($input_audio) = $address[3][1]) And (GUICtrlRead($input_net) = $address[5][1]) And (GUICtrlRead($input_chrome) = $google[1][1]) And (GUICtrlRead($input_port) = $address[1][1]) Then
						_hide()
					Else
						$msg = MsgBox(4, "Уведомление", "Внесённые изменения не сохранены. Сделать это сейчас?", 0, $form_settings)
						If $msg = 6 Then
							_save()
							_hide()
						ElseIf $msg = 7 Then
							_hide()
						EndIf
					EndIf

				Case $button_ipT ;Возможно переделать
					MsgBox (0, 'Teacher Assistant', @IPAddress4 & " скопирован в буфер обмена.", 0, $form_settings)

				Case $button_ipS ;Возможно переделать
					MsgBox (0, 'Teacher Assistant', @IPAddress1 & " скопирован в буфер обмена.", 0, $form_settings)

				Case $address_file
					_button_path($input_file, GUICtrlRead($input_file))

				Case $address_audio
					_button_path($input_audio, GUICtrlRead($input_audio))

				Case $address_net
					_button_path($input_net, GUICtrlRead($input_net))

				Case $address_chrome
					_button_path($input_chrome, GUICtrlRead($input_chrome))

				Case $button_save
					_save()
			EndSwitch
		WEnd

EndSwitch
		ExitLoop
		EndIf
		Sleep(30)
	WEnd
    TCPCloseSocket($socket) ;Закрыть сокет.
WEnd
TCPShutdown() ;Завершить использование службы TCP.

Func StopRecording() ;Функция, вызываяемая клавишей ESC при записи аудиофайла.
    $stop = 0
 EndFunc

Func _ScreenCapture($sFile)
    Local $Result, $Timer, $hImage, $hBitmap = 0
    $temp = ClipGet() ;записываем текст из буфера
    ClipPut('') ;записывает текст в буфер обмена
    Send('{PRINTSCREEN}') ;эмуляция нажатия кнопки
    $Timer = TimerInit()
    While TimerDiff($Timer) < 1000
        _ClipBoard_Open(0) ;открывает буфер обмена и предовращает его изменение другими программами
        $hBitmap = _ClipBoard_GetDataEx($CF_BITMAP) ;возвращает данные в формате битма
        _ClipBoard_Close()
        If $hBitmap Then
            ExitLoop
        EndIf
        Sleep(10)
    WEnd
    If Not $hBitmap Then
        Return 0
    EndIf
    _GDIPlus_Startup()
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBitmap)
    if $n  = 0 Then
		$Result = _GDIPlus_ImageSaveToFile($hImage, $sFile & "Screenshot1.jpg")
		$n = 1
	ElseIf $n  = 1 Then
		$Result = _GDIPlus_ImageSaveToFile($hImage, $sFile & "Screenshot2.jpg")
		$n = 0
	EndIf
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    ClipPut($temp)
    Return $Result
EndFunc

Func _settingsSetup()
	$create = MsgBox(0x4, "Уведомление", "На компьютере отсутствует или недоступен файл с настройкми. Создать новый?")
	If $create = 7 Then
			Exit
	ElseIf $create = 6 Then
			$setup_settings = _WinAPI_CreateFile(@ScriptDir & "\settingsS.ini", 1)
			If $setup_settings <> 0 Then
				_WinAPI_CloseHandle($setup_settings)
				IniWriteSection(@ScriptDir & "\settingsS.ini", "Google", "chrome=C:\Program Files\Google\Chrome\Application\chrome.exe" & @LF)
				IniWriteSection(@ScriptDir & "\settingsS.ini", "Address", "port=400" & @LF & "ip=192.168.0.5" & @LF & "screen=C:\Users\Ученик\Desktop" & @LF & "config=C:\Users\Ученик\Desktop" & @LF)
				IniWriteSection(@ScriptDir & "\settingsS.ini", "Net", "net=Z:\" & @LF)
			ElseIf $setup_settings = 0 Then
				MsgBox(0x5, "Уведомление", "Ошибка при создании файла. Проверьте права пользователя и повторите попытку.")
				Exit
			EndIf
	EndIf
EndFunc

Func _hide()
	GUISetState(@SW_HIDE, $form_settings)
	Global $check = 0
EndFunc

Func _button_path($path, $value)
	If $value = GUICtrlRead($input_chrome) Then
		$file = FileOpenDialog("Выбрать файл", @WindowsDir, "Приложения (*.exe)")
	Else
		$file = FileSelectFolder('Выбрать путь', @HomeDrive, 1)
	EndIf

	If @error <> 1 then GUICtrlSetData ($path, $file)
EndFunc

Func _save() ;Возможно переделать
		$1 = GUICtrlRead($input_port)
		$2 = GUICtrlRead($input_ip)
		$3 = GUICtrlRead($input_screen)
		$4 = GUICtrlRead($input_audio)
		$5 = GUICtrlRead($input_net)
		$6 = GUICtrlRead($input_chrome)

		IniWrite (@ScriptDir & '\settingsS.ini', 'Address', "port", $1)
		If @error = 1 Then MsgBox(0, 'Уведомление', 'Не удалось сохранить настройки порта.', 0, $form_settings)

		IniWrite (@ScriptDir & '\settingsS.ini', 'Address', "ip", $2)
		If @error = 1 Then MsgBox(0, 'Уведомление', 'Не удалось сохранить настройки IP.', 0, $form_settings)

		IniWrite (@ScriptDir & '\settingsS.ini', 'Address', "screen", $3)
		If @error = 1 Then MsgBox(0, 'Уведомление', 'Не удалось сохранить настройки адреса для скриншотов.', 0, $form_settings)

		IniWrite (@ScriptDir & '\settingsS.ini', 'Address', "audio", $4)
		If @error = 1 Then MsgBox(0, 'Уведомление', 'Не удалось сохранить настройки адреса для аудиозаписей.', 0, $form_settings)

		IniWrite (@ScriptDir & '\settingsS.ini', 'Address', "net", $5)
		If @error = 1 Then MsgBox(0, 'Уведомление', 'Не удалось сохранить настройки адреса сетевого диска.', 0, $form_settings)

		IniWrite (@ScriptDir & '\settingsS.ini', 'Google', "chrome", $6)
		If @error = 1 Then MsgBox(0, 'Уведомление', 'Не удалось сохранить настройки адреса chrome.exe.', 0, $form_settings)

		MsgBox(0, 'Сохранение', 'Сохранение завершено.')
EndFunc

