NEWEST VERSIONS:
Newest Version ( 09/01/09 ) Source Below
Newest Features:
Private Messaging Added (syntax below)
Read transfering private messages (server only, can be disabled)
Fixed bug that cause people to disconnect if their name was in someone elses name
(i.e. Meat disconnects for nick already in use because someone is named MeatMan)
You will now only disconnect if you are using the exact name of someone who is already connected.
Both logout and connect buttons have throttle protection
Syntax for Private Messaging Command
/msg name message (both client and server)
/msg $ message (to PM the server)
Feel free to append the current script to your liking, and if you have any suggestions, please post them here.
Features:
Winsock chat communication
Private Messages
Connected and Disconnected messages
User List
Kick users (server only)
IP grabber (server only)
Command mode (type /cmd)
- Ping
- IP2Location (wrote it awhile back, thought I'd throw it in here)
- VisitWeb
Configure Connection Menu
Hit 'Enter' = Quick Send
Hit 'UP' = Show Last Sent (Up to 5)
Hit 'DOWN' = Scroll Down on Last Sent (Clear if on last sent)
Also has a lot of filters on what you can send or not send.
Some Characters are reserved for certain functions, and also stops empty lines and spaces from being submitted.
Fixed Server bug were Showing the hidden server window would reveal a window in TeamSpeak 2 instead
Number Pad Enter is now working as a submit hotkey
Logout button added (wankaUSR)
And a bunch of other stuff!
Client:
#singleinstance force ;#notrayicon ifnotexist, %a_appdata%\Winsock-Chat { Filecreatedir, %a_appdata%\Winsock-Chat } menu, tray, icon, %A_Windir%\system32\narrator.exe menu, tray, nostandard menu, tray, add, Configure menu, tray, add, Exit filedelete, %a_appdata%\Winsock-Chat\i2l.txt filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt on=0 checkornot=0 con=0 end=0 las=1 ClientName=%A_Computername% Network_Address = 68.58.121.5 Network_Port = 1000 ifexist, %A_appdata%\Winsock-chat\clientinfo.ini { iniread, Network_address, %A_appdata%\Winsock-chat\clientinfo.ini, Info, ip iniread, Network_port, %A_appdata%\Winsock-chat\clientinfo.ini, Info, port } menu, tray, tip, Currently Set to`nIP: %Network_Address%`nPort: %Network_Port% colordef=C0C0C0 gui, color, %colordef% gui: stringmid, clientname, clientname, 0, 12 Gui, Add, Edit, x6 y5 w260 h140 readonly vchat, Gui, Add, Edit, x6 y155 w340 h20 vSendText, Gui, Add, Edit, x6 y185 w130 h20 limit12 vClientName, %ClientName% Gui, Add, Button, x146 y185 w80 h20 vsendbutton gSendviaNet, Send Gui, Add, Button, x236 y185 w70 h20 vconnect gConnection_Init, Connect Gui, Add, Edit, x276 y5 w110 h140 readonly vuserlistin, Gui, Add, Button, x316 y185 w70 h20 vedit gdiscon, Log Out guicontrol, disable, edit Gui, Show, h218 w394, WinSock Chat Client WinGet Gui_ID, ID, WinSock Chat Client guicontrol,,chat, Welcome to your Chat Client!`n`nTo set a different port or IP address in which to connect to you can right click the Icon in your System Tray then click "Configure"`nYou can also type /features to read about all the features your Chat Client has! return Configure: if on=1 { Msgbox, 16, WinSock Chat Client, Cannot configure when connected! return } else gui, 3:color, C0C0C0 Gui, 3:Add, Edit, x6 y5 w110 h20 vip, %Network_address% Gui, 3:Add, Text, x119 y8 w60 h20 , IP Address Gui, 3:Add, Edit, x6 y25 w110 h20 vport, %Network_port% Gui, 3:Add, Text, x119 y28 w30 h20 , Port Gui, 3:Add, Button, x26 y55 w110 h20 , Save Gui, 3:Show, h80 w175, Configure Return 3buttonsave: gui, 3:submit, nohide gui, 3:destroy Network_Address=%ip% Network_port=%port% menu, tray, tip, Currently Set to`nIP: %Network_Address%`nPort: %Network_Port% iniwrite, %Network_address%, %A_appdata%\Winsock-chat\clientinfo.ini, Info, ip iniwrite, %Network_port%, %A_appdata%\Winsock-chat\clientinfo.ini, Info, port return 3GuiClose: gui, 3:destroy return check: if on=0 { Settimer,check,off return } if on=1 { ifnotinstring, userlistin, %Clientname% { Settimer,check,off Msgbox, 16, WinSock Chat Client, Secure Link Could not be established. Please Restart Client exitapp } guicontrol, enable, edit Settimer,check,off } $numpadenter:: ifwinactive, WinSock Chat Client { goto, SendviaNet } else send, {NUMPADENTER} return $Enter:: ifwinactive, WinSock Chat Client { goto, SendviaNet } else send, {ENTER} return $UP:: ifwinactive, WinSock Chat Client, { if las=1 { guicontrol,,sendtext, %lasttype% ControlSend Edit2, ^{End}, WinSock Chat Client envadd, las, 1 return } if las=2 { guicontrol,,sendtext, %lasttype2% ControlSend Edit2, ^{End}, WinSock Chat Client envadd, las, 1 return } if las=3 { guicontrol,,sendtext, %lasttype3% ControlSend Edit2, ^{End}, WinSock Chat Client envadd, las, 1 return } if las=4 { guicontrol,,sendtext, %lasttype4% ControlSend Edit2, ^{End}, WinSock Chat Client envadd, las, 1 return } if las=5 { guicontrol,,sendtext, %lasttype5% ControlSend Edit2, ^{End}, WinSock Chat Client return } } else send, {UP} return $DOWN:: ifwinactive, WinSock Chat Client, { if las=1 { guicontrol,,sendtext, return } if las=2 { guicontrol,,sendtext, %lasttype% ControlSend Edit2, ^{End}, WinSock Chat Client envsub, las, 1 return } if las=3 { guicontrol,,sendtext, %lasttype2% ControlSend Edit2, ^{End}, WinSock Chat Client envsub, las, 1 return } if las=4 { guicontrol,,sendtext, %lasttype3% ControlSend Edit2, ^{End}, WinSock Chat Client envsub, las, 1 return } if las=5 { guicontrol,,sendtext, %lasttype4% ControlSend Edit2, ^{End}, WinSock Chat Client envsub, las, 1 return } } else send, {DOWN} return Connection_Init: gui, submit, nohide ifinstring, Clientname, %A_Space% { Msgbox, 16, WinSock Chat Client, You cannot use spaces in your name! return } ifinstring, Clientname, * { Msgbox, 16, WinSock Chat Client, You cannot use asteriks in your name! return } ifinstring, Clientname, RX2 { Msgbox, 16, WinSock Chat Client, You cannot use that in your name! return } ifinstring, Clientname, SR1 { Msgbox, 16, WinSock Chat Client, You cannot use that in your name! return } ifinstring, Clientname, : { Msgbox, 16, WinSock Chat Client, You cannot use colons in your name! return } ifinstring, Clientname, $ { Msgbox, 16, WinSock Chat Client, $ is reserved for ChatServer Prefix.`n %A_Space% %A_Space% %A_Space% %A_Space%%A_Space% %A_Space%You may not use it! return } if Clientname=Console { Msgbox, 16, WinSock Chat Client, ( %A_Space%%A_Space%%A_Space%%A_Space%Please choose a nickname to use while chatting in this server. You are limited to 12 characters in your nickname. You will be prevented from using certain characters in your nickname. ) return } ;menu, tray, delete, Configure guicontrol,,chat, guicontrol, disable, edit guicontrol,hide, connect guicontrol, hide, clientname guicontrol, move, sendbutton, x6 y185 w300 h20 OnExit, ExitSub DllCall("Ws2_32\WSACleanup") socket := ConnectToAddress(Network_Address, Network_Port) if socket = -1 ExitApp Process, Exist DetectHiddenWindows On ScriptMainWindowId := WinExist("ahk_class AutoHotkey ahk_pid " . ErrorLevel) DetectHiddenWindows Off NotificationMsg = 0x5555 ; An arbitrary message number, but should be greater than 0x1000. OnMessage(NotificationMsg, "ReceiveData") menu, tray, tip, Currently connected to`nIP: %Network_Address%`nPort: %Network_Port% FD_READ = 1 ; Received when data is available to be read. FD_CLOSE = 32 ; Received when connection has been closed. if DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket, "UInt", ScriptMainWindowId, "UInt", NotificationMsg, "Int", FD_READ|FD_CLOSE) { MsgBox % "WSAAsyncSelect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") ExitApp } return SendviaNet: Gui, Submit, NoHide lasttype5=%lasttype4% lasttype4=%lasttype3% lasttype3=%lasttype2% lasttype2=%lasttype% lasttype=%sendtext% stringgetpos, count2, sendtext, /, L if count2=0 { if sendtext=/features { if con=1 { tooltip, That command is only available when not connected!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } if con=0 { guicontrol,,sendtext, Guicontrol,,Chat, ( Chat Client Features List: Winsock chat communication Connected and Disconnected messages User List Kick users (server only) IP grabber (server only) Command mode - Ping - IP2Location - VisitWeb Configure Connection Menu Hit 'Enter' = Quick Send Hit 'UP' = Show Last Sent (Up to 5) Hit 'DOWN' = Scroll Down on Last Sent (Clear if on last sent) ) return } } if Sendtext=/cmd { if con=1 { tooltip, Command mode only available when not connected!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } if con=0 guicontrol,,sendtext, guicontrol,,chat, Command Mode Enabled!`n`n Available commands are as follows`nPing - /cmd ping (ip/hostname)`nIP2Location - /cmd i2l (ip)`nVisitWeb - /cmd vw (url)`n`nCommand Usage:`nPing Command- Type in the syntax and fill in the "(ip/hostname)" with an IP or hostname.`nIP2Location Command- Type in the syntax and fill in the "(ip)" with an IP you want located. The script will require Internet access to check with the Whois website.`nYou can also leave the "(ip)" blank, and it will display your current location.`nVisitWeb Command- Write out the syntax and fill in the (url) for a URL you wish to go to. return } ifinstring, sendtext, /cmd ping { if con=1 { tooltip, Command mode only available when not connected!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } if con=0 { ping=%sendtext% guicontrol,,sendtext, guicontrol,,chat, Starting ping now`nPlease wait for results... stringreplace, ping2, ping, /cmd, stringreplace, ping3, ping2, ping, stringreplace, ping4, ping3, %A_space%, filedelete, %A_appdata%\Winsock-chat\pinger.bat filedelete, %A_appdata%\Winsock-chat\Pinglog.txt detecthiddenwindows, on loop, { Process, close, cmd.exe Process, exist, cmd.exe if errorlevel=0 break } fileappend, ( cd\ ping -n 3 %ping4% >> "%A_appdata%\Winsock-chat\Pinglog.txt" ), %A_appdata%\Winsock-chat\pinger.bat run, pinger.bat, %A_appdata%\Winsock-chat\, hide useerrorlevel, if errorlevel=ERROR { guicontrol,,chat, Could not run ping execution file! return } loop, { Process, exist, cmd.exe, if errorlevel=0 break } detecthiddenwindows, off fileread, outping, %A_appdata%\Winsock-chat\Pinglog.txt guicontrol,, chat, %outping% ControlSend Edit1, ^{End}, WinSock Chat Client filedelete, %A_appdata%\Winsock-chat\pinger.bat filedelete, %A_appdata%\Winsock-chat\Pinglog.txt return } } ifinstring, sendtext, /cmd i2l { if con=1 { tooltip, Command mode only available when not connected!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } if con=0 { i2l=%sendtext% guicontrol,,sendtext, guicontrol,,chat,Starting IP2Location Function`nPlease wait for results... stringreplace, i2l2, i2l, /cmd, stringreplace, i2l3, i2l2, i2l, stringreplace, i2l4, i2l3, %A_space%, ;stringtrimleft, i2l4, i2l4, 1 filedelete, %a_appdata%\Winsock-Chat\1.txt stringreplace, ip2, i2l4, -, ., All ip=%ip2% urldownloadtofile, http://www.dnsstuff.com/tools/whois.ch?ip=%ip%, %a_appdata%\Winsock-Chat\1.txt fileread, 1, %a_appdata%\Winsock-Chat\1.txt StringGetPos, 2, 1, Location: stringmid, 3, 1, %2%, stringreplace, 4, 3, ], `n, All filedelete, %a_appdata%\Winsock-Chat\2.txt fileappend, %4%, %a_appdata%\Winsock-Chat\2.txt filereadline, 5, %a_appdata%\Winsock-Chat\2.txt, 2 bl= stringreplace, 6, 5, Location:, %bl%, All filedelete, %a_appdata%\Winsock-Chat\2.txt filedelete, %a_appdata%\Winsock-Chat\1.txt if 6=<html xmlns="http://www.w3.org/1999/xhtml"> { guicontrol,,chat, Could not locate IP! return } if ip= { ip=%A_Ipaddress1% } fileappend, %ip% found at%6%]`n, %a_appdata%\Winsock-Chat\i2l.txt fileread, i2lout, %a_appdata%\Winsock-Chat\i2l.txt guicontrol,,chat, %i2lout% return } } ifinstring, sendtext, /cmd vw { if con=1 { tooltip, Command mode only available when not connected!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } if con=0 { vw=%sendtext% guicontrol,,sendtext, guicontrol,,chat,Visiting address now... stringreplace, vw2, vw, /cmd, stringreplace, vw3, vw2, vw, stringreplace, vw4, vw3, %A_space%, stringtrimleft, vw4, vw4, 1 run, %vw4%,, useerrorlevel if ERRORlevel=ERROR { Guicontrol,,chat,Error when visiting address (%vw4%)`nThis is sometimes caused with having Firefox as your default browser`nIf this is the case, ignore this error, and firefox will open normally. return } Guicontrol,,chat,Address Visited! return } } } sendtext2=%sendtext% stringmid, sendtext2, sendtext2, 0, 4 if sendtext2=/msg { guicontrol,,SendText, stringtrimleft, cmd2, sendtext, 5 stringreplace, cmd2, cmd2, %A_space%,`n filedelete, %a_appdata%\Winsock-Chat\tempcheckc.txt fileappend, %cmd2%, %a_appdata%\Winsock-Chat\tempcheckc.txt filereadline, nameinc, %a_appdata%\Winsock-Chat\tempcheckc.txt, 1 if nameinc=%Clientname% { tooltip, You cannot send a message to yourself!, 220, 180 Settimer, removetooltip, 4000 filedelete, %a_appdata%\Winsock-Chat\tempcheckc.txt return } filereadline, msginc, %a_appdata%\Winsock-Chat\tempcheckc.txt, 2 ifinstring, msginc, * { tooltip, Please do not use asteriks in your message!, 220, 180 filedelete, %a_appdata%\Winsock-Chat\tempcheckc.txt return } msginc2=509SENDPM*%Clientname%*%nameinc%*%msginc% filedelete, %a_appdata%\Winsock-Chat\tempcheckc.txt loop, read, %a_appdata%\Winsock-Chat\userlistc.txt { currentline := A_Loopreadline if nameinc=%currentline% { SendData(socket,msginc2) fileappend, [Private] (To: %nameinc%) %msginc% `n, %a_appdata%\Winsock-Chat\client.txt fileread, chat1, %a_appdata%\Winsock-Chat\client.txt guicontrol,,chat, %chat1% ControlSend Edit1, ^{End}, WinSock Chat Client return } if nameinc=$ { SendData(socket,msginc2) fileappend, [Private] (To: $ChatServer) %msginc% `n, %a_appdata%\Winsock-Chat\client.txt fileread, chat1, %a_appdata%\Winsock-Chat\client.txt guicontrol,,chat, %chat1% ControlSend Edit1, ^{End}, WinSock Chat Client return } } return } if Sendtext= { return } if Sendtext=%A_Space% { tooltip, You cannot send blank lines!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } if Sendtext=%A_Space%%A_Space% { tooltip, You cannot send blank lines!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } ifinstring, Sendtext, %A_Space%%A_Space%%A_Space% { tooltip, Too many consecutive spaces!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } ifinstring, SendText, RX2CLIENTCON: { tooltip, You cannot send that text!, 220, 180 guicontrol,,sendtext, Settimer, removetooltip, 4000 return } SendText =%ClientName%: %SendText% guicontrol,,SendText, send1: SendData(socket,SendText) SendText = return RemoveToolTip: SetTimer, RemoveToolTip, Off ToolTip return ConnectToAddress(IPAddress, Port) { VarSetCapacity(wsaData, 32) result := DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData) if ErrorLevel { MsgBox WSAStartup() could not be called due to error %ErrorLevel%. Winsock 2.0 or higher is required. return -1 } if result { MsgBox % "WSAStartup() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") return -1 } AF_INET = 2 SOCK_STREAM = 1 IPPROTO_TCP = 6 socket := DllCall("Ws2_32\socket", "Int", AF_INET, "Int", SOCK_STREAM, "Int", IPPROTO_TCP) if socket = -1 { MsgBox % "socket() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") return -1 } SizeOfSocketAddress = 16 VarSetCapacity(SocketAddress, SizeOfSocketAddress) InsertInteger(2, SocketAddress, 0, AF_INET) InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2) InsertInteger(DllCall("Ws2_32\inet_addr", "Str", IPAddress), SocketAddress, 4, 4) if DllCall("Ws2_32\connect", "UInt", socket, "UInt", &SocketAddress, "Int", SizeOfSocketAddress) { MsgBox % "connect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") . "?" return -1 } return socket } ReceiveData(wParam, lParam) { Critical global ShowRecieved socket := wParam ReceivedDataSize = 4096 Loop { VarSetCapacity(ReceivedData, ReceivedDataSize, 0) ReceivedDataLength := DllCall("Ws2_32\recv", "UInt", socket, "Str", ReceivedData, "Int", ReceivedDataSize, "Int", 0) if ReceivedDataLength = 0 ExitApp if ReceivedDataLength = -1 { WinsockError := DllCall("Ws2_32\WSAGetLastError") if WinsockError = 10035 return 1 if WinsockError <> 10054 MsgBox % "recv() indicated Winsock error " . WinsockError ExitApp } Loop, parse, ReceivedData, `n, `r { gui, submit, nohide ShowRecieved = %ShowRecieved%%A_LoopField% settimer, check, 2500 ifnotinstring, Showrecieved, connected { ifnotinstring, Showrecieved, : { gosub, adddellist } if ShowRecieved= RX2CLIENTCON: { gosub, connectpend gosub, turnon sleep, 250 con=1 return } } fileappend, %ShowRecieved%`n, %a_appdata%\Winsock-Chat\client.txt fileread, chat1, %a_appdata%\Winsock-Chat\client.txt guicontrol,,chat, %chat1% ShowRecieved = ControlSend Edit1, ^{End}, WinSock Chat Client ifwinnotactive, WinSock Chat Client { Soundplay, %a_windir%\Media\chimes.wav } } } return 1 } SendData(wParam,SendData) { socket := wParam SendDataSize := VarSetCapacity(SendData) SendDataSize += 1 sendret := DllCall("Ws2_32\send", "UInt", socket, "Str", SendData, "Int", SendDatasize, "Int", 0) ;send( sockConnected,> welcome, strlen(welcome) + 1, NULL); } turnon: on=1 return adddellist: ShowRecieved2=%ShowRecieved% ifinstring, Showrecieved2, RX2KICKPLAYER { stringreplace, Showrecieved2, Showrecieved2, RX2KICKPLAYER,-,All if Showrecieved2=-%clientname% { gosub, kickexit } Showrecieved= exit } ifinstring, ShowRecieved2, connected! { showrecieved2= return } ifinstring, Showrecieved2, SR1CLIENTADDLIST { filedelete, %a_appdata%\Winsock-Chat\userlistc.txt stringreplace, ShowRecieved2, ShowRecieved2, SR1CLIENTADDLIST,,ALL stringreplace, ShowRecieved2, ShowRecieved2, *,`n, All fileappend, %ShowRecieved2%, %a_appdata%\Winsock-Chat\userlistc.txt fileread, userlist, %a_appdata%\Winsock-Chat\userlistc.txt ;stringreplace, userlist2, userlist, *, `n, ALL guicontrol,,userlistin, %userlist% userlist2=%userlist% ;stringreplace, userlist2, userlist2, %clientname%, %A_Space% filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt fileappend, %userlist2%, %a_appdata%\Winsock-Chat\usernamestemp.txt if checkornot=0 { firsthit=0 Loop, read, %a_appdata%\Winsock-Chat\usernamestemp.txt { last_line := A_LoopReadLine if last_line=%clientname% { if firsthit=0 { firsthit=1 continue } guicontrol,,userlistin, sleep, 500 nam=1 filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt exitapp } } checkornot=1 } filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt ShowRecieved= ShowRecieved2= exit } ShowRecieved2= return connectpend: ShowRecieved= if con=0 { SendText=%Clientname% connected! gosub, Send1 con=1 return } else return InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4) { Loop %pSize% DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF) } ExitSub: if nam=1 { sleep, 500 } open= %Clientname% disconnected! SendData(socket,open) sleep, 250 gui, destroy sleep, 250 DllCall("Ws2_32\WSACleanup") ;sleep, 2000 filedelete,%a_appdata%\Winsock-Chat\userlistc.txt filedelete, %a_appdata%\Winsock-Chat\client.txt filedelete, %a_appdata%\Winsock-Chat\i2l.txt filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt if nam=1 { Msgbox, 16, WinSock Chat Client, Client name already in use! exitapp } ExitApp discon: chat= open= %Clientname% disconnected! SendData(socket,open) sleep, 250 ;gui, destroy sleep, 250 DllCall("Ws2_32\WSACleanup") filedelete, %a_appdata%\Winsock-Chat\i2l.txt filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt on=0 checkornot=0 con=0 end=0 las=1 guicontrol,,userlistin, ifexist, %A_appdata%\Winsock-chat\clientinfo.ini { iniread, Network_address, %A_appdata%\Winsock-chat\clientinfo.ini, Info, ip iniread, Network_port, %A_appdata%\Winsock-chat\clientinfo.ini, Info, port } menu, tray, tip, Currently Set to`nIP: %Network_Address%`nPort: %Network_Port% guicontrol, disable, edit guicontrol,show, connect guicontrol, show, clientname guicontrol, move, sendbutton, x146 y185 w80 h20 guicontrol,disable,connect settimer, disableenable, 2000 configurex=1 filedelete,%a_appdata%\Winsock-Chat\userlistc.txt filedelete, %a_appdata%\Winsock-Chat\client.txt filedelete, %a_appdata%\Winsock-Chat\i2l.txt filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt return disableenable: settimer, disableenable, off guicontrol,enable, connect return Kickexit: gui, destroy open= %Clientname% was kicked! SendData(socket,open) sleep, 500 DllCall("Ws2_32\WSACleanup") Msgbox, 16, WinSock Chat Client, You were kicked from the Server! exitapp Guiclose: filedelete,%a_appdata%\Winsock-Chat\userlistc.txt filedelete, %a_appdata%\Winsock-Chat\client.txt filedelete, %a_appdata%\Winsock-Chat\i2l.txt filedelete, %a_appdata%\Winsock-Chat\usernamestemp.txt gosub, exitsub exit: if con=0 { exitapp } if con=1 { goto, exitsub }
Server:
#singleinstance force ;#notrayicon ifnotexist, %a_appdata%\Winsock-Chat { Filecreatedir, %a_appdata%\Winsock-Chat } Network_Address = 0.0.0.0 Network_Port = 1000 menu, tray, tip, Listening on`nIP: %A_Ipaddress1%`nPort: %Network_Port% menu, tray, icon, %a_windir%\explorer.exe menu, tray, nostandard menu, tray, add, Restart menu, tray, add, Show menu, tray, add, Exit colordef=C0C0C0 gui, color, %colordef% Gui, Add, Edit, x6 y5 w360 h190 readonly vchat, Gui, Add, Edit, x376 y5 w110 h150 readonly vchatlist, Gui, Add, Edit, x6 y204 w210 h20 vSendText, Gui, Add, Button, x226 y204 w70 h20 gSendviaNet, Send Gui, Add, edit, x306 y204 w70 h20 vkicknick, Gui, Add, Button, x386 y204 w80 h20 vkick gkick_player, Kick Gui, Add, Button, x376 y165 w110 h30 , Hide ;guicontrol,disable, kicknick ;guicontrol,disable, kick Gui, Show, x135 y95 h233 w501, WinSock Chat Server WinGet Gui_ID, ID, WinSock Chat Server Gosub Connection_Init return buttonhide: winhide, WinSock Chat Server return Show: winshow, WinSock Chat Server controlsend edit1, ^{end}, WinSock Chat Server return $numpadenter:: ifwinactive, WinSock Chat Server { goto, SendviaNet } else send, {NUMPADENTER} return $Enter:: ifwinactive, WinSock Chat Server { gosub, SendviaNet } else send, {ENTER} return Connection_Init: OnExit, ExitSub socket := PrepareForIncomingConnection(Network_Address, Network_Port) if socket = -1 ExitApp Process, Exist DetectHiddenWindows On ScriptMainWindowId := WinExist("ahk_class AutoHotkey ahk_pid " . ErrorLevel) DetectHiddenWindows Off NotificationMsg = 0x5555 OnMessage(NotificationMsg, "ReceiveData") FD_READ = 1 FD_CLOSE = 32 FD_CONNECT = 20 if DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket, "UInt", ScriptMainWindowId, "UInt", NotificationMsg, "Int", FD_READ|FD_CONNECT) { MsgBox % "WSAAsyncSelect() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") ExitApp } i=1 Loop { VarSetCapacity(SocketAddress, SizeOfSocketAddress:=16) conectioncheck%i% := DllCall("Ws2_32\accept", "UInt", socket, "UInt", &SocketAddress, "Int*", SizeOfSocketAddress) if conectioncheck%i% != -1 { i++ peername := DllCall("Ws2_32\inet_ntoa", "uint", NumGet(SocketAddress,4), "str") . ":" NumGet(SocketAddress,2,"ushort") fileappend, %peername% connecting...`n, %a_appdata%\Winsock-Chat\server.txt fileread, chat2, %a_appdata%\Winsock-Chat\server.txt guicontrol,,chat, %chat2% controlsend edit1, ^{end}, WinSock Chat Server Sendtext= RX2CLIENTCON: gosub, Send1 Sendtext= } sleep 500 } return SendviaNet: Gui, Submit, NoHide stringmid, cmd2, sendtext, 0, 4 if cmd2=/msg { guicontrol,,SendText, stringtrimleft, cmd2, sendtext, 5 stringreplace, cmd2, cmd2, %A_space%,`n filedelete, %a_appdata%\Winsock-Chat\tempcheck.txt fileappend, %cmd2%, %a_appdata%\Winsock-Chat\tempcheck.txt filereadline, nameinc, %a_appdata%\Winsock-Chat\tempcheck.txt, 1 filereadline, msginc, %a_appdata%\Winsock-Chat\tempcheck.txt, 2 msginc2= [Private] (From: $ChatServer) %msginc% filedelete, %a_appdata%\Winsock-Chat\tempcheck.txt loop, read, %a_appdata%\Winsock-Chat\userlistpm.txt { currentline := A_Loopreadline if nameinc=%currentline% { SendData(conectioncheck%A_Index%,msginc2) fileappend, [Private] (To: %nameinc%) %msginc% `n, %a_appdata%\Winsock-Chat\server.txt fileread, chat2, %a_appdata%\Winsock-Chat\server.txt guicontrol,,chat, %chat2% controlsend edit1, ^{end}, WinSock Chat Server return } } return } SendText =$ChatServer: %SendText% guicontrol,,SendText, go: fileappend, %SendText%`n, %a_appdata%\Winsock-Chat\server.txt fileread, chat2, %a_appdata%\Winsock-Chat\server.txt guicontrol,,chat, %chat2% controlsend edit1, ^{end}, WinSock Chat Server gosub, send1 resend: SendText= %ShowRecieved% ShowRecieved= send1: Loop %i% { SendData(conectioncheck%A_Index%,SendText) } SendText = return PrepareForIncomingConnection(IPAddress, Port) { VarSetCapacity(wsaData, 32) result := DllCall("Ws2_32\WSAStartup", "UShort", 0x0002, "UInt", &wsaData) ; Request Winsock 2.0 (0x0002) if ErrorLevel { MsgBox WSAStartup() could not be called due to error %ErrorLevel%. Winsock 2.0 or higher is required. return -1 } if result { MsgBox % "WSAStartup() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") return -1 } AF_INET = 2 SOCK_STREAM = 1 IPPROTO_TCP = 6 socket := DllCall("Ws2_32\socket", "Int", AF_INET, "Int", SOCK_STREAM, "Int", IPPROTO_TCP) if socket = -1 { MsgBox % "socket() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") return -1 } SizeOfSocketAddress = 16 VarSetCapacity(SocketAddress, SizeOfSocketAddress) InsertInteger(2, SocketAddress, 0, AF_INET) ; sin_family InsertInteger(DllCall("Ws2_32\htons", "UShort", Port), SocketAddress, 2, 2) ; sin_port InsertInteger(DllCall("Ws2_32\inet_addr", "Str", IPAddress), SocketAddress, 4, 4) ; sin_addr.s_addr if DllCall("Ws2_32\bind", "UInt", socket, "UInt", &SocketAddress, "Int", SizeOfSocketAddress) { MsgBox % "bind() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") . "?" return -1 } if DllCall("Ws2_32\listen", "UInt", socket, "UInt", "SOMAXCONN") { MsgBox % "LISTEN() indicated Winsock error " . DllCall("Ws2_32\WSAGetLastError") . "?" return -1 } return socket } ReceiveData(wParam, lParam) { Critical global ShowRecieved socket := wParam ReceivedDataSize = 4096 Loop { VarSetCapacity(ReceivedData, ReceivedDataSize, 0) ReceivedDataLength := DllCall("Ws2_32\recv", "UInt", socket, "Str", ReceivedData, "Int", ReceivedDataSize, "Int", 0) if ReceivedDataLength = -1 { WinsockError := DllCall("Ws2_32\WSAGetLastError") if WinsockError = 10035 return 1 if WinsockError <> 10054 MsgBox % "recv() indicated Winsock error " . WinsockError ExitApp } Loop, parse, ReceivedData, `n, `r { ShowRecieved = %ShowRecieved%%A_LoopField% ifinstring, Showrecieved, 509SENDPM* { ShowRecieved2=%ShowRecieved% stringtrimleft, ShowRecieved2, ShowRecieved2, 10 stringreplace, ShowRecieved2, ShowRecieved2,*,`n stringreplace, ShowRecieved2, ShowRecieved2,*,`n filedelete, %a_appdata%\Winsock-Chat\privmsgtemp.txt fileappend, %ShowRecieved2%, %a_appdata%\Winsock-Chat\privmsgtemp.txt filereadline, from2, %a_appdata%\Winsock-Chat\privmsgtemp.txt, 1 filereadline, to2, %a_appdata%\Winsock-Chat\privmsgtemp.txt, 2 filereadline, msg2, %a_appdata%\Winsock-Chat\privmsgtemp.txt, 3 filedelete, %a_appdata%\Winsock-Chat\privmsgtemp.txt if to2=$ { fileappend, [Private] (From: %from2%) %msg2%`n, %a_appdata%\Winsock-Chat\server.txt fileread, chat2, %a_appdata%\Winsock-Chat\server.txt guicontrol,,chat, %chat2% controlsend edit1, ^{end}, WinSock Chat Server gooutmsg2= to2= from2= msg2= ShowRecieved = return 1 } gooutmsg2=[Private] (From: %from2%) %msg2% loop, read, %a_appdata%\Winsock-Chat\userlistpm.txt { currentline := A_Loopreadline if to2=%currentline% { SendData(conectioncheck%A_Index%,gooutmsg2) fileappend, [Private] (To: %to2%) (From: %from2%) %msg2%`n, %a_appdata%\Winsock-Chat\server.txt fileread, chat2, %a_appdata%\Winsock-Chat\server.txt guicontrol,,chat, %chat2% controlsend edit1, ^{end}, WinSock Chat Server gooutmsg2= to2= from2= msg2= ShowRecieved = return 1 } } return 1 } ifnotinstring, Showrecieved, : { gosub, redirects } fileappend, %ShowRecieved%`n, %a_appdata%\Winsock-Chat\server.txt fileread, chat2, %a_appdata%\Winsock-Chat\server.txt guicontrol,,chat, %chat2% controlsend edit1, ^{end}, WinSock Chat Server gosub, resend ;ShowRecieved = } } return 1 } SendData(wParam,SendData) { socket := wParam ;fileappend, %socket%`n, %A_Desktop%\socketlst.txt SendDataSize := VarSetCapacity(SendData) SendDataSize += 1 sendret := DllCall("Ws2_32\send", "UInt", socket, "Str", SendData, "Int", SendDatasize, "Int", 0) ;send( sockConnected,> welcome, strlen(welcome) + 1, NULL); } redirects: ifinstring, Showrecieved, kicked! { return } ShowRecieved2=%ShowRecieved% Stringreplace, Showrecieved2, Showrecieved2, %A_Space%, `n, filedelete, %a_appdata%\Winsock-Chat\usertemp.txt fileappend, %ShowRecieved2%, %a_appdata%\Winsock-Chat\usertemp.txt filereadline, name1, %a_appdata%\Winsock-Chat\usertemp.txt,1 filereadline, cord, %a_appdata%\Winsock-Chat\usertemp.txt,2 filedelete, %a_appdata%\Winsock-Chat\usertemp.txt if cord=connected! { fileappend, %name1%`n, %a_appdata%\Winsock-Chat\userlist.txt fileappend, %name1%`n, %a_appdata%\Winsock-Chat\userlistpm.txt fileread, userlist, %a_appdata%\Winsock-Chat\userlist.txt guicontrol,,chatlist, %userlist% stringreplace,userlist,userlist,`n,*,All sleep, 500 Sendtext=SR1CLIENTADDLIST%userlist% gosub, send1 name1= cord= return } if cord=disconnected! { fileread, dellist, %a_appdata%\Winsock-Chat\userlist.txt fileread, dellist5, %a_appdata%\Winsock-Chat\userlistpm.txt stringreplace, dellist6, dellist5, %name1%, %A_Space% stringreplace, dellist2, dellist, %name1%`r`n filedelete, %a_appdata%\Winsock-Chat\userlist.txt filedelete, %a_appdata%\Winsock-Chat\userlistpm.txt fileappend, %dellist2%, %a_appdata%\Winsock-Chat\userlist.txt fileappend, %dellist6%, %a_appdata%\Winsock-Chat\userlistpm.txt fileread, userlist, %a_appdata%\Winsock-Chat\userlist.txt guicontrol,,chatlist, %userlist% stringreplace,userlist,userlist,`n,*,All Sendtext=SR1CLIENTADDLIST%userlist% gosub, send1 name1= cord= return } InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4) { Loop %pSize% DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF) } kick_player: gui, submit, nohide guicontrol,,kicknick, ref= Sendtext=RX2KICKPLAYER%kicknick% gosub, send1 sleep, 500 fileread, dellist, %a_appdata%\Winsock-Chat\userlist.txt fileread, dellist5, %a_appdata%\Winsock-Chat\userlistpm.txt stringreplace, dellist6, dellist5, %name1%, %A_Space% stringreplace, dellist2, dellist, %kicknick%`r`n filedelete, %a_appdata%\Winsock-Chat\userlist.txt filedelete, %a_appdata%\Winsock-Chat\userlistpm.txt fileappend, %dellist2%, %a_appdata%\Winsock-Chat\userlist.txt fileappend, %dellist6%, %a_appdata%\Winsock-Chat\userlistpm.txt fileread, userlist, %a_appdata%\Winsock-Chat\userlist.txt guicontrol,,chatlist, %userlist% stringreplace,userlist,userlist,`n,*,All Sendtext=SR1CLIENTADDLIST%userlist% gosub, send1 sendtext= name1= kicknick= cord= return restart: filedelete, %a_appdata%\Winsock-Chat\userlistpm.txt filedelete, %a_appdata%\Winsock-Chat\server.txt filedelete,%a_appdata%\Winsock-Chat\userlist.txt DllCall("Ws2_32\WSACleanup") reload Exit: exitapp ExitSub: gui, submit, nohide if chatlist= { goto, end } Msgbox, 48, WinSock Chat Server, Server will shut down 5 second(s) after you hit ok! gui, destroy Sendtext= Server is Shutting down in 5 Second(s) gosub, send1 sleep, 5000 end: filedelete, %a_appdata%\Winsock-Chat\userlistpm.txt filedelete, %a_appdata%\Winsock-Chat\server.txt filedelete,%a_appdata%\Winsock-Chat\userlist.txt DllCall("Ws2_32\WSACleanup") ExitApp guiclose: filedelete, %a_appdata%\Winsock-Chat\userlistpm.txt filedelete,%a_appdata%\Winsock-Chat\userlist.txt filedelete, %a_appdata%\Winsock-Chat\server.txt exitapp
thanks AHK community for the help
----------------------------------------------------------------------------------------------------------------
WankaUSR's Script
Features:
Server logo ( a logo is sent to the client when connecting )
User authentication ( added a basic user authentication system)
Private Messaging (wankaUSR's pm function)
encrypt sent data
Server and Client Script can be found here
Sorry WankaUSR I cannot post script here because it exceeds post limit and won't let me post them both.