Telechargement de packs en série sur xdcc (seulement compatible avec iroffer)

Description

Ce code a pour but le telechargement de packs qui se suivent sur un meme XDCC.

On lance le script comme ceci : /xc Nick 1erpack dernierpack

Le script gere tout seul les envois des packs (c'est le but).

Si des erreurs surviennent, le script continue au pack suivant ou bien se termine (en fontion du type d'erreur)
Une erreur de transfert entraine une re-demande du pack en question (qui se mettra en queue). Au bout de 3 echecs consécutifs* sur un meme fichier le script passe au pack suivant en notifiant le numéro du pack incriminé.
(*c'est a dire sans que mirc ne recoive un fichier sans erreur entre temps)

Le script fonctionne sur plusieurs XDCC et sur plusieurs serveurs en meme temps.

On arrete le script comme ceci : /catch_stop NICK
Si aucun nick n'est spécifié, l'arret concerne tous les nicks sur lequel le script a été lancé.
Par contre, cela ne stoppe pas les envois en cours (ni les queues si aucun nick n'a été spécifié)

Bien entendu, il n'est pas a l'abris de bugs divers. Si vous en trouvez, merci de m'en faire part :)

Source / Exemple :


;#XDCC Files Catcher (pour iroffer seulement)

;----------------------------------
;|		ALIASES		|
;----------------------------------

;1. Procedure de lancement du script
;------------------------------------

alias xc { xdcccatch $1 $2 $3 }

alias xdcccatch {
  if ( $1 && $2 && $3 ) { 
    IAL on
    userhost $1
    echo -de 15Lancement du 10XDCCcatcher 15sur10 $1 15pour les packs10 $2 15à10 $3 
    set $+(%,$1,.catcher) $2
    set $+(%,$1,.catcher_send) [ [ $+(%,$1,.catcher) ] ]
    set $+(%,$1,.catcher_queue) [ [ $+(%,$1,.catcher) ] ] + 1
    set $+(%,$1,.catcher_fin) $3
    set $+(%,$1,.catcher_debut)
    timer. $+ $1 1 2 catch $1 
  }
  else {
    echo -de 4Une erreur est survenue :12 Syntaxe incorrecte.
    echo -d 4RAPPELS:
    echo -d 4/xdcccatch NICK P1 P2 ou /xc NICK P1 P2
    echo -d 4,0 NICK0,0____4,0Nickname du bot ou de la personne distribuant les packs
    echo -d 4,0 P10,0______4,0Premier pack à télécharger
    echo -d 4,0 P20,0______4,0Dernier pack à telécharger
    echo -d 4Tous les champs doivent être remplis.
  }
  halt
}

;2. Demande des packs
;---------------------

alias -l catch {
  if ( [ [ $+(%,$1,.catcher) ] ] <= [ [ $+(%,$1,.catcher_fin) ] ] ) {
    if ( $ial($1,0) != 0 ) {
      ctcp $1 xdcc send $+($chr(35),[ [ $+(%,$1,.catcher) ] ])
      if ( $var($+(%,$1,.catcher_debut)) != 0 ) {
        set $+(%,$1,.catcher) [ [ $+(%,$1,.catcher_queue) ] ]
        unset $+(%,$1,.catcher_debut)
      }
    }
    else {
      set $+(%,error.,$1,.catcher) Le nick $1 n'existe pas.
      error_disp $1
    }
  }
  return
}

;3. Arret d'une partie ou du script entier.
;-------------------------------------------

alias -l rm_var {
  if ( $1 != $null ) {
    unset $+(%,*,$1,*catcher*)
  }
  else {
    unset $+(%,*catcher*)
  }
  return
}

alias catch_stop {
  if ( $1 != $null ) {
    msg $1 xdcc remove
    rm_var $1
    echo -de 10XDCC-catcher 15from $1 Halted
    if ( $var(*catcher*) == 0 ) {
      goto end_stop
    }
    halt
  }
  else {
    rm_var 
  }
  :end_stop
  echo -de 10XDCC-catcher 15Halted
  halt
}

;4. Redemarrage du script en cas de deconnection du bot
;-------------------------------------------------------

alias -l restart_catch {
  set $+(%,$1,.catcher) $2
  set $+(%,$1,.catcher_send) $2
  set $+(%,$1,.catcher_queue) $3
  set $+(%,$1,.catcher_fin) $4
  catch $1
  unset $+(%,quit,$1)
  halt
}

;5. Affichage des erreurs
;-------------------------

alias -l error_disp {
  echo -de 4Une erreur est survenue :12 [ [ $+(%,error.,$1,.catcher) ] ]
  catch_stop $1
  halt
}

;6. Cacul du pack suivant à télécharger
;---------------------------------------

alias -l sup {
  if ( $1 > $2 ) { return $1 }
  else { return $2 }
}

alias -l s_q_recepOK {
  var %x = [ [ $+(%,$1,.catcher_queue) ] ]
  set $+(%,$1,.catcher_queue) $sup([ [ $+(%,$1,.catcher_queue) ] ],[ [ $+(%,$1,.catcher_send) ] ])
  inc $+(%,$1,.catcher_queue)
  if ( [ [ $+(%,$1,.catcher_send) ] ] <= [ [ $+(%,$1,.catcher_fin) ] ] ) { 
    set $+(%,$1,.catcher_send) %x
  }
  return [ [ $+(%,$1,.catcher_queue) ] ]
}

alias -l s_q_recepFAIL {
  if ( [ [ $+(%,$1,.catcher_send) ] ] > [ [ $+(%,$1,.catcher_fin) ] ] ) { goto end_recepFAIL }
  else {
    var %x = [ [ $+(%,$1,.catcher_queue) ] ]
    set $+(%,$1,.catcher_queue) [ [ $+(%,$1,.catcher_send) ] ]
    set $+(%,$1,.catcher_send) %x
    set $+(%,$1,.catcher) [ [ $+(%,$1,.catcher_queue) ] ]
  }
  :end_recepFAIL
  return
}

;7. Divers
;-----------

alias -l dl_en_cours {
  set $+(%,error.,$1,.catcher) Vous avez déjà un téléchargement en cours depuis $1 ( terminez d'abord le transfert puis essayez à nouveau )
  msg $1 xdcc remove
  error_disp $1
  return
} 

alias -l calcul_counter {
  if ( [ [ $+(%,$1,.catcher_send) ] ] <= [ [ $+(%,$1,.catcher_fin) ] ] ) {
  return [ [ $+(%,$1,.catcher_send) ] ] }
  else { return [ [ $+(%,$1,.catcher_queue) ] ] }
}

;----------------------------------
;|		Events			|
;----------------------------------

;1. Deconnection/Fermeture de mIRC
;----------------------------------

on *:DISCONNECT:{
  catch_stop
  halt
}

on *:EXIT:{
  catch_stop
  unset %quit*
  halt
}

;2. Le bot est deconnecté ou rejoint le salon
;---------------------------------------------

on *:QUIT:{
  if ( $var($+(%,$nick,.catcher)) != 0 ) {
    set $+(%,quit,$nick) $nick [ [ $+(%,$nick,.catcher_send) ] ] [ [ $+(%,$nick,.catcher_queue) ] ] [ [ $+(%,$nick,.catcher_fin) ] ]
    catch_stop $nick
  }
  halt
}

on *:JOIN:#:{
  if ( $var($+(%,quit,$nick)) != 0 ) {
    restart_catch [ [ $+(%,quit,$nick) ] ]
  }
  halt
}

;3. Transfert d'un fichier terminé
;----------------------------------

on *:FILERCVD:*:{
  if ( $var($+(%,$nick,.catcher)) != 0 ) {
    set $+(%,$nick,.catcher) $s_q_recepOK($nick)
    unset $+(%,$nick,.,*,.catcher.counter)
  }
  if ( ( [ [ $+(%,$nick,.catcher_queue) ] ] > [ [ $+(%,$nick,.catcher_fin) ] ] ) && ( [ [ $+(%,$nick,.catcher_send) ] ] > [ [ $+(%,$nick,.catcher_fin) ] ] ) ) {
    echo -de 10XDCCcatcher 15a terminé de télécharger vos fichiers depuis $+($nick,.)
    catch_stop $nick
  }
  halt
}

;4. Transfert d'un fichier incomplet
;------------------------------------

on *:GETFAIL:*:{
  if ( $var($+(%,$nick,.catcher)) != 0 ) {
    if ( $var([ [ $+(%,$nick,.,[ [ $calcul_counter($nick) ] ],.catcher.counter) ] ]) == 0 ) {
      inc $+(%,$nick,.,[ [ $calcul_counter($nick) ] ],.catcher.counter)
    }
    else {
      set $+(%,$nick,.,[ [ $calcul_counter($nick) ] ],.catcher.counter) 0
    }
    if ( [ [ $+(%,$nick,.,[ [ $calcul_counter($nick) ] ],.catcher.counter) ] ] == 2 ) {
      echo -d 4Impossible de télécharger le pack [ [ $calcul_counter($nick) ] ]
      set $+(%,$nick,.catcher) $s_q_recepOK($nick)
      unset $+(%,$nick,.,[ [ $calcul_counter($nick) ] ],.catcher.counter)
    }
    else {
      s_q_recepFAIL $nick
    }    
  }
  halt
}

;5. Traitement des notices
;--------------------------

;a rajouter :
;min speed  requirement
;Denied, You already have 1 items queued
;Send et Queue full

on *:NOTICE:*:*:{
  if ( $var($+(%,$nick,.catcher)) != 0 ) {
    if ( Invalid Pack isin $1- ) {
      set $+(%,error.,$nick,.catcher) Numéro(s) de pack(s) incorrect(s) pour $+($nick,.) 
      error_disp $nick
      goto end_notice
    }
    elseif ( You already requested that pack isin $1- ) {
      dl_en_cours $nick
      goto end_notice
    }
    elseif ( you must be on a known channel isin $1- ) { 
      set $+(%,error.,$nick,.catcher) $nick n'est pas (ou plus) sur un channel où vous êtes présent.
      error_disp $nick
    }
    else {
      :end_notice
      halt
    }
  }
}

;6. Reception d'un DCC send
;---------------------------

on 1:DCCSERVER:send:{
  if ( $var($+(%,$nick,.catcher)) != 0 ) {
    catch $nick
  }
}

CTCP *:dcc send*:*:{
  if ( $var($+(%,$nick,.catcher)) != 0 ) {
    catch $nick
  }
}

Conclusion :


Si je ne trouve aucun bug dans son utilisation (c'est le cas pour l'instant) il n'y aura plus de mise à jour.
(meme pour les notices qui manquent car ce n'est pas dur à rajouter)

Codes Sources

A voir également

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.