Mon problème concerne l'envoi d'un fichier via IRC.
Comment je fait pour envoier un fichier? :O
Simplement en utilisant le "_FileToBinaryFunction.au3" écrit par Tlem, un peu remaniée par moi même et l'envoi par groupe de 400 caractere sur le chat IRC.
Ensuite, il suffit de recuperer le contenu envoyé, sur le chat, et de regrouper le tout et de "reconstruire le fichier"
Quel est le problème ? :O
Mon problème survient lorsque le fichier depasse les 6Ko ... en effet, il semblerai que mon script se "bloque".
étrange, j'ai d'abord pensé que j'envoyais les informations trop rapidement, alors j'ai mit des sleep() pour ralentir, mais rien ne fait.
Le plus étrange étant que quand j'appui sur le bouton 'Envoi', mon script se remet apparemment en marche et mon compteur augmente de nouveau ...
Les script ci dessous.
► Afficher le texteScript pour l''envoi de fichier
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.6.0
Auteur: Pandi_Panda
Fonction du Script :
Envoi de fichier via IRC
#ce ----------------------------------------------------------------------------
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListboxConstants.au3>
#include <GUIListBox.au3>
#Region ### START Koda GUI section ### Form=
Global $Gui = GUICreate("Form1", 271, 240, 192, 124)
Global $List = GUICtrlCreateList("", 8, 8, 145, 225,BitOR($WS_VSCROLL,$WS_BORDER,$LBS_NOINTEGRALHEIGHT))
Global $path = GUICtrlCreateButton("File", 176, 8, 89, 105)
Global $envoi = GUICtrlCreateButton("Envoi", 177, 121, 89, 105)
GUISetState(@SW_SHOW)
_Bienvenue($List)
#EndRegion ### END Koda GUI section ###
TCPStartup()
Global $serveur = "irc.freenode.org"
Global $port = 6667
Global $channel = "#pandi"
Global $pseudo = "pandou"
Global $arrayEnvoi; 'array contenant les caractere a envoyé
Global $EnvoiOn=False; si on est en train d'envoyer ou pas
Global $CptEnvoi=0; pour compter le nombre d'envoi
Global $MaxEnvoi=0;le nombre d'envoi à ne pas depasser
Global $pathFile=""
Global $Extension=""
Global $masock
$masock = TCPConnect(TCPNameToIP($serveur), $port) ;établir la connexion au serveur
If $masock = -1 Then
MsgBox(16,'',"Erreur de conexion")
Exit
EndIf
TCPSend($masock, "NICK " & $pseudo & @CRLF) ; on envoi le message NICK
TCPSend($masock, "USER " & $pseudo & " test test2 :OhMyGod " & @CRLF) ; on envoi le message USER
Local $data,$datasplit,$datasplit2
While 1
$nMsg=GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $path
_Path()
Case $envoi
_Envoi()
EndSwitch
If _GUICtrlListBox_GetCount($List)> 10 Then
_GUICtrlListBox_ResetContent($List)
EndIf
$data = TCPRecv($masock, 4000) ; on insere ce qu'on recoit dans $data
If @error Then Exit ; si il y a une erreur, on ferme la boucle.
If Not $data Then ContinueLoop ; sinon on continue à lire
$datasplit = StringSplit($data, @CRLF, 1) ;on decompose dans un array le packet qu'on a recu pour differencier chaque ligne recu
For $i = 1 To $datasplit[0] ;on forme une boucle pour étudier chacune des lignes recu
$datasplit2 = StringSplit($datasplit[$i], " ") ;on decompose dans un array la ligne qu'on a recu pour differencier chaque mot de la ligne
If $datasplit2[1] = "PING" Then TCPSend($masock, "PONG " & $datasplit2[2] & @CRLF) ;Respond to PING requests from the server
If $datasplit2[0] < 3 Then ContinueLoop ; on verifie qu'il y a plus de 3 mot dans la ligne, si oui on continue (ca permet de verifier que la donnée recu est importante
Switch $datasplit2[2] ;on fait un switch pour faire des différences si le deuxieme mot est :
Case "PRIVMSG" ; privmsg (donc on recoit du texte)
$qui = StringMid($datasplit2[1], 2, StringInStr($datasplit2[1], "!") - 2) ;recuperer le pseudo de celui qui a écrit
$quoi = StringMid($datasplit[$i], StringInStr($datasplit[$i], ":", 0, 2) + 1) ;qu'est ce qu'il a dit
$ou = $datasplit2[3] ;et sur quel canal
If $quoi="Recu" And $CptEnvoi <> $MaxEnvoi-1 Then
Sleep(50)
_EnvoiViaIRC($arrayEnvoi[$CptEnvoi],$channel)
$CptEnvoi=$CptEnvoi+1
_GUICtrlListBox_AddString($List,"Envoi:"&$CptEnvoi&"/"&$MaxEnvoi)
ElseIf $CptEnvoi = $MaxEnvoi-1 Then
_EnvoiViaIRC("Fin|"&$Extension,$channel)
_GUICtrlListBox_AddString($List,"FIN")
$EnvoiOn=False
$CptEnvoi=0
$MaxEnvoi=0
$arrayEnvoi=""
EndIf
Case "001" ; 001 (c'est à dire qu'on a fini de se connecter, on établie la connexion au channel
TCPSend($masock, "JOIN " & $channel & @CRLF) ;JOIN #channel
EndSwitch
Next
WEnd
Func _FileToBin($PathToConvert,$cut=True,$nbMaxCaractere=1,$nbMinCarcatere=1)
Local $formatBin = FileOpen($PathToConvert, 16)
Local $readBin = FileRead($formatBin)
FileClose($formatBin)
If $cut Then Return StringRegExp($readBin,"(.{"&$nbMinCarcatere&","&$nbMaxCaractere&"})",3)
Return $readBin
EndFunc
Func _Bienvenue($List)
Local $array[4]=["Bienvenue","le choix du fichier se fait","via le bouton 'File'","L'envoi via 'Envoi'"]
For $i=0 To UBound($array)-1
_GUICtrlListBox_AddString($List,$array[$i])
Next
EndFunc
Func _EnvoiViaIRC($str,$channel)
TCPSend($masock, "PRIVMSG " & $channel & " :" & $str & @CRLF); envoi
EndFunc
Func _Path()
$pathFile=FileOpenDialog("quel fichier?",@ScriptDir,"(*.*)")
EndFunc
Func _Envoi()
If $pathFile <> "" And Not $EnvoiOn Then
$EnvoiOn=True
$arrayEnvoi=_FileToBin($pathFile,True,400,1)
$MaxEnvoi=UBound($arrayEnvoi)
$tmp=StringSplit($pathFile,"\")
$Extension=$tmp[$tmp[0]]
Elseif $EnvoiOn Then
MsgBox(16,"erreur","deja en cours d'envoi ...")
Else
MsgBox(16,"erreur","choisissez un fichier")
EndIf
_EnvoiViaIRC($arrayEnvoi[$CptEnvoi],$channel)
$CptEnvoi=$CptEnvoi+1
_GUICtrlListBox_ResetContent($List)
_GUICtrlListBox_AddString($List,"Envoi:"&$CptEnvoi&"/"&$MaxEnvoi)
EndFunc
Func _Quitter()
Exit
EndFunc► Afficher le texteScript pour recevoir le fichier
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version : 3.3.6.0
Auteur: Pandi_Panda
Fonction du Script :
réception de fichier
#ce ----------------------------------------------------------------------------
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <ListboxConstants.au3>
#include <GUIListBox.au3>
TCPStartup()
Global $serveur = "irc.freenode.org"
Global $port = 6667
Global $channel = "#pandi"
Global $pseudo = "doudou"
Global $Reception=""
Global $pathFile=""
Global $cpt=0
Global $masock
$masock = TCPConnect(TCPNameToIP($serveur), $port) ;établir la connexion au serveur
If $masock = -1 Then
MsgBox(16,'',"Erreur de conexion")
Exit
EndIf
TCPSend($masock, "NICK " & $pseudo & @CRLF) ; on envoi le message NICK
TCPSend($masock, "USER " & $pseudo & " test test2 :OhMyGod " & @CRLF) ; on envoi le message USER
Local $data,$datasplit,$datasplit2
While 1
$data = TCPRecv($masock, 4000) ; on insere ce qu'on recoit dans $data
If @error Then Exit ; si il y a une erreur, on ferme la boucle.
If Not $data Then ContinueLoop ; sinon on continue à lire
$datasplit = StringSplit($data, @CRLF, 1) ;on decompose dans un array le packet qu'on a recu pour differencier chaque ligne recu
For $i = 1 To $datasplit[0] ;on forme une boucle pour étudier chacune des lignes recu
$datasplit2 = StringSplit($datasplit[$i], " ") ;on decompose dans un array la ligne qu'on a recu pour differencier chaque mot de la ligne
If $datasplit2[1] = "PING" Then TCPSend($masock, "PONG " & $datasplit2[2] & @CRLF) ;Respond to PING requests from the server
If $datasplit2[0] < 3 Then ContinueLoop ; on verifie qu'il y a plus de 3 mot dans la ligne, si oui on continue (ca permet de verifier que la donnée recu est importante
Switch $datasplit2[2] ;on fait un switch pour faire des différences si le deuxieme mot est :
Case "PRIVMSG" ; privmsg (donc on recoit du texte)
$qui = StringMid($datasplit2[1], 2, StringInStr($datasplit2[1], "!") - 2) ;recuperer le pseudo de celui qui a écrit
$quoi = StringMid($datasplit[$i], StringInStr($datasplit[$i], ":", 0, 2) + 1) ;qu'est ce qu'il a dit
$ou = $datasplit2[3] ;et sur quel canal
If StringInStr($quoi,"Fin|") = 0 Then
Sleep(50)
$Reception=$Reception&$quoi
TCPSend($masock, "PRIVMSG " & $channel & " :" & "Recu" & @CRLF); envoi
ElseIf StringInStr($quoi,"Fin|") <> 0 Then
$tmp=StringSplit($quoi,"|")
If $tmp[0]=2 Then $Extension=$tmp[2]
_BinToFile(@ScriptDir&"\"&$Extension,$Reception)
$Reception=""
EndIf
Case "001" ; 001 (c'est à dire qu'on a fini de se connecter, on établie la connexion au channel
TCPSend($masock, "JOIN " & $channel & @CRLF) ;JOIN #channel
MsgBox(0,"","Conexion channel?")
EndSwitch
Next
WEnd
#cs _BinToFile($PathSortie,$formatBin)
@FUNCTION:
> permet de "transformer" le binaire en un fichier
@PARAM:
> $PathSortie => ou stocker le fichier
> $formatBin => le binaire a convertir
#ce
Func _BinToFile($PathSortie,$formatBin)
Local $file = FileOpen($PathSortie,16+1)
If $file = -1 Then
MsgBox(0, "Erreur", "Impossible de re-créer le fichier.")
Exit
EndIf
FileWrite($file, $formatBin)
FileClose($file)
EndFuncDonc inutile de proposer autre chose
Merciiiiii !
Edit: si vous voulez test, changer de channel et pseudo


