Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Network Communication Script Without TCP/IP (Shared Drive)


  • Please log in to reply
3 replies to this topic
ehagood
  • Members
  • 51 posts
  • Last active: Nov 02 2010 03:38 PM
  • Joined: 30 Jan 2006
Hey all,
At my office, we needed a way to communicate, but have the option of the message waiting until the user has logged on. I wrote this script which uses a shared network drive. Simply pop it in and run it. The script will take care of registering your computer in a Users.ini file, prompting you to provide your name, and allowing you to run it on automatically on login.

When it opens it loads all entries (except yours) into a dropdown list. Upon triggering WIN+S, the send dialog opens. You can pick a person or Broadcast to send to everyone. The message then pops up on their end, triggered by a text file on the shared drive (that way, the message will be there either immediately or when the person logs in). The user then can reply or dismiss. If the message is dismissed, a traytip pops up to alert you that your message was read. You have the option of choosing the notification sound on receiving a message. Finally a log is created of all conversations.

Anyway, I will probably add a 'snooze' function to the recipient GUI to allow them to use the message as a reminder, in the near future. I hope someone will find this useful.

/*
**************************************************
****          Network Messenger               ****
****          VERSION 1.1                     ****
****          Author: E. Hagood               ****
****          7/9/08                          ****
**************************************************

ABOUT: This program is designed to act as an Instant
Messenger, using only a shared network folder instead of
a direct TCP/IP connection. When the program begins, it loads
all the users of the network into GUI:1's Dropdown box, as provided
in the NetworkMessengerUsers.ini file. 

The method of communication is by text file inside the shared
network drive. This way, even if a person is not at a 
particular computer, the message will be waiting until they are.
It then provides a way of replying to the message, or if OK is clicked
then it returns a receipt, which is displayed as a Traytip.

The user has the option of defining what sound is played, if any, when a message
is received. This sound will play intermittently until the user replies or clicks
OK.
*/

#Persistent
#SingleInstance Force

;Create Menu
Menu, SettingsMenu, Add, &Change Sound Alert, ChangeSound
Menu, MyMenuBar, Add, &Settings, :SettingsMenu

;Create Send Gui
Gui, Add, Text, vUserText x25 y15 w500 h20 ,
Gui, Add, DropDownList, vSendTo x136 y40 w220 h200,
Gui, Add, Text, x16 y40 w100 h20 , Recipient
Gui, Add, Edit, vSendMessage x16 y70 w350 h150 ,
Gui, Add, Button, gOK x126 y230 w110 h30 , OK
Gui, Add, Button, gCancel x256 y230 w100 h30 , Cancel
Gui, Add, Checkbox, vBroadcast gSetBroadcast x206 y20 w120 h20, Broadcast Message
Gui, Menu, MyMenuBar 

;Create Receive Gui
Gui, 2:Add, Text, vUserText x25 y15 w500 h20 ,
Gui, 2:Add, Text, x16 y40 w100 h20 , From
Gui, 2:Add, Edit, vSentMessage READONLY x16 y70 w350 h150 ,
Gui, 2:Add, Button, gReply x126 y230 w110 h30 , Reply
Gui, 2:Add, Button, gNoReply x256 y230 w100 h30 , OK
Gui, 2:Add, Text,  vFrom x126 y40 w240 h20 ,
Gui, 2:Menu, MyMenuBar

;Set My IP Address\Computer user
MyAddress = %A_IPADDRESS1%
MyLoginName = %A_Username%

;If Prefs INI file doesn't exist, create one... prompt for startup.
ifnotexist,%A_MyDocuments%\NetworkMessenger\NetworkMessengerPrefs.ini
{
  msgbox, This seems to be your first time running this program.`nI will now set myself up for you.
  Filecreatedir,%A_MyDocuments%\NetworkMessenger\
  FileAppend,, %A_MyDocuments%\NetworkMessenger\NetworkMessengerPrefs.ini
  msgbox, 4,,Would you like a sound to play, when you receive a message?
  ifmsgbox YES
  {
    if MyLoginName <> RoomUser
    {
      FileSelectFile,MediaFile,3,C:\WINDOWS\Media,Press Cancel For A System Beep.,Audio (*.wav; *.mp3)
      if MediaFile =
      {
        MediaFile = Beep
        SoundBeep, 1500, 500
        sleep, 500
        SoundBeep, 1500, 500
      }
      else
      {
        SoundPlay, %MediaFile%
        sleep, 1000 
      }
    }
    else
    {
      msgbox, 4,,Would you like the default sound (Select No For A System Beep)?
      ifmsgbox YES
      {
        MediaFile = %A_ScriptDir%\Sounds\NOTIFY.WAV
        soundplay,MediaFile
        Sleep, 1000
      }
      else
      {
        MediaFile = Beep
        SoundBeep, 1500, 500
        sleep, 500
        SoundBeep, 1500, 500
      }
    }
  }
  else
    MediaFile = OFF
  msgbox, 4,,Would you like for FPG Network Messenger to startup automatically when you login?
  ifmsgbox YES
    FileCreateShortcut, %A_ScriptDir%\NetworkMessenger.exe, %A_Startup%\NetworkMessenger.lnk
  IniWrite, %MediaFile%, %A_MyDocuments%\NetworkMessenger\NetworkMessengerPrefs.ini, Settings, Sound
}

;Get current settings
IniRead, MediaFile, %A_MyDocuments%\NetworkMessenger\NetworkMessengerPrefs.ini, Settings, Sound, Beep

;Load Users From INI File
boolReadingUsers = False
intUserCount = 0
Loop, Read, %A_ScriptDir%\NetworkMessengerUsers.ini
{
  if boolReadingUsers = True
  {
    StringLeft, LeftLineChar, A_LoopReadLine, 1
    if LeftLineChar = [
      break
    intUserCount += 1
    UserArray%intUserCount% = %A_LoopReadLine%
  }
  if A_LoopReadLine = [Users]
  {
    boolReadingUsers = True
  }
}

;Load Users Into Combobox
MyName = Not Found
Loop, %intUserCount%
{
  StringSplit, Temp, UserArray%A_Index%, =
  if Temp2 <> %MyAddress%
    GuiControl,, SendTo, %Temp1%
  else
    MyName = %Temp1%
}
if MyName = Not Found
{
  InputBox, MyName, FPG Network Messenger, This machine has not been registered yet.`nWhat would you like this machine to be called?,,,,,,,, guest
  IniWrite, %MyAddress%, %A_ScriptDir%\NetworkMessengerUsers.ini, Users, %MyName% 
}

GuiControl,, Broadcast, 0
GuiControl,, SendTo, Broadcast

GuiControl, Choose, SendTo, |1
GuiControl,,Usertext,User: %MyName% @ %MyAddress%
GuiControl,2:,Usertext,User: %MyName% @ %MyAddress%

;Display splash to allow user to see their info
SplashTextOn, 250, 150, FPG Network Messenger, Initializing...`nPress Win + S To Send A Message`nTo Anyone In The Network.`n`nUser Name: %MyLoginName%`nIP Address: %MyAddress%`nSender Name: %MyName%
Sleep, 2000
SplashTextOff

;Now we will begin looking for a message file
boolShowingMessage = False
Loop
{
  intMessageCount = 0
  Loop, %A_ScriptDir%\%MyName%*.mgr
  {
    Sleep, 200
    intMessageCount += 1
    MessageList%A_Index% = %A_LoopFileFullPath%
    }
    if intMessageCount > 0
      boolMessageFound = True
    Loop
    {
      if intMessageCount < %A_Index%
        break
      CurrentFile := MessageList%A_Index%
      FileRead, MessageText, %CurrentFile%
      StringSplit, temp, CurrentFile, -
      StringSplit, tempName, temp2,.
      GuiControl,2:,From,%tempName1%
      GuiControl,2:,SentMessage,%MessageText%
      StringLeft, strMessageLeft, MessageText, 5
      if strMessageLeft = READ:
      {
        TrayTip, Network Messenger: NOTIFICATION, Your Message: %MessageText%`nHas Been Read By %tempName1%.
        Sleep, 12000
        Traytip
      }
      else
      {
        Gui, 2:Show, x131 y91 h276 w398, Sent Message From %tempName1%
        WinSet, AlwaysOnTop, On, Sent Message From %tempName1%
        boolShowingMessage = True
      }
      if MediaFile <> Off
      {
        if MediaFile = Beep
        {
          SoundBeep, 1500, 500
          sleep, 500
          SoundBeep, 1500, 500
        }
        else
        {
          SoundPlay, %MediaFile%
        }
      }
      Sleep, 500
      FileDelete, %CurrentFile%
      Sleep, 500
      Counter = 0
      Loop
      {
        if boolShowingMessage = False
        {
          break
        }
        else
        {
          Counter += 1
          if Counter > 25
          {
            Counter = 0
            if MediaFile <> Off
            {
              if MediaFile = Beep
              {
                SoundBeep, 1500, 500
                sleep, 500
                SoundBeep, 1500, 500
              }
              else
              {
                SoundPlay, %MediaFile%
              }
            }
          }        
        }
        Sleep, 500
      }
    }
  Sleep, 500
}

#S::
;Display Send Dialog
GuiControl,, Broadcast, 0
GuiControl,,SendMessage
Guicontrol, Focus,SendMessage
Gui, Show, x131 y91 h276 w398, FPG Network Messenger
WinSet, AlwaysOnTop, On, FPG Network Messenger
Return

OK:
;To send a message
GuiControlGet, SendTo
GuiControlGet, SendMessage
SendMessage = [%A_MM%/%A_DD%/%A_YYYY% %A_Hour%:%A_Min%:%A_Sec%] - %SendMessage%
if SendTo = Broadcast
{
  Loop,
  {
    if A_Index = %intUserCount%
      break
    GuiControl, Choose, SendTo, |%A_Index%
    GuiControlGet, SendTo
    SendFileName := FindFileName(SendTo, MyName)
    FileAppend, BROADCAST MESSAGE: %SendMessage%, %SendFileName%.mgr
    FileAppend, TO:%SendTo%-FROM:%MyName%->`n`tBROADCAST%SendMessage%`n, %A_ScriptDir%\message%A_MM%-%A_DD%-%A_YYYY%.log
  }
  
}
else
{
  SendFileName := FindFileName(SendTo, MyName)
  FileAppend, %SendMessage%, %SendFileName%.mgr
  FileAppend, TO:%SendTo%-FROM:%MyName%->`n`t%SendMessage%`n, %A_ScriptDir%\message%A_MM%-%A_DD%-%A_YYYY%.log
}
GuiControl,, SendMessage, 
GuiControl,, SendTo,
Gui, Hide
return

Cancel:
Gui, Hide
return

Reply:
;Reply to a sent message
GuiControlGet,From
GuiControlGet,SentMessage
Gui, 2:Hide
ifwinexist, Sent Message
  WinSet, AlwaysOnTop, Off, Sent Message
ifwinexist, FPG Network
  WinSet, AlwaysOnTop, Off, FPG Network
InputBox, MyReply, %MyName%'s Reply, Type your reply below.`n`nTo Previous Message:`n%SentMessage%,,,,,,
if ErrorLevel <> 1
{
  MyReply = [%A_MM%/%A_DD%/%A_YYYY% %A_Hour%:%A_Min%:%A_Sec%] - %MyReply%
  ;msgbox, %MyReply%`n`nPREVIOUS MESSAGE:`n%MessageText%`n%tempName1%-%MyName%.mgr
  SendFileName := FindFileName(From, MyName)
  FileAppend, %MyReply%`n`nPREVIOUS MESSAGE:`n%From%:%SentMessage%,%SendFileName%.mgr
  FileAppend, TO:%From%-FROM:%MyName%->`n`tREPLY: %MyReply%`n, %A_ScriptDir%\message%A_MM%-%A_DD%-%A_YYYY%.log
  boolShowingMessage = False
} 
else
{
  msgbox, No Reply Sent.
  Gui, 2:Show, x131 y91 h276 w398
}
ifwinexist, Sent Message
  WinSet, AlwaysOnTop, On, Sent Message
ifwinexist, FPG Network
  WinSet, AlwaysOnTop, On, FPG Network
Return

NoReply:
;If not replying, send a Read message
GuiControlGet,From
GuiControlGet,SentMessage
SendFileName := FindFileName(From, MyName)
FileAppend, READ:%SentMessage%,%SendFileName%.mgr
FileAppend, TO:%From%-FROM:%MyName%->`n`tDISMISSED: %SentMessage%`n, %A_ScriptDir%\message%A_MM%-%A_DD%-%A_YYYY%.log
boolShowingMessage = False
Gui, 2:Hide
Return

ChangeSound:
ifwinexist, Sent Message
  WinSet, AlwaysOnTop, Off, Sent Message
ifwinexist, FPG Network
  WinSet, AlwaysOnTop, Off, FPG Network
msgbox, 4,,Would you like a sound to play, when you receive a message?
  ifmsgbox YES
  {
    if MyLoginName <> RoomUser
    {
      FileSelectFile,MediaFile,3,C:\WINDOWS\Media,Press Cancel For A System Beep.,Audio (*.wav; *.mp3)
      if MediaFile =
      {
        MediaFile = Beep
        SoundBeep, 1500, 500
        sleep, 500
        SoundBeep, 1500, 500
      }
      else
      {
        SoundPlay, %MediaFile%
        sleep, 1000
      }
    }
    else
    {
      msgbox, 4,,Would you like the default sound (Select No For A System Beep)?
      ifmsgbox YES
      {  
        MediaFile = %A_ScriptDir%\Sounds\NOTIFY.WAV
        soundplay,MediaFile
        Sleep, 1000
      }
      else
      {
        MediaFile = Beep
        SoundBeep, 1500, 500
        sleep, 500
        SoundBeep, 1500, 500
      }
    }
  }
  else
    MediaFile = OFF
  IniWrite, %MediaFile%, %A_MyDocuments%\NetworkMessenger\NetworkMessengerPrefs.ini, Settings, Sound
ifwinexist, Sent Message
  WinSet, AlwaysOnTop, On, Sent Message
ifwinexist, FPG Network
  WinSet, AlwaysOnTop, On, FPG Network
SoundPlay, MediaFile
Return

SetBroadcast:
;if clicked, make DropDown reflect your choice.
GuiControlGet,Broadcast
if Broadcast = 1
  GuiControl, Choose, SendTo, |%intUserCount%
else
  GuiControl, Choose, SendTo, |1
Return

FindFileName(To,From)
{
  tempSendFileName = %A_ScriptDir%\%To%-%From%
  MessageNumber = 1
  ifexist %tempSendFileName%.mgr
  {
    Loop
      {
        ifnotexist, %tempSendFileName%-%MessageNumber%.mgr
          break
        else
        {
          MessageNumber += 1
        } 
      }
    tempSendFileName = %tempSendFileName%-%MessageNumber%
  }
  Return tempSendFileName
}

All suggestions and comments are welcome.

ehagood

jmanx
  • Members
  • 110 posts
  • Last active: Mar 20 2011 07:55 PM
  • Joined: 14 May 2008

The idea you have using the share drive is pretty handy for network communication because it requires no internet.

There's also another script like this that uses Ws2_32.dll in every windows OS to communicate over the web. This can also be used over a home network.

http://www.autohotke...pic.php?t=32455
 



  • Guests
  • Last active:
  • Joined: --

All suggestions and comments are welcome.

...ok you should not repeat a string in many places...a quick grep shows 20 separate lines with \ (backslash) in it...I'm using backslash to help me find any hard-coded paths...for example change stuff like this...

ifnotexist,%A_MyDocuments%\NetworkMessenger\NetworkMessengerPrefs.ini
  Filecreatedir,%A_MyDocuments%\NetworkMessenger\
...to...

;// *** Global Vars ***
NM_CFG_dir=%A_MyDocuments%\NetworkMessenger
NM_CFG_file=NetworkMessengerPrefs.ini
;// *** /Global Vars ***
...at the top, then put this where it goes...

IfNotExist, %NM_CFG_dir%\%NM_CFG_file%
	FileCreateDir, %NM_CFG_dir%\%NM_CFG_file%
...the point is to not repeat any string more than 2 times...but repeat a variable as many times as needed...

Another note...

C:\WINDOWS\Media
...should 1) be in a var, but also 2) be...

NM_Windows_Media_dir=%A_WinDir%\Media
...unless the "windows media dir" is available from a registry key somewhere...

ehagood
  • Members
  • 51 posts
  • Last active: Nov 02 2010 03:38 PM
  • Joined: 30 Jan 2006
Hi "Guest".

Putting a file/folder path in a global variable is an excellent idea because it allows another coder to easily change the location by changing the value of one variable prior to compile.

Considering that the file paths used are dynamic (using %A_ScriptDir%, ensuring that the only directory being used is the shared drive), I cannot think of reason why this would need to be changed. If the path has no need of being changed, it really doesn't make any difference one way or the other. In my opinion, why waste memory capacity by defining global variables for nothing?

I'm using backslash to help me find any hard-coded paths

For the record, NM_CFG_dir=%A_MyDocuments%\NetworkMessenger (as you suggested) is still considered a hard coded path, because it cannot be changed by the end user, when it is in executable form. To keep a path from being hard coded, you would use an ini file or write it to the registry.

BTW, I should have used %A_WinDir%, instead of C:\Windows\.

ehagood