#include #cs == Параметры =================================================================== $XMPP_PING_SERVER (True/False) - автоматически пинговать сервер [False] $XMPP_AUTO_CLOSE_TCP (True/False) - автоматически закрывать TCP при ошибки [True] #ce ================================================================================ ;=================================================================================== Global $JIDs_1_UDF[999], $Connects_2_UDF[1] = [0], _ $XMPP_PING_SERVER = False, _ $XMPP_AUTO_CLOSE_TCP = True ;=================================================================================== AdlibRegister("__PingServer",30000) If $XMPP_AUTO_CLOSE_TCP Then OnAutoItExitRegister("__EndJabberTCP") ;=================================================================================== ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Connect ; Description....: Produce the connection with Jabber server. ; Syntax.........: Jabber_Connect($sJID, $sPASS, $sClientName [, $iPORT = 5222]) ; Parameters.....: $sJID - your JID ; $sPASS - your password ; $sClientName - conditional name of the client ; $iPORT - number of port, default: 5222 ; Return values..: Success - number TCP connections ; Failure - -1 ; Author.........: Nik(rus) ; Modified.......: SECTOR ; Remarks........: register JID possible on www.jabber.org ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Connect($sJID,$sPASS,$sClientName,$iPORT = 5222) $split = StringSplit($sJID,"@") If @error <> 0 Or Not IsArray($split) Or UBound($split) <> 3 Then SetError(1,0,-1) $sServer = $split[2] $sJID_name = $split[1] TCPStartup() $connect = TCPConnect(TCPNameToIP($sServer),$iPORT) If @error <> 0 Then SetError(2,0,-1) TCPSend($connect, "") TCPSend($connect, "" &$sJID_name& "") TCPSend($connect, "" &$sJID_name& "" &$sPASS& "" &StringToXMPP($sClientName)& "") Sleep(500) $JIDs_1_UDF[StringRight($connect,3)] = $sJID _ArrayAdd($Connects_2_UDF,$connect) $Connects_2_UDF[0] = UBound($Connects_2_UDF)-1 Return $connect EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_ReConnect ; Description....: be disconnected from Jabber server. ; Syntax.........: Jabber_ReConnect(ByRef $connect) ; Parameters.....: $connect - number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: Nik(rus) ; Modified.......: SECTOR ; Remarks........: ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_ReConnect(ByRef $connect) If $connect = -1 Then Return 0 TCPsend($connect, "") TCPCloseSocket($connect) _ArrayDelete($Connects_2_UDF,_ArraySearch($Connects_2_UDF,$connect,1)) $Connects_2_UDF[0] = UBound($Connects_2_UDF)-1 Return 1 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Send ; Description....: Send message other user. ; Syntax.........: Jabber_Send($sJID,$sTEXT,ByRef $connect) ; Parameters.....: $sJID - JID the grantee ; $sTEXT - sent text ; $connect - number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: Nik(rus) ; Modified.......: SECTOR ; Remarks........: ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Send($sJID,$sTEXT,ByRef $connect) ; Можно исользовать для отправки сообщений в приат: If $connect = -1 Then Return 0 ; Jabber_Send("autoit@conference.jabber.ru/SECTOR","Приват",$connect) $sTEXT = StringToXMPP($sTEXT) TCPSend($connect, "" &$sTEXT& "") Return 1 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Read ; Description....: Read messages. ; Syntax.........: Jabber_Read(ByRef $connect) ; Parameters.....: $connect - number returned function Jabber_Connect ; Return values..: Success - Array: ; $array[0] - jid sender ; $array[1] - text of the message ; Failure - 0 or "" ; Author.........: Nik(rus) ; Modified.......: SECTOR ; Remarks........: ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Read(ByRef $connect) If $connect = -1 Then Return 0 $recv = TCPRecv($connect, 2048) if $recv <> "" then if StringInStr($recv, "") Then $from1 = StringTrimLeft($recv, StringInStr($recv, "from=") + 5) $from2 = StringTrimRight($from1, StringLen($from1) - StringInStr($from1, ">") + 2) $fromtemp = StringLen($from2) - StringInStr($from2,'/') + 1 $from = StringTrimRight($from2,$fromtemp) $body = StringInStr($recv, "") + 5 $body2 = StringLen($recv) - StringInStr($recv, "") + 1 $messbod = StringTrimRight(StringTrimLeft($recv, $body), $body2) $messbod = XMPPToString($messbod) ;--------------------------------------------------------------------- Local $retun[2] $retun[0] = $from $retun[1] = $messbod return $retun ;--------------------------------------------------------------------- EndIf EndIf if StringInStr($recv, "") Then $from1 = StringTrimLeft($recv, StringInStr($recv, "from=") + 5) $from = StringTrimRight($from1, StringLen($from1) - StringInStr($from1, " ") + 2) $recv = "" EndIf EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Status ; Description....: Set Status. ; Syntax.........: Jabber_Status($status,$statstr,ByRef $connect) ; Parameters.....: $status - status, look the remarks ; $statstr - text of the status ; $connect - number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: Nik(rus) ; Modified.......: SECTOR ; Remarks........: as parameter $status, use following importances (online|dnd|chat|xa|away|invisible|unavailable) ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Status($status,$statstr,ByRef $connect) ; где $status = online|dnd|chat|xa|away|invisible|unavailable If $connect = -1 Then Return 0 TCPSend($connect, "" & $status & "" & StringToXMPP($statstr) & "") Sleep(500) Return 1 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Open ; Description....: call at in conference ; Syntax.........: Jabber_Conf_Open($conf,$nick,ByRef $connect) ; Parameters.....: $conf - JID the conference ; $nick - your nick-name ; $connect - number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: SECTOR ; Modified.......: ; Remarks........: JID conferences looks approximately so: autoit@conference.jabber.ru ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Open($conf,$nick,ByRef $connect) If $connect = -1 Then Return 0 TCPSend($connect, _ ''& _ ''& _ '0'& _ ''& _ ''& _ '') Sleep(500) Return 1 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Close ; Description....: exiting a conference ; Syntax.........: Jabber_Conf_Close($conf,$connect) ; Parameters.....: $conf - JID the conference ; $connect - number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: SECTOR ; Modified.......: ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Close($conf,$connect) If $connect = -1 Then Return 0 TCPSend($connect,"") Sleep(500) Return 1 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Send ; Description....: send message in conference ; Syntax.........: Jabber_Conf_Send($conf,$msg,ByRef $connect) ; Parameters.....: $conf - JID the conference ; $msg - sent text ; $connect - number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: SECTOR ; Modified.......: ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Send($conf,$msg,ByRef $connect) If $connect = -1 Then Return 0 $msg = StringToXMPP($msg) $conf = StringToXMPP($conf) TCPSend($connect, _ ''& _ ''& _ $msg& _ ''& _ '') Return 1 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Read ; Description....: read messages in conference ; Syntax.........: Jabber_Conf_Read($conf,ByRef $connect) ; Parameters.....: $conf - JID the conference ; $connect - number returned function Jabber_Connect ; Return values..: Success - Array: ; $array[0] - nick sender ; $array[1] - text of the message ; $array[2] - type: "groupchat" - conference, "chat" - private ; Failure - 0 or "" ; Author.........: SECTOR ; Modified.......: Kaster ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Read($conf,ByRef $connect) If $connect = -1 Then Return 0 $recv = TCPRecv($connect, 2048) If $recv = "" Then Return "" ;MsgBox(0, '', $recv) $confin = StringInStr($recv,$conf) If $confin = 0 Or @error Then Return "" If StringInStr($recv,'stamp=') <> 0 Then Return "" $who = StringTrimLeft($recv,$confin + StringLen($conf)) $who = StringTrimRight($who,StringLen($who)-StringInStr($who,$JIDs_1_UDF[StringRight($connect,3)])+7) $who = XMPPToString($who) $msg = XMPPToString(GetXML($recv,"","")) $type = "chat" If StringInStr($recv,'type="groupchat"')<>0 Or StringInStr($recv,"type='groupchat'")<>0 Then $type = "groupchat" If StringInStr($recv, "presence from='") Then ;MsgBox(0, '', '1') $type = "groupchat" $nick = StringRegExpReplace($recv, "(?s).+from='" & $conf & "/(.+)'\sto.+", '\1') $sPattern = "(?s).+item\sjid='(.+)'\saffiliation='(.+)'\srole='(.+)'.+" $realJID = StringRegExpReplace($recv, $sPattern, '\1') $affiliation = StringRegExpReplace($recv, $sPattern, '\2') $role = StringRegExpReplace($recv, $sPattern, '\3') If StringInStr($affiliation, 'none') Then $postfix = '(none)' ElseIf StringInStr($affiliation, 'member') Then $postfix = '(member)' ElseIf StringInStr($affiliation, 'admin') Then $postfix = '(admin)' ElseIf StringInStr($affiliation, 'owner') Then $postfix = '(owner)' EndIf $action = ' new member ' If StringInStr($recv, "type='unavailable'") Then If StringInStr($recv, 'nick=') Then $action = ' rename ' $postfix = '' Else $action = ' exit ' EndIf EndIf $msg = XMPPToString($nick) & "(" & $realJID & ")" & $action & $postfix EndIf Local $return[3] $return[0] = $who $return[1] = $msg $return[2] = $type ; chat - Приват, groupchat - Конференция Return $return EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Member_List ; Description....: rget list a on-line participant ; Syntax.........: Jabber_Conf_Member_List($conf, ByRef $connect) ; Parameters.....: $conf - JID the conference ; $connect - number returned function Jabber_Connect ; Return values..: Success - 2D Array: ; $array[$n][0] - nick sender ; $array[$n][1] - jid sender ; Failure - 0 or "" ; Author.........: SECTOR ; Modified.......: Kaster ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Member_List($conf, ByRef $connect) If $connect = -1 Then Return 0 TCPSend($connect, _ ""& _ ""& _ ""& _ ""& _ "") Sleep(100) $recv = TCPRecv($connect,4096) ;If $recv = '' Then Return 0 ;ClipPut($recv) $recv_use = StringRegExpReplace($recv, '.+\#items''\>(\\', '\1') $recv_use = StringMid($recv_use, 2, StringLen($recv_use) - 1) $recv_use = StringSplit($recv_use, '><', 1) Local $aRecv[UBound($recv_use)][2] For $i = 0 to UBound($aRecv, 1) - 1 $aRecv[$i][0] = XMPPToString(StringRegExpReplace($recv_use[$i], '.+''(.+)''.+''(.+)''/\>?', '\1')) $aRecv[$i][1] = XMPPToString(StringRegExpReplace($recv_use[$i], '.+''(.+)''.+''(.+)''/\>?', '\2')) Next Return $aRecv EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Kick ; Description....: kick member ; Syntax.........: Jabber_Conf_Kick($sConf,$sNick,$sText,$hConnect) ; Parameters.....: $sConf - JID the conference ; $sNick - Nick a member ; $sText - Comment ; $hConnect - Number returned function Jabber_Connect ; Return values..: Success - 1 ; Failure - 0 ; Author.........: SECTOR ; Modified.......: Kaster ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Kick($sConf,$sNick,$sText,$hConnect) If $hConnect = -1 Then Return 0 Local $usr = Jabber_Conf_Member_List($sConf,$hConnect) If @error Or Not IsArray($usr) Or _ArrayBinarySearch($usr,$sNick) = -1 Then Return False TCPSend($hConnect, _ ""& _ ""& _ ""& _ ""&StringToXMPP($sText)&""& _ "") Return True EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Voice_Yes ; Description....: Give voice a member ; Syntax.........: Jabber_Conf_Voice_Yes($sConf, $sNick, $hConnect[, $sReason=""][, $sRole="participant"]) ; Parameters.....: $sConf - JID the conference ; $sNick - Nick a member ; $hConnect - Number returned function Jabber_Connect ; $sReason - Reason, not without. Defauls = "" ; $sRole - New role a member, not without. Defauls = "participant" ; Return values..: Success - 1 ; Failure - 0 ; Author.........: SECTOR ; Modified.......: Kaster ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Voice_Yes($sConf, $sNick, $hConnect, $sReason="", $sRole="participant") If $hConnect = -1 Then Return 0 Local $usr = Jabber_Conf_Member_List($sConf,$hConnect) If @error Or Not IsArray($usr) Or _ArrayBinarySearch($usr,$sNick) = -1 Then Return 0 ; Формирование пакета для отправки Local $send = ""& _ ""& _ "" If Not $sReason = False And Not $sReason = "" Then $send &= ""&StringToXMPP($sReason)&"" $send &= "" ; Отправка пакета TCPSend($hConnect,$send) If Not @error Then Return 1 Return 0 EndFunc ; #FUNCTION# ==================================================================================================================== ; Name...........: Jabber_Conf_Voice_No ; Description....: Get voice a member ; Syntax.........: Jabber_Conf_Voice_No($sConf, $sNick, $hConnect[, $sReason=""][, $sRole="participant"]) ; Parameters.....: $sConf - JID the conference ; $sNick - Nick a member ; $hConnect - Number returned function Jabber_Connect ; $sReason - Reason, not without. Defauls = "" ; $sRole - New role a member, not without. Defauls = "visitor" ; Return values..: Success - 1 ; Failure - 0 ; Author.........: SECTOR ; Modified.......: Kaster ; Remarks........: before this it is necessary to use Jabber_Conf_Open, but that can be a mistakes ; Related........: ; Link...........: No ; Example........: Yes ; =============================================================================================================================== Func Jabber_Conf_Voice_No($sConf, $sNick, $hConnect, $sReason="", $sRole="visitor") If $hConnect = -1 Then Return 0 Local $usr = Jabber_Conf_Member_List($sConf,$hConnect) If @error Or Not IsArray($usr) Or _ArrayBinarySearch($usr,$sNick) = -1 Then Return 0 ; Формирование пакета для отправки Local $send = ""& _ ""& _ "" If Not $sReason = False And Not $sReason = "" Then $send &= ""&StringToXMPP($sReason)&"" $send &= "" ; Отправка пакета TCPSend($hConnect,$send) If Not @error Then Return 1 Return 0 EndFunc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Func StringToXMPP($sString) Local $Result = "", $Code Local $VarUTFArr = StringSplit($sString, "") For $i = 1 To $VarUTFArr[0] $Code = Asc($VarUTFArr[$i]) Select Case $Code >= 192 And $Code <= 239 $VarUTFArr[$i] = Chr(208) & Chr($Code - 48) Case $Code >= 240 And $Code <= 255 $VarUTFArr[$i] = Chr(209) & Chr($Code - 112) Case $Code = 168 $VarUTFArr[$i] = Chr(208) & Chr(129) Case $Code = 184 $VarUTFArr[$i] = Chr(209) & Chr(145) Case Else $VarUTFArr[$i] = Chr($Code) EndSelect $Result &= $VarUTFArr[$i] Next $Result = StringRegExpReplace($Result,"&",'&') $Result = StringRegExpReplace($Result,"<","<") $Result = StringRegExpReplace($Result,">",">") $Result = StringRegExpReplace($Result,'"','"') $Result = StringRegExpReplace($Result,"'",''') Return $Result EndFunc Func XMPPToString($string) $string = BinaryToString(StringToBinary($string),4) $string = StringRegExpReplace($string,"&",'&') $string = StringRegExpReplace($string,"<","<") $string = StringRegExpReplace($string,">",">") $string = StringRegExpReplace($string,""",'"') $string = StringRegExpReplace($string,"'","'") Return $string EndFunc Func GetXML($str,$el_1,$el_2) $str = StringTrimLeft($str,StringInStr($str,$el_1)+StringLen($el_1)-1) $str = StringTrimRight($str,StringLen($str)-StringInStr($str,$el_2)+1) Return $str EndFunc Func __EndJabberTCP() TCPShutdown() If @error <> 0 Then Return "" EndFunc Func __PingServer() If $XMPP_PING_SERVER = False Then Return "" If $Connects_2_UDF[0] = 0 Then Return "" For $n = 1 To $Connects_2_UDF[0] TCPSend($Connects_2_UDF[$n]," ") Next EndFunc