Opt("TrayIconDebug", 1)
Opt("WinTitleMatchMode", 2)
Opt("TCPTimeout", 300)
Opt("GUICloseOnESC", 0)
#include <IE.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>
#include <StaticConstants.au3>
$proj = "Tet-a-Tet"
$hCW = GUICreate("Tet-a-Tet - Client", 1000, 600, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_SYSMENU, $WS_CLIPCHILDREN))
GUISetIcon(@SystemDir & "\notepad.exe")
GUISetFont(15, 800, 0, "Courier New")
$inputStr = GUICtrlCreateInput("", 5, 570, 900, 27)
GUICtrlSetLimit($inputStr, 64)
$buttSend = GUICtrlCreateButton("Send", 910, 570, 85, 27, $BS_DEFPUSHBUTTON + $BS_FLAT)
$null = GUICtrlCreateDummy()
Dim $AccelKeys[4][2] = [["{F5}", $null],["^{F5}", $null],["^n", $null],["^p", $null]]
GUISetAccelerators($AccelKeys, $hCW) ; предотвращение нажатий кнопок "обновить", "печать", "создать новое окно" в IE
$hSW = GuiCreate("Tet-a-Tet", 200, 200)
GUISetIcon(@SystemDir & "\notepad.exe")
$tab = GUICtrlCreateTab(0, 0, 200, 200)
$tabMain = GUICtrlCreateTabItem("Main")
$radioCl = GUICtrlCreateRadio("Client", 10, 30, 50)
GUICtrlSetState($radioCl, $GUI_CHECKED)
$radioSv = GUICtrlCreateRadio("Server", 70, 30, 50)
$label_1 = GUICtrlCreateLabel("Enter your nickname:", 10, 55, 180, 17)
$inputName = GuiCtrlCreateInput("user_" & Round(Random(999)), 10, 75, 180, 21)
GUICtrlSetLimit($inputName, 24)
$label_2 = GUICtrlCreateLabel("Enter server IP-address", 10, 105, 120, 17)
$inputIp = GuiCtrlCreateInput("10.76.1.6", 10, 125, 110, 21)
GUICtrlSetLimit($inputIp, 15)
$label_3 = GUICtrlCreateLabel("port", 150, 105, 40, 17)
$inputPort = GuiCtrlCreateInput("8462", 130, 125, 60, 21)
GUICtrlSetLimit($inputPort, 8)
$buttConnect = GUICtrlCreateButton("Connect", 50, 160, 100, 30, $BS_DEFPUSHBUTTON + $BS_FLAT)
$ab = GUICtrlCreateTabItem("About")
GUICtrlCreateTabitem("")
$objOut = 0
$sIns = ""
$socket = -1
GUISetState(@SW_SHOW, $hSW)
While 1
$msg = GUIGetMsg()
Select
Case $msg = -3
TCPShutdown()
Exit
Case $msg = $radioSv
GUICtrlSetState($label_2, $GUI_DISABLE)
GUICtrlSetState($inputIp, $GUI_DISABLE)
GUICtrlSetData($buttConnect, "Start")
WinSetTitle("Tet-a-Tet - Client", "", "Tet-a-Tet - Server")
Case $msg = $radioCl
GUICtrlSetState($label_2, $GUI_ENABLE)
GUICtrlSetState($inputIp, $GUI_ENABLE)
GUICtrlSetData($buttConnect, "Connect")
WinSetTitle("Tet-a-Tet - Server", "", "Tet-a-Tet - Client")
Case $msg = $buttConnect And GUICtrlRead($radioSv) = 1 ; старт сервера
$sNick = GUICtrlRead($inputName)
$sPort = GUICtrlRead($inputPort)
If $sNick = "" Or $sPort = "" Then
GUISetState(@SW_DISABLE, $hSW)
MsgBox(0x40000, "Error", "Fill empty fields")
GUISetState(@SW_ENABLE, $hSW)
Else ; создание сокета
GUISetState(@SW_HIDE, $hSW)
GUISetState(@SW_SHOW, $hCW)
_IE_Out_create()
GUICtrlSetState($inputStr, $GUI_DISABLE)
GUICtrlSetState($buttSend, $GUI_DISABLE)
TCPStartup()
_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>Starting server</b></font>')
_scrollToBottom($objOut)
$count = 1
Sleep(1000)
$startSocket = TCPListen(@IPAddress1, $sPort)
While $startSocket = -1 ; повторное создание сокета
$count += 1
If $count = 11 Then ; после 10 неаудачных попыток - выход
_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>All attempts not succesfuls
Quit...</b></font>
')
_scrollToBottom($objOut)
Sleep(2500)
_exit_CW()
ExitLoop
EndIf
_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>.</b></font>')
_scrollToBottom($objOut)
Sleep(1000)
TCPCloseSocket($startSocket)
Sleep(500)
$startSocket = TCPListen(@IPAddress1, $sPort)
Sleep(500)
WEnd
If $startSocket <> -1 Then ; ожидание входящих подключений
Opt("GUIOnEventMode", 1)
_IEDocInsertHTML($objOut, _
'
<font color="#FFFFFF"><b>Server succesfuly running!
Waiting incoming connections press [Ctrl-Z] for canceling... </b></font>')
_scrollToBottom($objOut)
Sleep(1000)
$abort = 0
GUISetOnEvent("-3", "_exit_CW", $hCW)
HotKeySet("^z", "_exit_CW")
Do ; ожидание входящих подключений в цикле
If $abort = 1 Then ExitLoop ; выход по команде пользователя
_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>.</b></font>')
_scrollToBottom($objOut)
$socket = TCPAccept($startSocket)
Sleep(1000)
Until $socket <> -1
HotKeySet("^z")
If $abort = 0 Then ; клиент присоединился, получаем его Ник и IP-адрес
Do
If $abort = 1 Then ExitLoop ; выход по команде пользователя
If $socket = -1 Then
_IEDocInsertHTML($objOut, '
<font color="#FFFFFF"><b>Connection lost</b></font>')
_scrollToBottom($objOut)
Sleep(2500)
GUISetState(@SW_SHOW, $hSW)
GUISetState(@SW_HIDE, $hCW)
GUICtrlDelete($objOut)
TCPShutdown()
ExitLoop
EndIf
$sClNick_IP = TCPRecv($socket, 54)
Sleep(100)
Until StringLen($sClNick_IP) >= 1
$aClNick_IP = StringSplit($sClNick_IP, "###$$$000uuu@@@", 1)
$sNick2 = $aClNick_IP[1]
$sIP2 = $aClNick_IP[2]
If $sNick2 = $sNick Then $sNick2 = $sNick2 & "_1" ; если ники сервера и клиента совпадают - переименовываем клиентский
If $sNick2 <> "" Then ; при получении ника соединение оборвалось
$sIns = '
<b><font color="#FFFFFF">Client </font><font color="#0000FF">' & $sNick2 _
& '</font><font color="#FFFFFF"> connected from IP </font><font color="#0000FF">' & $sIP2 & '</font></b>
'
_IEDocInsertHTML($objOut, $sIns)
_scrollToBottom($objOut)
TCPSend($socket, $sNick) ; передаем свой ник
GUICtrlSetState($inputStr, $GUI_ENABLE)
GUICtrlSetState($buttSend, $GUI_ENABLE)
Opt("GUIOnEventMode", 1)
GUISetOnEvent("-3", "_exit_CW", $hCW)
GUICtrlSetOnEvent($buttSend, "_send_message")
While $socket <> -1 ; пока есть соединение - отправляем/принимаем сообщения
If $abort = 1 Then ExitLoop ; выход по команде пользователя
Sleep(25)
$sIn = TCPRecv($socket, 64)
If StringLen($sIn) >=1 And $sIn = "###$$$000uuu@@@" Then ; получена команда завершения соедининия от клиента
$sIns = '
<b><font color="#FFFFFF">Connection closed by </font><font color="#0000FF">' & $sNick2 & _
'</font><font color="#FFFFFF">
Quit...</font></b>'
_IEDocInsertHTML($objOut, $sIns)
_scrollToBottom($objOut)
Sleep(2500)
GUISetState(@SW_SHOW, $hSW)
GUISetState(@SW_HIDE, $hCW)
GUICtrlDelete($objOut)
TCPShutdown()
ExitLoop
ElseIf StringLen($sIn) <> 0 Then ; отображение сообщения клиента
$sIns = '<font color="#0000FF"><b>' & $sNick2 & '</b></font><font color="#FF0000"> << </font><font color="#00A800">' _
& $sIn & '</font>
'
_IEDocInsertHTML($objOut,$sIns)
_scrollToBottom($objOut)
EndIf
WEnd
EndIf
EndIf
Opt("GUIOnEventMode", 0)
EndIf
EndIf
Case $msg = $buttConnect And GUICtrlRead($radioCl) = 1 ; запуск клиента
$sNick = GUICtrlRead($inputName)
$ip = GUICtrlRead($inputIp)
$sPort = GUICtrlRead($inputPort)
If $ip = "" Or $sNick = "" Or $sPort = "" Then
GUISetState(@SW_DISABLE, $hSW)
MsgBox(0x40000, "Error", "Fill empty fields")
GUISetState(@SW_ENABLE, $hSW)
ElseIf _IsIP($ip) <> 1 Then ; проверка синтаксиса строки адреса сервера
GUISetState(@SW_DISABLE, $hSW)
MsgBox(0x40000, "Syntax Error", "IP-Address incorrect")
GUISetState(@SW_ENABLE, $hSW)
Else ; соединение с сервером
Opt("GUIOnEventMode", 1)
GUISetState(@SW_HIDE, $hSW)
GUISetState(@SW_SHOW, $hCW)
_IE_Out_create()
GUICtrlSetState($inputStr, $GUI_DISABLE)
GUICtrlSetState($buttSend, $GUI_DISABLE)
TCPStartup()
$sIns = '<b><font color="#FFFFFF">Connecting to server </font><font color="#0000FF">' & $ip _
& '</font><font color="#FFFFFF"> press [Ctrl-Z] for canceling... </font></b>'
_IEDocInsertHTML($objOut, $sIns)
_scrollToBottom($objOut)
Sleep(1000)
$abort = 0
GUISetOnEvent("-3", "_exit_CW", $hCW)
HotKeySet("^z", "_exit_CW")
Do ; попытки соединения с сервером в цикле
If $abort = 1 Then ExitLoop ; выход по команде пользователя
_IEDocInsertHTML($objOut, '<font color="#FFFFFF"><b>.</b></font>')
_scrollToBottom($objOut)
$socket = TCPConnect($ip, $sPort)
Sleep(1000)
Until $socket <> -1
HotKeySet("^z")
If $abort = 0 Then ; после соединения передаем ник клиента и его IP-адрес на сервер, с использованием разделителя (=
TCPSend($socket, $sNick & "###$$$000uuu@@@" & @IPAddress1)
Do ; ждем получения ника сервера
If $abort = 1 Then ExitLoop ; выход по команде пользователя
If $socket = -1 Then
_IEDocInsertHTML($objOut, '
<font color="#FFFFFF"><b>Connection lost</b></font>')
_scrollToBottom($objOut)
Sleep(2500)
GUISetState(@SW_SHOW, $hSW)
GUISetState(@SW_HIDE, $hCW)
GUICtrlDelete($objOut)
TCPShutdown()
ExitLoop
EndIf
$sSvNick = TCPRecv($socket, 24)
Sleep(100)
Until StringLen($sSvNick) >= 1
If $sSvNick = $sNick Then $sSvNick = $sSvNick & "_1" ; если ники сервера и клиента совпадают - переименовываем серверный
If $sSvNick <> "" Then ; при получении ника соединение оборвалось
$sIns = '
<b><font color="#FFFFFF">Successful join with server </font><font color="#0000FF">' & $ip _
& '</font><font color="#FFFFFF">, now on server - </font><font color="#0000FF">' & $sSvNick & '</font></b>
'
_IEDocInsertHTML($objOut, $sIns)
_scrollToBottom($objOut)
GUICtrlSetState($inputStr, $GUI_ENABLE)
GUICtrlSetState($buttSend, $GUI_ENABLE)
GUICtrlSetOnEvent($buttSend, "_send_message")
While $socket <> -1 ; пока есть соединение - отправляем/принимаем сообщения
If $abort = 1 Then ExitLoop ; выход по команде пользователя
Sleep(250)
$sIn = TCPRecv($socket, 64)
If StringLen($sIn) >=1 And $sIn = "###$$$000uuu@@@" Then ; получена команда завершения соедининия от клиента
$sIns = '
<b><font color="#FFFFFF">Connection closed by </font><font color="#0000FF">' & $sSvNick _
& '</font><font color="#FFFFFF">
Quit...</font></b>'
_IEDocInsertHTML($objOut, $sIns)
_scrollToBottom($objOut)
Sleep(2500)
GUISetState(@SW_SHOW, $hSW)
GUISetState(@SW_HIDE, $hCW)
GUICtrlDelete($objOut)
TCPShutdown()
ExitLoop
ElseIf StringLen($sIn) <> 0 Then ; отображение сообщения сервера
$sIns = '<font color="#0000FF"><b>' & $sSvNick & '</b></font><font color="#FF0000"> << </font><font color="#00A800">' _
& $sIn & '</font>
'
_IEDocInsertHTML($objOut, $sIns)
_scrollToBottom($objOut)
EndIf
WEnd
EndIf
EndIf
Opt("GUIOnEventMode", 0)
EndIf
Case $msg = $tab
If GUICtrlRead($tab) = 1 Then
GUICtrlSetState($tabMain, $GUI_SHOW)
_about($proj)
EndIf
EndSelect
WEnd
Func _IE_Out_create()
$oIE = _IECreateEmbedded()
$objOutCtrl = GUICtrlCreateObj($oIE, 5, 5, 990, 560)
_IENavigate($oIE, 'about:blank')
$s_html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">' & @CR
$s_html &= '<html><head><title>Chat Tet-a-Tet</title>'
$s_html &= '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">'
$s_html &= '<style type="text/css">'
$s_html &= 'body {background-color: #000000; margin="5"; font-family: "Courier New", sans-serif; font-size: 15pt;}'
$s_html &= '</style>'
$s_html &= '</head>'
$s_html &= '<body></body></html>'
_IEDocWriteHTML($oIE, $s_html)
$objOut = _IETagNameGetCollection($oIE, "body", 0)
_IEHeadInsertEventScript($oIE, "document", "oncontextmenu", "return false") ; запрет на появление контестного меню в IE
EndFunc ;==>_IE_Out_create
Func _exit_CW()
If $socket <> -1 Then TCPSend($socket, "###$$$000uuu@@@")
_IEDocInsertHTML($objOut, '
<font color="#FFFFFF"><b>Session is interrupted by user
Quit...</b></font>')
_scrollToBottom($objOut)
Sleep(1000)
GUISetState(@SW_SHOW, $hSW)
GUISetState(@SW_HIDE, $hCW)
GUICtrlDelete($objOut)
TCPShutdown()
HotKeySet("^z")
$abort = 1
EndFunc ;==>_exit_CW
Func _IsIP($ip)
$aOctet = StringSplit($ip, ".")
If StringRegExp($ip, "(\A\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z)") = 0 Then
Return 0
ElseIf $aOctet[1] = 0 Or $aOctet[1] > 255 Or $aOctet[2] > 255 Or $aOctet[3] > 255 Or $aOctet[4] > 255 Then
Return -1
Else
Return 1
EndIf
EndFunc ;==>_IsIP
Func _send_message()
$sMess = GUICtrlRead($inputStr)
If $sMess = "###$$$000uuu@@@" Then
$sMess = "I am a stupid idiot - try to use bug"
TCPSend($socket, $sMess)
GUICtrlSetData($inputStr, "")
$sMess = '<font color="#00FF00"><b>' & $sNick & '</b></font><font color="#FF0000"> >> </font><font color="#00A800">' & $sMess & '</font>
'
_IEDocInsertHTML($objOut, $sMess)
_scrollToBottom($objOut)
ElseIf Not $sMess = "" Then
TCPSend($socket, $sMess)
GUICtrlSetData($inputStr, "")
$sMess = '<font color="#00FF00"><b>' & $sNick & '</b></font><font color="#FF0000"> >> </font><font color="#00A800">' & $sMess & '</font>
'
_IEDocInsertHTML($objOut, $sMess)
_scrollToBottom($objOut)
EndIf
EndFunc ;==>_send_message
Func _scrollToBottom($oIE)
$sHeight = $oIE.document.body.scrollHeight
$oIE.document.parentwindow.scrollTo(0, $sHeight)
EndFunc ;==>_scrollToBottom
Func _about($proj)
$coord = WinGetPos($proj)
WinSetState($hSW, "", @SW_DISABLE)
$aboutGui = GUICreate("About " & $proj, 300, 120, $coord[0] - ((300 - $coord[2])/2) - 4, $coord[1] - ((120 - $coord[3])/2) - 11, -1, $WS_EX_TOOLWINDOW, $hSW)
$drag = GUICtrlCreatePic("", 0, 0, 300, 120, -1, $GUI_WS_EX_PARENTDRAG)
$prog_nm = GUICtrlCreateLabel($proj, 35, 42, 230, 25, $SS_CENTER)
GUICtrlSetFont($prog_nm, 11, 800)
GUICtrlCreateGroup("", 25, 20, 250, 58)
$copy = GUICtrlCreateLabel("Copyright © " & @YEAR & " Redline", 5, 102, 140, 15, $SS_LEFT)
GUICtrlSetState($copy, 128)
GUISetState(@SW_SHOW, $aboutGui)
While 1
$msg = GUIGetMsg($aboutGui)
Select
Case $msg = -3
ExitLoop
EndSelect
WEnd
WinSetState($hSW, "", @SW_ENABLE)
GUIDelete($aboutGui)
EndFunc ;==>_about