ShadowedStranger Posted April 9, 2011 Share Posted April 9, 2011 Hey there all, this is my first post so... HEY! Anywho, I 'wrote' a little prank script to do beeps and text to speech remotely... I saw 'wrote' because I took the TCP example scripts and added about 10 lines to them... Anyway, They work fine so I am not asking anyone to fix my script to make it work. I would just like to become better at autoit, and I am wondering if anyone has some tips for how to better parse the input of $recv. It seems like the way I am doing it is not the most efficient or robust. It would definitely start being fun to parse once multiple arguments are passed. I do want to say that I am familiar with the Switch...Case, etc as an alternative to my If...then, but I didn't feel that it was necessary with just 3 arguments. I am mainly wondering of a better way to parse text. If you see any other noob mistakes, feel free to point them out/call me stupid/whack me with a stick/etc. Client: You can see how it's formatted expandcollapse popup#include <ButtonConstants.au3> #include <EditConstants.au3> #include <GUIConstantsEx.au3> #include <StaticConstants.au3> #include <WindowsConstants.au3> Opt('MustDeclareVars', 1) ;============================================== ;============================================== ;CLIENT! Start Me after starting the SERVER!!!!!!!!!!!!!!! ;============================================== ;============================================== Example() Func Example() Local $Form1, $ttsinput, $Label1, $readtext, $Label2, $beeppitch, $Label3, $beeplength, $sendbeep, $nMsg, $szData #Region ### START Koda GUI section ### Form= $Form1 = GUICreate("Beepinator", 314, 124, 192, 124) $ttsinput = GUICtrlCreateInput("ttsinput", 8, 32, 217, 21) $Label1 = GUICtrlCreateLabel("Text To Speech", 8, 8, 25, 17) $readtext = GUICtrlCreateButton("Read Text", 232, 5, 73, 57, $WS_GROUP) $Label2 = GUICtrlCreateLabel("BEEP Frequency (37-32767)", 8, 64, 139, 17) $beeppitch = GUICtrlCreateInput("", 152, 64, 73, 21) $Label3 = GUICtrlCreateLabel("BEEP length (in milliseconds)", 8, 96, 140, 17) $beeplength = GUICtrlCreateInput("", 152, 96, 73, 21) $sendbeep = GUICtrlCreateButton("Send Beep", 232, 69, 73, 49, $WS_GROUP) GUISetState(@SW_SHOW) #EndRegion ### END Koda GUI section ### ; Set Some reusable info ;-------------------------- Local $ConnectedSocket, $szData ; Set $szIPADDRESS to wherever the SERVER is. We will change a PC name into an IP Address ; Local $szServerPC = @ComputerName ; Local $szIPADDRESS = TCPNameToIP($szServerPC) Local $szIPADDRESS = "10.10.10.10" ;IP address of server. Local $nPORT = 33891 ; Start The TCP Services ;============================================== TCPStartup() ; Initialize a variable to represent a connection ;============================================== $ConnectedSocket = -1 ;Attempt to connect to SERVER at its IP and PORT 33891 ;======================================================= $ConnectedSocket = TCPConnect($szIPADDRESS, $nPORT) ; If there is an error... show it If @error Then MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error) ; If there is no error loop an inputbox for data ; to send to the SERVER. Else ;Loop forever asking for data to send to the SERVER While 1 ; InputBox for data to transmit ;$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:") While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $readtext $szData = GuiCtrlRead($ttsinput) TCPSend($ConnectedSocket, $szData) Case $sendbeep $szData = "BEEP" & GuiCtrlRead($beeppitch) & ":" & GuiCtrlRead($beeplength) TCPSend($ConnectedSocket, $szData) EndSwitch WEnd ; If they cancel the InputBox or leave it blank we exit our forever loop If @error Or $szData = "" Then ExitLoop ; We should have data in $szData... lets attempt to send it through our connected socket. TCPSend($ConnectedSocket, $szData) ; If the send failed with @error then the socket has disconnected ;---------------------------------------------------------------- If @error Then ExitLoop WEnd EndIf EndFunc ;==>Example Server: You can see how it's parsed. expandcollapse popup#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_UseX64=n #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include <GUIConstantsEx.au3> Opt('MustDeclareVars', 1) Opt("TrayIconHide", 1) ;============================================== ;============================================== ;SERVER!! Start Me First !!!!!!!!!!!!!!! ;============================================== ;============================================== Example() Func Example() ; Set Some reusable info ; Set your Public IP address (@IPAddress1) here. ; Local $szServerPC = @ComputerName ; Local $szIPADDRESS = TCPNameToIP($szServerPC) Local $szIPADDRESS = "172.20.227.39" Local $nPORT = 33891 Local $MainSocket, $GOOEY, $edit, $ConnectedSocket, $szIP_Accepted Local $msg, $recv, $tts, $sendtext, $oSp, $beepfrequency, $beeptemp, $beeplength, $stringtrimrightamount $oSp = ObjCreate("SAPI.SpVoice") ; Start The TCP Services ;============================================== TCPStartup() ; Create a Listening "SOCKET". ; Using your IP Address and Port 33891. ;============================================== $MainSocket = TCPListen($szIPADDRESS, $nPORT) ; If the Socket creation fails, exit. If $MainSocket = -1 Then Exit ; Create a GUI for messages ;============================================== $GOOEY = GUICreate("My Server (IP: " & $szIPADDRESS & ")", 300, 200) $edit = GUICtrlCreateEdit("", 10, 10, 280, 180) ; Initialize a variable to represent a connection ;============================================== $ConnectedSocket = -1 ;Wait for and Accept a connection ;============================================== Do $ConnectedSocket = TCPAccept($MainSocket) Until $ConnectedSocket <> -1 ; Get IP of client connecting $szIP_Accepted = SocketToIP($ConnectedSocket) ; GUI Message Loop ;============================================== While 1 $msg = GUIGetMsg() ; GUI Closed ;-------------------- If $msg = $GUI_EVENT_CLOSE Then ExitLoop ; Try to receive (up to) 2048 bytes ;---------------------------------------------------------------- $recv = TCPRecv($ConnectedSocket, 2048) ; If the receive failed with @error then the socket has disconnected ;---------------------------------------------------------------- If @error Then ExitLoop ; Update the edit control with what we have received ;---------------------------------------------------------------- If $recv <> "" Then If StringInStr($recv, "BEEP") > 0 Then ;$oSp.Speak($recv) $beeptemp = $recv $beepfrequency = StringTrimLeft($beeptemp, 4) $stringtrimrightamount = StringLen($beepfrequency)-StringInStr($beeptemp, ":")+1 $beepfrequency = StringTrimRight($beepfrequency, $stringtrimrightamount) $beeplength = StringTrimLeft($beeptemp, StringInStr($beeptemp, ":")) ;MsgBox(0, "Beep Pitch", $beepfrequency) ;MsgBox(0, "Beep Length", $beeplength) Beep($beepfrequency, $beeplength) Else $oSp.Speak($recv) EndIf EndIf WEnd If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket) TCPShutdown() EndFunc ;==>Example ; Function to return IP Address from a connected socket. ;---------------------------------------------------------------------- Func SocketToIP($SHOCKET) Local $sockaddr, $aRet $sockaddr = DllStructCreate("short;ushort;uint;char[8]") $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _ "ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr)) If Not @error And $aRet[0] = 0 Then $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3)) If Not @error Then $aRet = $aRet[0] Else $aRet = 0 EndIf $sockaddr = 0 Return $aRet EndFunc ;==>SocketToIP Link to comment Share on other sites More sharing options...
smartee Posted April 9, 2011 Share Posted April 9, 2011 Hi and welcome to the forums, please don't make prank scripts, it is a waste of your time, antivirus engineers' time, and our time since antiviruses sometimes flag our legitimate scripts as viruses. If you want to learn more please mature a little. Link to comment Share on other sites More sharing options...
smartee Posted April 9, 2011 Share Posted April 9, 2011 On a separate note, check the help file, for additional ways to parse strings, such asStringRegExp StringMid StringInStr Link to comment Share on other sites More sharing options...
Mat Posted April 9, 2011 Share Posted April 9, 2011 Am I right in saying you want something like: "BEEP123:123"?Ever heard of regular expressions? Well unfortunately for you thats what you want.$recv = "BEEP123:456" $a = StringRegExp($recv, "BEEP(\d+)\:(\d+)", 3) MsgBox(0, "Beep test", "Frequency: " & $a[0] & @CRLF & "Length: " & $a[1])You'd better get reading. Regular Expressions (regex) is a bit and complex subject. You must have heard the joke: A programmer had a problem. He decided to use regex to solve it. Said programmer now has two problems AutoIt Project Listing Link to comment Share on other sites More sharing options...
ShadowedStranger Posted April 9, 2011 Author Share Posted April 9, 2011 (edited) Am I right in saying you want something like: "BEEP123:123"? Ever heard of regular expressions? Well unfortunately for you thats what you want. $recv = "BEEP123:456" $a = StringRegExp($recv, "BEEP(\d+)\:(\d+)", 3) MsgBox(0, "Beep test", "Frequency: " & $a[0] & @CRLF & "Length: " & $a[1]) You'd better get reading. Regular Expressions (regex) is a bit and complex subject. You must have heard the joke: A programmer had a problem. He decided to use regex to solve it. Said programmer now has two problems I can't seem to find the edit button, is it disabled after someone replies? Anyway since cartman isn't a fan of pranks because I am immature, I apologize, if mods could edit that part out. I actually wrote this as a trial or learning experiment for another script that will be pulling information from an xml input, and the way I was doing it would be a nightmare with a billion arguments to parse, hence why I am asking for a better way to parse incoming text. Either way, both of you responded with stringregexp, so I will do some research on that, thanks a bunch! Smartee: Thanks for the stringmid, I was looking at the help file but silly me assumed that found a midpoint of a string... It's what I get for assuming something. EDIT: MAT: Regex looks like exactly what I wanted, Now to figure out how to work this, time for me to do some homework. Thanks again guys(gals?)! Edited April 9, 2011 by ShadowedStranger Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now