Euuuuh je crois que tout est expliquer dans le titre.
Le script liste tous les nicks pour un cannal, enregistre la liste dans un fichier qui est par la suite envoyer sur un server ftp.
PRatique pour afficher la liste des user dans un canal sur un site (utiliser dans
http://www.poeme-france.com) et oui je fait un peu de PUB au passage.
Source / Exemple :
;; /ftp_send
; déclenche l'envoi du fichier spéficié sur le serveur ftp donné.
; (les informations sont à modifier ci-dessous..)
alias ftp_send {
var %sock = $+(ftpsend_,$ticks)
ftpdata_create %sock
;;=== informations à modifier =====================================;;
; ci dessous, le fichier à envoyer (spécifier le chemin complet)
var %fichier = userlist.txt
; l'adresse du serveur ftp
var %serveur = ServerFTP
; le port du serveur ftp
var %port = 21
; le nom d'utilisateur
var %login = USER
; le mot de passe associé au nom d'utilisateur
var %pass = PASS
; le répertoire distant dans lequel sera déposé le fichier
var %rep = /
;;=================================================================;;
; inscription des données en mémoire.. (hash)
ftpdata_add %sock file %fichier
ftpdata_add %sock host %serveur
ftpdata_add %sock port %port
ftpdata_add %sock user %login
ftpdata_add %sock pass %pass
ftpdata_add %sock cwd %rep
ftpdata_add %sock pos 0
sockopen %sock $ftpdata_get(%sock,host) $ftpdata_get(%sock,port)
}
;; gestion des données en mémoire (une hash associée à chaque socket)
alias -l ftpdata_create { var %hash = $$1 | if !$hget(%hash) { hmake %hash 5 } }
alias -l ftpdata_clear { var %hash = $$1 | if $hget(%hash) { hfree %hash } }
alias -l ftpdata_add { var %hash = $1 | if $hget(%hash) { hadd %hash $2 $$3- } }
alias -l ftpdata_get { var %hash = $1 | return $iif($hget(%hash),$hget(%hash,$2)) }
;;=====================================;;
; gestion des sockets ;
;;=====================================;;
;------ - ------------- - --- ---;
; canal de commande ;
;----------- ----- -- ----------;
; gestion de l'ouverture du socket
on *:sockopen:ftpsend_*:{ if $sockerr { echo 4 -ta ..ftpsend: erreur lors de la connexion au serveur. envoi annulé. | ftpdata_clear $sockname | return } }
; lecture des données
on *:sockread:ftpsend_*:{
if $sockerr { return }
sockread %temp
while $sockbr {
; affichage des données reçues
;echo -ta ..ftpsend: $sockname -> %temp
; traitement du code reçu
var %code = $gettok(%temp,1,32)
ftpsend_treatcode $sockname %code $gettok(%temp,2-,32)
; lecture du prochain paquet..
sockread %temp
}
}
;------ - ------------- - --- ---;
; canal de données ;
;----------- ----- -- ----------;
; envoi des données du fichier
on *:sockopen:t_ftp_send_*:{
if $sockerr { echo 4 -a erreur | return }
;echo -a canal de données ouvert
}
on *:sockwrite:t_ftpsend_*:{
if $sockerr { return }
var %sock = $remove($sockname,t_) , %pos = $ftpdata_get(%sock,pos) , %file = $quoted($ftpdata_get(%sock,file))
; pour un affichage éventuel des données..
var %pourcent = $+($round($calc((%pos * 100)/ $file(%file).size),1),%)
var %size = ( $+ $bytes(%pos,3).suf $+ / $+ $bytes($file(%file).size,3).suf $+ )
;echo -ta ..ftpsend: $nopath($longfn(%file)) : %pourcent : %size
; tant que la totalité du fichier n'a pas été envoyée..
if (%pos < $file(%file).size) {
bread %file %pos 8192 &data
sockwrite $sockname &data
ftpdata_add %sock pos $calc(%pos + $bvar(&data,0))
}
; sinon, le transfert du fichier est complet. on ferme socket de données et session.
else { sockclose $sockname | sockwrite -n %sock QUIT }
}
;------ - ------------- - --- ---;
; gestion des codes reçus ;
;----------- ----- -- ----------;
;; /ftpsend_treatcode <socket> <code> [données]
; exécute l'action associée au code de réponse <code> du serveur ftp
alias -l ftpsend_treatcode {
var %sock = $1 , %code = $$2 , %data = $3-
; nom d'utilisateur
if (%code == 220) { sockwrite -n %sock user $ftpdata_get(%sock,user) }
; mot de passe
elseif (%code == 331) { sockwrite -n %sock pass $ftpdata_get(%sock,pass) }
; logged in
elseif (%code == 230) { sockwrite -n $sockname TYPE I }
; type *image* OK
elseif (%code == 200) { sockwrite -n %sock PASV }
; mode passif OK.
elseif (%code == 227) {
; tentative d'ouverture du canal de données, suivant les informations fournies
var %addr = $remove($gettok(%data,-1,32),$chr(40),$chr(41))
var %host = $replace($gettok(%addr,1-4,44),$chr(44),$chr(46))
var %hport = $gettok(%addr,5,44) , %lport = $gettok(%addr,6,44) , %port = $calc(%hport * 2^8 + %lport)
sockopen $+(t_,%sock) %host %port
; on change le répertoire courant
sockwrite -n %sock CWD $iif($ftpdata_get(%sock,cwd),$ifmatch,/)
}
; changement de répertoire courant OK.
elseif (%code == 250) {
; commande d'envoi du fichier de données, via la canal de commande
var %file = $ftpdata_get(%sock,file)
sockwrite -n %sock STOR $nopath($longfn(%file))
}
; le canal de donnée est ouvert. on envoie le fichier.
elseif (%code == 150) {
var %pos = $ftpdata_get(%sock,pos) , %file = $ftpdata_get(%sock,file)
bread %file %pos 8192 &data
sockwrite $+(t_,%sock) &data
ftpdata_add %sock pos $calc(%pos + $bvar(&data,0))
}
; session terminée.
elseif (%code == 221) { ftpdata_clear %sock }
}
;------ - ------------- - --- ---;
; librairie ;
;----------- ----- -- ----------;
;; $quoted(chemin/fichier)
; renvoie une chaine "chemin/fichier" (pour les chemins contenant des espaces)
alias -l quoted return $iif(" isin $$1-,$$1-,$+(",$$1-,"))
;----------------------------------------------------------------------------------------
; Creation du fichier a envoyer
;----------------------------------------------------------------------------------------
alias userlist {
if $exists(userlist.txt) {
.remove userlist.txt
write -c userlist.txt
}
set %salon #
set %nbrboucle 0
set %mass 0
:boucleyop
inc %nbrboucle
set %mec $nick(%salon, %nbrboucle)
if (%mec == $null ) { goto finyop }
;if (%mec == $me ) { goto boucleyop }
write -a userlist.txt %mec <br />
inc %mass
inc %mass
inc %mass
goto boucleyop
:finyop
inc %mass
unset %mass
.timerSend 1 3 /ftp_send
.timerSendEcho 1 4 echo Send...
;write -c userlist.txt
}
On *:JOIN:#:{
/userlist
}
ON *:PART:#:{
.timerSend 1 3 /userlist
}
ON *:QUIT:{
.timerSend 1 3 /userlist
}
on *:NICK:{
.timerSend 1 3 /userlist
}
ON *:KICK:{
.timerSend 1 3 /userlist
}
On *:START:{
/userlist
}
Menu channel,menubar {
UserList: /userlist
}
Conclusion :
Premier et sans doute dernier script.
Je ne savais pas dans quel cathégorie le placé dsl si j'ai mal choisi.
Il y a sans doute la possibilité de l'améliorer ....
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.