#NoTrayIcon #Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Icon=mfico.ico #AutoIt3Wrapper_Outfile_x64=Magnet Forwarder.exe #AutoIt3Wrapper_UseUpx=y #AutoIt3Wrapper_UseX64=y #AutoIt3Wrapper_Res_Description=Magnet Forwarder #AutoIt3Wrapper_Res_Fileversion=2.0.0.13 #AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** #include #include #include #include #include #include #include Opt('MustDeclareVars', 1) Opt('TrayAutoPause', 0) Opt('TrayMenuMode', 1+2) Opt('TrayOnEventMode', 1) Opt('TCPTimeout', 100) Global $hGUIMain Global $sAppTitle = 'Magnet Forwarder' Global $CONFIG_DIR = @AppDataDir & '\' & $sAppTitle DirCreate($CONFIG_DIR) Global $LOG_FILE = $CONFIG_DIR & '\server.log' Global $CONFIG_FILE = $CONFIG_DIR & '\config.ini' If Not FileExists($CONFIG_FILE) And FileExists(@ScriptDir & '\config.ini') Then FileCopy(@ScriptDir & '\config.ini', $CONFIG_FILE) EndIf If Not IniWrite($CONFIG_FILE, 'Test', 'Test', 'Success') Then MsgBox(0x30, $sAppTitle, 'Unable to access settings file:' & $CONFIG_FILE) ; OK: 1 Exit EndIf IniDelete($CONFIG_FILE, 'Test') Global $sTempFile = @TempDir & '\tmp.torrent' Global $KEY_SUCCESS = 'UTF_SUCCESS', $KEY_FAIL = 'UTF_FAIL', $KEY_FILESEND = 'UTF_FILE', $KEY_CONTINUE = 'UTF_CONTINUE', $KEY_SINGLETON = 'UTF_Server' Global $sIcoPath = @TempDir & '\m.icl' FileInstall('m.icl', $sIcoPath, 1) ;~ TraySetState() ;~ Opt('TrayIconDebug', 1) Main() Func Main() If $CmdLine[0] Then If $CmdLine[1] = '/server' Then _Server() Else _Client($CmdLine[1]) EndIf Else Global $hGUIMain = GUICreate($sAppTitle, 390, 180) GUISetFont(10) GUICtrlCreateGroup('Server Options', 10, 5, 180, 125) Local $bt_ServerSetup = GUICtrlCreateButton('&Server Setup', 25, 30, 150, 25) Local $bt_ServerLink = GUICtrlCreateButton('Start on &Login', 25, 60, 150, 25) Local $bt_Server = GUICtrlCreateButton('Start Server &Now', 25, 90, 150, 25) GUICtrlCreateGroup('Client Options', 200, 5, 180, 125) Local $bt_ClientSetup = GUICtrlCreateButton('&Client Setup', 215, 30, 150, 25) Local $bt_Assoc = GUICtrlCreateButton('Associate &Magnet Links', 215, 60, 150, 25) Local $bt_AssocFile = GUICtrlCreateButton('Associate .torrent &Files', 215, 90, 150, 25) GUICtrlCreateGroup('', 10, 125, 370, 50) Local $bt_SettingsFile = GUICtrlCreateButton('&Edit Raw Settings File', 120, 140, 150, 25) GUISetState() While 1 Switch GUIGetMsg() Case $bt_ServerLink If MsgBox(0x21, $sAppTitle, 'This will create a shortcut to the server in your startup folder. Would you like to do that?', 0, $hGUIMain) = 1 Then FileCreateShortcut(@ScriptFullPath, @StartupDir & '\' & $sAppTitle & ' Server.lnk', @ScriptDir, '/server') EndIf Case $bt_ServerSetup _ServerSetup() Case $bt_ClientSetup _ClientSetup() Case $bt_Server If @Compiled Then Run(@AutoItExe & ' /server') Else Run(@AutoItExe & ' ' & FileGetShortName(@ScriptFullPath) & ' /server') EndIf Case $bt_Assoc _Associate() Case $bt_AssocFile _Associate(1) Case $bt_SettingsFile ShellExecute($CONFIG_FILE) Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd EndIf EndFunc Func _ClientSetup() GUISetState(@SW_DISABLE, $hGUIMain) Local $hGUISetup = GUICreate('Client Setup', 300, 130, Default, Default, Default, Default, $hGUIMain) GUICtrlCreateLabel('&IP address:', 5, 5, 100, 20, $SS_CENTERIMAGE) Local $in_IP = GUICtrlCreateInput(IniRead($CONFIG_FILE, 'CLIENT', 'IP', @IPAddress1), 105, 5, 90, 20) GUICtrlCreateLabel('&Port:', 5, 25, 100, 20, $SS_CENTERIMAGE) Local $in_Port = GUICtrlCreateInput(IniRead($CONFIG_FILE, 'CLIENT', 'PORT', 65535), 105, 25, 90, 20) Local $sTip = 'Optional; Can be left blank' & @LF & '%1 will be replaced with the torrent link' GUICtrlCreateLabel('&Torrent program:', 5, 45, 100, 20, $SS_CENTERIMAGE) GUICtrlSetTip(-1, $sTip) Local $in_AppPath = GUICtrlCreateInput(IniRead($CONFIG_FILE, 'CLIENT', 'PATH', ''), 105, 45, 170, 20) GUICtrlSetTip(-1, $sTip) Local $bt_Browse = GUICtrlCreateButton('...', 275, 45, 20, 20) GUICtrlCreateLabel('Prompt &style:', 5, 65, 100, 20, $SS_CENTERIMAGE) Local $ra_PromptWindow = GUICtrlCreateRadio('Window', 105, 65, 70, 20) GUICtrlSetState(-1, $GUI_CHECKED) Local $ra_PromptMenu = GUICtrlCreateRadio('Menu', 175, 65, 70, 20) If IniRead($CONFIG_FILE, 'CLIENT', 'PROMPT', 'Buttons') = 'Menu' Then GUICtrlSetState(-1, $GUI_CHECKED) EndIf Local $bt_OK = GUICtrlCreateButton('OK', 100, 100, 50, 25) GUICtrlSetState(-1, $GUI_DEFBUTTON) Local $bt_Cancel = GUICtrlCreateButton('Cancel', 160, 100, 50, 25) GUISetState() While 1 Switch GUIGetMsg() Case $bt_Browse Local $sFileBrowse = FileOpenDialog('Torrent program', '', 'Applications (*.exe)', 0, GUICtrlRead($in_AppPath), $hGUISetup) If Not @error Then GUICtrlSetData($in_AppPath, $sFileBrowse) EndIf Case $bt_OK Local $sPromptStyle = 'Window' If BitAND(GUICtrlRead($ra_PromptMenu), $GUI_CHECKED) = $GUI_CHECKED Then $sPromptStyle = 'Menu' EndIf Local $INI_WRITE[][] = [ [ 3 ], [ 'IP', GUICtrlRead($in_IP) ], [ 'PORT', GUICtrlRead($in_Port) ], [ 'PATH', GUICtrlRead($in_AppPath) ], [ 'PROMPT', $sPromptStyle ] ] If Not IniWriteSection($CONFIG_FILE, 'CLIENT', $INI_WRITE) Then MsgBox(0x10, $sAppTitle, 'Unable to save settings file' & @LF & $CONFIG_FILE, 0, $hGUISetup) EndIf ExitLoop Case $bt_Cancel, $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd GUIDelete($hGUISetup) GUISetState(@SW_ENABLE, $hGUIMain) WinActivate($hGUIMain) EndFunc Func _Client($sTorrentIn) If Not FileExists($sTorrentIn) And StringInStr($sTorrentIn, 'magnet:') <> 1 Then MsgBox(0x40030, $sAppTitle, 'Invalid torrent or magnet link:' & @LF & $sTorrentIn) Exit EndIf _TCPStartup() Local $CONNECT_IP = IniRead($CONFIG_FILE, 'CLIENT', 'IP', @LF) Local $CONNECT_PORT = IniRead($CONFIG_FILE, 'CLIENT', 'PORT', @LF) Local $APP_PATH = IniRead($CONFIG_FILE, 'CLIENT', 'PATH', @LF) If StringInStr($CONNECT_IP & $CONNECT_PORT & $APP_PATH, @LF) Then Exit MsgBox(0x30, $sAppTitle, 'Client not setup') Local $iConnectSocket, $vReceive, $iTimer, $iChoice Local $fClientPrompt = _ClientPromptWindow If IniRead($CONFIG_FILE, 'CLIENT', 'PROMPT', 'Buttons') = 'Menu' Then $fClientPrompt = _ClientPromptMenu EndIf $iChoice = $fClientPrompt(IniRead($CONFIG_FILE, 'CLIENT', 'DEFAULT', -1), $APP_PATH) If $iChoice = 0 Then _TorrentApp($APP_PATH, $sTorrentIn) Return ElseIf $iChoice = -1 Then Return EndIf TraySetState() AdlibRegister('_AnimateIcon', 100) While 1 TraySetToolTip($sAppTitle & @LF & 'Connecting to server') $iConnectSocket = TCPConnect(TCPNameToIP($CONNECT_IP), $CONNECT_PORT) If @error Then If MsgBox(0x40031, $sAppTitle, 'Could not connect, retry?') = 1 Then ContinueLoop Else Exit EndIf EndIf TraySetToolTip($sAppTitle & @LF & 'Sending data') If FileExists($sTorrentIn) Then Local $iFileSize = FileGetSize($sTorrentIn), $sFileRead, $hFile = FileOpen($sTorrentIn, 16) If $hFile <> -1 Then $sFileRead = FileRead($hFile) FileClose($hFile) TCPSend($iConnectSocket, $KEY_FILESEND & $iFileSize) $vReceive = _TCPRecv($iConnectSocket, 1024, 1, 3000) If BinaryToString($vReceive) = $KEY_CONTINUE Then Local $iSentData = TCPSend($iConnectSocket, $sFileRead) If @error Then If MsgBox(0x40031, $sAppTitle, 'Data send failed, retry?') = 1 Then ContinueLoop Else Exit EndIf Else If $iSentData <> $iFileSize Then MsgBox(0x40030, $sAppTitle, 'Data send incomplete (' & $iSentData & ' of ' & $iFileSize & ' bytes [' & Floor($iSentData/$iFileSize*100) & '%])') Exit EndIf EndIf Else If MsgBox(0x40031, $sAppTitle, 'No response from server, retry?') = 1 Then ContinueLoop Else Exit EndIf EndIf Else If MsgBox(0x40031, $sAppTitle, 'Unable to open torrent file, retry?') = 1 Then ContinueLoop Else Exit EndIf EndIf ElseIf StringInStr($sTorrentIn, 'magnet:') = 1 Then TCPSend($iConnectSocket, $sTorrentIn) If @error Then If MsgBox(0x40031, $sAppTitle, 'Data send failed, retry?') = 1 Then ContinueLoop Else Exit EndIf EndIf EndIf ExitLoop WEnd TraySetToolTip($sAppTitle & @LF & 'Awaiting response') $vReceive = _TCPRecv($iConnectSocket, 1024, 1, 3000) If BinaryToString($vReceive) = $KEY_SUCCESS Then _Notifier('Torrent data sent:' & @LF & 'Success') Sleep(2000) ElseIf BinaryToString($vReceive) = $KEY_FAIL Then _Notifier('Torrent data sent:' & @LF & 'Fail') Sleep(2000) Else _Notifier('Torrent data sent:' & @LF & 'No response') Sleep(2000) EndIf EndFunc Func _ClientPromptMenu($iDefault, $sAppPath) Local $iReturn = $iDefault, $gm, $hGUIPrompt, $aMouse = MouseGetPos() $hGUIPrompt = GUICreate($sAppTitle, 1, 1, $aMouse[0], $aMouse[1], $WS_POPUP, $WS_EX_TOOLWINDOW) Local $cm = GUICtrlCreateContextMenu(GUICtrlCreateDummy()) GUICtrlCreateMenuItem($sAppTitle, $cm, -1) GUICtrlSetState(-1, $GUI_DISABLE) Local $mi_Remote = GUICtrlCreateMenuItem('Download on &remote', $cm, -1, 1) If $iDefault = 1 Then GUICtrlSetState(-1, $GUI_CHECKED+$GUI_DEFBUTTON) Local $mi_Local = GUICtrlCreateMenuItem('Download &local', $cm, -1, 1) If $iDefault = 0 Then GUICtrlSetState(-1, $GUI_CHECKED+$GUI_DEFBUTTON) Local $mi_Cancel = GUICtrlCreateMenuItem('&Cancel', $cm, -1, 1) If $iDefault = -1 Then GUICtrlSetState(-1, $GUI_CHECKED+$GUI_DEFBUTTON) GUICtrlCreateMenuItem('', $cm) Local $mi_SetDefault = GUICtrlCreateMenuItem('Set as &default', $cm) If Not $sAppPath Then GUICtrlSetState($mi_Local, $GUI_DISABLE+$GUI_UNCHECKED) If $iDefault = 0 Then $iDefault = -1 $iReturn = -1 GUICtrlSetState($mi_Cancel, $GUI_CHECKED+$GUI_DEFBUTTON) EndIf EndIf GUISetState() While 1 Switch _GUICtrlMenu_TrackPopupMenu(GUICtrlGetHandle($cm), $hGUIPrompt, $aMouse[0], $aMouse[1], 1, 1, 2) Case $mi_SetDefault GUICtrlSetState($mi_SetDefault, (BitAND(GUICtrlRead($mi_SetDefault), $GUI_CHECKED) = $GUI_CHECKED) ? $GUI_UNCHECKED : $GUI_CHECKED) ContinueLoop Case $mi_Remote $iReturn = 1 Case $mi_Local $iReturn = 0 Case $mi_Cancel $iReturn = -1 EndSwitch ExitLoop WEnd GUIDelete($hGUIPrompt) Return $iReturn EndFunc Func _UserColor($sColorName, $iDefaultColor = 0) Local $sGetColor = RegRead('HKCU\Control Panel\Colors', $sColorName) If Not @error Then Local $aGetColor = StringSplit($sGetColor, ' ') If $aGetColor[0] = 3 Then Return BitShift($aGetColor[1], -16) + BitShift($aGetColor[2], -8) + Int($aGetColor[3]) EndIf EndIf Return $iDefaultColor EndFunc Func _ClientPromptWindow($iDefault, $sAppPath) Local $iReturn = $iDefault, $gm, $hGUIPrompt $hGUIPrompt = GUICreate($sAppTitle, 200, 140, Default, Default, $WS_CAPTION, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_CONTROLPARENT)) GUISetFont(10) Local $bt_Remote = GUICtrlCreateButton('Forward to &remote', 10, 10, 180, 30) If $iDefault = 1 Then GUICtrlSetState(-1, $GUI_FOCUS) GUICtrlSetFont(-1, 10, 700) EndIf Local $bt_Local = GUICtrlCreateButton('Download &local', 10, 45, 180, 30) GUICtrlSetTip(-1, $sAppPath) If $iDefault = 0 Then GUICtrlSetState(-1, $GUI_FOCUS) GUICtrlSetFont(-1, 10, 700) EndIf Local $bt_Cancel = GUICtrlCreateButton('Cancel', 10, 80, 180, 30) If $iDefault = -1 Then GUICtrlSetState(-1, $GUI_FOCUS) GUICtrlSetFont(-1, 10, 700) EndIf If Not $sAppPath Then GUICtrlSetState($bt_Local, $GUI_DISABLE) If $iDefault = 0 Then GUICtrlSetFont($bt_Local, 10, 400) $iDefault = -1 $iReturn = -1 GUICtrlSetState($bt_Cancel, $GUI_FOCUS) GUICtrlSetFont($bt_Cancel, 10, 700) EndIf EndIf Local $ch_SetDefault = GUICtrlCreateCheckbox('Set as &default', 50, 115, 100, 20) Local $aWinPos = WinGetPos($hGUIPrompt), $aMouse = MouseGetPos(), $aMoveTo[2] $aMoveTo[0] = $aMouse[0] + 15 $aMoveTo[0] = ($aMoveTo[0]+$aWinPos[2] > @DesktopWidth) ? $aMouse[0] - $aWinPos[2]-15 : $aMoveTo[0] $aMoveTo[1] = $aMouse[1] - $aWinPos[3]-15 $aMoveTo[1] = ($aMoveTo[1] < 0) ? $aMouse[1] + 15 : $aMoveTo[1] WinMove($hGUIPrompt, '', $aMoveTo[0], $aMoveTo[1]) _WinAPI_AnimateWindow($hGUIPrompt, $AW_BLEND, 250) GUISetState() Local $bSecondaryDown = 0, $aWinPos = WinGetPos($hGUIPrompt), $aMouse = MouseGetPos(), $aDragOffset[2] While WinActive($hGUIPrompt) Switch GUIGetMsg() Case $GUI_EVENT_SECONDARYDOWN $bSecondaryDown = 1 $aWinPos = WinGetPos($hGUIPrompt) $aMouse = MouseGetPos() $aDragOffset[0] = $aMouse[0] - $aWinPos[0] $aDragOffset[1] = $aMouse[1] - $aWinPos[1] Case $GUI_EVENT_SECONDARYUP $bSecondaryDown = 0 Case $GUI_EVENT_MOUSEMOVE If $bSecondaryDown Then $aMouse = MouseGetPos() WinMove($hGUIPrompt, '', $aMouse[0] - $aDragOffset[0], $aMouse[1] - $aDragOffset[1]) EndIf Case $bt_Remote $iReturn = 1 ExitLoop Case $bt_Local $iReturn = 0 ExitLoop Case $bt_Cancel $iReturn = -1 ExitLoop Case $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd If BitAND(GUICtrlRead($ch_SetDefault), $GUI_CHECKED) Then IniWrite($CONFIG_FILE, 'CLIENT', 'DEFAULT', $iReturn) EndIf _WinAPI_AnimateWindow($hGUIPrompt, BitOR($AW_HIDE, $AW_BLEND), 250) GUIDelete($hGUIPrompt) Return $iReturn EndFunc Func xx_ClientPrompt($iDefault = -1) Local $iReturn = $iDefault, $gm, $hGUIPrompt $hGUIPrompt = GUICreate($sAppTitle, 200, 140, Default, Default, $WS_CAPTION, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_CONTROLPARENT)) GUISetFont(10) Local $bt_Yes = GUICtrlCreateRadio('Forward to &remote', 10, 10, 180, 20) If $iDefault = 1 Then GUICtrlSetState(-1, $GUI_CHECKED) EndIf Local $bt_No = GUICtrlCreateRadio('Download &local', 10, 30, 180, 20) If $iDefault = 0 Then GUICtrlSetState(-1, $GUI_CHECKED) EndIf Local $bt_Cancel = GUICtrlCreateRadio('Cancel', 10, 50, 180, 20) If $iDefault = -1 Then GUICtrlSetState(-1, $GUI_CHECKED) EndIf Local $bt_OK = GUICtrlCreateButton('OK', 10, 75, 60, 30) GUICtrlSetState(-1, $GUI_DEFBUTTON) Local $ch_Remember = GUICtrlCreateCheckbox('Set as &default', 10, 110, 100, 20) Local $aWinPos = WinGetPos($hGUIPrompt), $aMouse = MouseGetPos(), $aMoveTo[2] $aMoveTo[0] = $aMouse[0] + 15 $aMoveTo[0] = ($aMoveTo[0]+$aWinPos[2] > @DesktopWidth) ? $aMouse[0] - $aWinPos[2]-15 : $aMoveTo[0] $aMoveTo[1] = $aMouse[1] - $aWinPos[3]-15 $aMoveTo[1] = ($aMoveTo[1] < 0) ? $aMouse[1] + 15 : $aMoveTo[1] WinMove($hGUIPrompt, '', $aMoveTo[0], $aMoveTo[1]) _WinAPI_AnimateWindow($hGUIPrompt, $AW_BLEND, 250) GUISetState() While WinActive($hGUIPrompt) Switch GUIGetMsg() Case $bt_OK If BitAND(GUICtrlRead($bt_Yes), $GUI_CHECKED) = $GUI_CHECKED Then $iReturn = 1 ElseIf BitAND(GUICtrlRead($bt_No), $GUI_CHECKED) = $GUI_CHECKED Then $iReturn = 0 Else $iReturn = -1 EndIf ExitLoop Case $GUI_EVENT_CLOSE $iReturn = -1 ExitLoop EndSwitch WEnd If BitAND(GUICtrlRead($ch_Remember), $GUI_CHECKED) Then IniWrite($CONFIG_FILE, 'CLIENT', 'DEFAULT', $iReturn) EndIf _WinAPI_AnimateWindow($hGUIPrompt, BitOR($AW_HIDE, $AW_BLEND), 250) GUIDelete($hGUIPrompt) Return $iReturn EndFunc Func _ServerSetup() GUISetState(@SW_DISABLE, $hGUIMain) Local $hGUISetup = GUICreate('Server Setup', 300, 110, Default, Default, Default, Default, $hGUIMain) GUICtrlCreateLabel('&IP address:', 5, 5, 100, 20, $SS_CENTERIMAGE) Local $in_IP = GUICtrlCreateInput(IniRead($CONFIG_FILE, 'SERVER', 'IP', @IPAddress1), 105, 5, 90, 20) GUICtrlCreateLabel('&Port:', 5, 25, 100, 20, $SS_CENTERIMAGE) Local $in_Port = GUICtrlCreateInput(IniRead($CONFIG_FILE, 'SERVER', 'PORT', 65535), 105, 25, 90, 20) Local $sTip = 'Required; Can NOT be left blank' & @LF & '%1 will be replaced with the torrent link' GUICtrlCreateLabel('&Torrent program:', 5, 45, 100, 20, $SS_CENTERIMAGE) GUICtrlSetTip(-1, $sTip) Local $in_AppPath = GUICtrlCreateInput(IniRead($CONFIG_FILE, 'SERVER', 'PATH', ''), 105, 45, 170, 20) GUICtrlSetTip(-1, $sTip) Local $bt_Browse = GUICtrlCreateButton('...', 275, 45, 20, 20) Local $bt_OK = GUICtrlCreateButton('OK', 100, 80, 50, 25) GUICtrlSetState(-1, $GUI_DEFBUTTON) Local $bt_Cancel = GUICtrlCreateButton('Cancel', 160, 80, 50, 25) GUISetState() While 1 Switch GUIGetMsg() Case $bt_Browse Local $sFileBrowse = FileOpenDialog('Torrent program', '', 'Applications (*.exe)', 0, GUICtrlRead($in_AppPath), $hGUISetup) If Not @error Then GUICtrlSetData($in_AppPath, $sFileBrowse) EndIf Case $bt_OK If GUICtrlRead($in_AppPath) Then Local $INI_WRITE[][] = [ [ 3 ], [ 'IP', GUICtrlRead($in_IP) ], [ 'PORT', GUICtrlRead($in_Port) ], [ 'PATH', GUICtrlRead($in_AppPath) ] ] If Not IniWriteSection($CONFIG_FILE, 'SERVER', $INI_WRITE) Then MsgBox(0x10, $sAppTitle, 'Unable to save settings file' & @LF & $CONFIG_FILE, 0, $hGUISetup) EndIf ExitLoop Else MsgBox(0x30, 'Notice', 'Torrent program cannot be left blank', 0, $hGUISetup) ; OK: 1 GUICtrlSetState($in_AppPath, $GUI_FOCUS) EndIf Case $bt_Cancel, $GUI_EVENT_CLOSE ExitLoop EndSwitch WEnd GUIDelete($hGUISetup) GUISetState(@SW_ENABLE, $hGUIMain) WinActivate($hGUIMain) EndFunc Func _Server() If _MySingleton($KEY_SINGLETON, 1) = 0 Then MsgBox(0x30, $sAppTitle, 'The server is already running.') Exit EndIf _TCPStartup() Local $CONNECT_IP = IniRead($CONFIG_FILE, 'SERVER', 'IP', @LF) Local $CONNECT_PORT = IniRead($CONFIG_FILE, 'SERVER', 'PORT', @LF) Local $APP_PATH = IniRead($CONFIG_FILE, 'SERVER', 'PATH', @LF) If StringInStr($CONNECT_IP & $CONNECT_PORT & $APP_PATH, @LF) Then Exit MsgBox(0x30, $sAppTitle, 'Server not setup') Local $iMainSocket, $iConnectSocket, $vReceive TraySetState() AdlibRegister('_AnimateIcon', 100) $iMainSocket = TCPListen($CONNECT_IP, $CONNECT_PORT) If @error Then MsgBox(0x10, 'Error', 'Could not start server (try another port). Error: ' & @error) _UpdateLog('Could not start server (try another port). IP: ' & $CONNECT_IP & '; Port: ' & $CONNECT_PORT & '; Error: ' & @error) Exit EndIf _UpdateLog('Started server. IP: ' & $CONNECT_IP & '; Port: ' & $CONNECT_PORT) TrayCreateItem('View Log') TrayItemSetOnEvent(-1, '_ViewLog') TrayCreateItem('Exit') TrayItemSetOnEvent(-1, '_Exit') While 1 TraySetToolTip($sAppTitle & @LF & 'Listening...' & @LF & 'IP: ' & $CONNECT_IP & @LF & 'Port: ' & $CONNECT_PORT) Do $iConnectSocket = TCPAccept($iMainSocket) Until $iConnectSocket <> -1 Local $sConnectedIP = SocketToIP($iConnectSocket) TraySetToolTip($sAppTitle & @LF & 'Client connected: ' & @LF & 'IP: ' & $sConnectedIP) _UpdateLog('Connected: ' & $sConnectedIP) $vReceive = BinaryToString(_TCPRecv($iConnectSocket, 1024, 1)) If Not @error Then If StringInStr($vReceive, $KEY_FILESEND) Then Local $iFileSize = Int(StringTrimLeft($vReceive, StringLen($KEY_FILESEND))) _UpdateLog('Receiving torrent file (' & $iFileSize & ' bytes)') TCPSend($iConnectSocket, $KEY_CONTINUE) Local $vBuild = Binary('') Do $vReceive = _TCPRecv($iConnectSocket, 1024, 1, 3000) $vBuild &= Binary($vReceive) Until BinaryLen($vBuild) = $iFileSize Or Not $vReceive If BinaryLen($vBuild) = $iFileSize Then _UpdateLog('Received ' & BinaryLen($vBuild) & ' bytes') Local $hFile = FileOpen($sTempFile, 2+16) If $hFile <> -1 Then FileWrite($hFile, $vBuild) FileClose($hFile) _UpdateLog('Wrote torrent data to temp file') If _TorrentApp($APP_PATH, $sTempFile) Then TCPSend($iConnectSocket, $KEY_SUCCESS) _UpdateLog('Passed torrent file to app') Else TCPSend($iConnectSocket, $KEY_FAIL) _UpdateLog('Unable to launch torrent app') EndIf Else TCPSend($iConnectSocket, $KEY_FAIL) _UpdateLog('Unable to create file') EndIf Else TCPSend($iConnectSocket, $KEY_FAIL) _UpdateLog('Received ' & BinaryLen($vBuild) & ' bytes (size mismatch)') EndIf Else _UpdateLog('Received magnet link') If _TorrentApp($APP_PATH, $vReceive) Then TCPSend($iConnectSocket, $KEY_SUCCESS) _UpdateLog('Passed magnet link to app') Else TCPSend($iConnectSocket, $KEY_FAIL) _UpdateLog('Unable to launch torrent app') EndIf EndIf EndIf TCPCloseSocket($iConnectSocket) $iConnectSocket = -1 _UpdateLog('Disconnected: ' & $sConnectedIP) WEnd EndFunc Func _UpdateLog($sMsg) Local $aMonths[] = [ 12, 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] Local $hFile = FileOpen($LOG_FILE, 1) If $hFile <> -1 Then FileWrite($hFile, StringFormat('[%04d-%s-%02d %02d:%02d:%02d] %s\r\n', @YEAR, $aMonths[@MON], @MDAY, @HOUR, @MIN, @SEC, $sMsg)) FileClose($hFile) EndIf EndFunc Func _Associate($bAssocFile = 0) Local $sRegResult = '' If $bAssocFile Then $sRegResult &= RegWrite('HKCR\.torrent', '', 'REG_SZ', 'BitTorrentFile') $sRegResult &= RegWrite('HKCR\BitTorrentFile', '', 'REG_SZ', 'BitTorrent File') $sRegResult &= RegWrite('HKCR\BitTorrentFile\DefaultIcon', '', 'REG_SZ', @AutoItExe & ',0') $sRegResult &= RegWrite('HKCR\BitTorrentFile\shell\open\command', '', 'REG_SZ', '"' & @AutoItExe & '" "%1"') If StringInStr($sRegResult, '0') Then MsgBox(0x30, $sAppTitle, 'Error writing to registry, restart the application with administrator privileges and try again.', 0, $hGUIMain) Else MsgBox(0x40, $sAppTitle, 'Association written. You may need to confirm the new association with Windows.', 0, $hGUIMain) EndIf Else $sRegResult &= RegWrite('HKCR\magnet', 'URL Protocol', 'REG_SZ', '') $sRegResult &= RegWrite('HKCR\magnet\DefaultIcon', '', 'REG_SZ', @AutoItExe & ',0') $sRegResult &= RegWrite('HKCR\magnet\shell\open\command', '', 'REG_SZ', '"' & @AutoItExe & '" "%1"') If StringInStr($sRegResult, '0') Then MsgBox(0x30, $sAppTitle, 'Error writing to registry, restart the application with administrator privileges and try again.', 0, $hGUIMain) Else MsgBox(0x40, $sAppTitle, 'Association written. You may need to confirm the new association in your browser.', 0, $hGUIMain) EndIf EndIf EndFunc Func _Notifier($sMsg = Default) OnAutoItExitRegister('_Exit') If $sMsg = Default Then SplashOff() AdlibUnRegister('_NotifierAdlib') Else Global $NOTIFIER = SplashTextOn($sAppTitle, $sMsg, 200, 50, @DesktopWidth, @DesktopHeight, 1+32) AdlibRegister('_NotifierAdlib', 10) EndIf EndFunc Func _NotifierAdlib() WinMove($NOTIFIER, '', MouseGetPos(0)-10, MouseGetPos(1)-60) EndFunc Func _ViewLog() ShellExecute($LOG_FILE) EndFunc Func _Exit() Local $NOTIFIER = Eval('NOTIFIER') If Not @error Then _WinAPI_AnimateWindow($NOTIFIER, BitOR($AW_HIDE, $AW_BLEND), 250) Exit EndFunc Func _TCPStartup() TCPStartup() OnAutoItExitRegister('_TCPShutdown') EndFunc Func _TCPShutdown() TCPShutdown() EndFunc Func _AnimateIcon() Global $sIcoPath Static $iFrame $iFrame += 1 If $iFrame > 8 Then $iFrame = 1 TraySetIcon($sIcoPath, $iFrame) EndFunc Func _TCPRecv($SOCKET, $MAXLEN, $FLAG = 0, $TIMEOUT = 100) Local $iOrigTimeout, $vReceive, $iError, $iExtended $iOrigTimeout = Opt('TCPTimeout', $TIMEOUT) $vReceive = TCPRecv($SOCKET, $MAXLEN, $FLAG) $iError = @error $iExtended = @extended Opt('TCPTimeout', $iOrigTimeout) Return SetError($iError, $iExtended, $vReceive) EndFunc Func SocketToIP($iSocket) Local $tSockAddr = 0, $aRet = 0 $tSockAddr = DllStructCreate("short;ushort;uint;char[8]") $aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $iSocket, "struct*", $tSockAddr, "int*", DllStructGetSize($tSockAddr)) If Not @error And $aRet[0] = 0 Then $aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($tSockAddr, 3)) If Not @error Then Return $aRet[0] EndIf Return 0 EndFunc ;==>SocketToIP Func _TorrentApp($sAppPath, $sTorrentPath) Local $sRunCmd = StringReplace($sAppPath, '%1', $sTorrentPath) If Not @extended Then $sRunCmd &= ' ' & $sTorrentPath Return Run($sRunCmd) EndFunc