Quick system : bureau sur mirc

Description

Bon, et bien voila ma dernière nouveauté ^^
Il s'agit ici d'un bureau (de résolution personnalisable) sous mIRC, ayant à peu près les mêmes fonctions que celui de windows (pas aussi complet certes)
L'intérêt ici est de pouvoir executer des commandes très rapidement en cliquant sur les icones souhaitées. Vous pouvez bien entendu ajouter vos propres icones.
La possibilité de changer l'image représentant l'icone est incluse, de même pour le fond de la picwin.
Vous pouvez personnaliser ce bureau (placer les icones ou vous voulez), et vous avez la possibilité de rajouter quelques icones préinscrites (concernant des jeux, des liens, une heure), changer le nom des icones, leur action, supprimer, copier des icones, ...

Des effets de fermeture sont inclus (il faut l'activer) : déconseillé aux machines lentes

Tapez /qs pour ouvrir le bureau (il téléchargera les fichiers requis s'il y en a)
Des sockets de téléchargement sont incluses.

Comme pour Windows, vous pouvez aligner vos icones, les classer par nom, type et date.

Des icones "cachées" peuvent-être rajoutées : le fait de taper leur nom avec la fenêtre @qs active l'executera. Il en est de même avec toutes les icones.
Tapez * pour masquer le texte (vous comprendrez en l'essayant)

Enfin, une option vous permettra de télécharger à la demande un "pack" d'icones. Cette liste peut-être mise à jour (par moi, via le site)

Le code est également composé d'un petit jeu : le but est de taper l'alphabet le plus vite possible (l'icone figure dans les icones supplémentaires)
Une horloge numérique est de la partie

Les icones qui commencent par "QS" sont protégées.

Source / Exemple :


;******************
;  Quick System
;   By ArKanis
; www.arkanis.eu
;******************
alias qs {
  if ($version < 6.14) {
    input.request.ok Veuillez mettre votre mIRC à jour afin d'utiliser cette fonctionnalité.
    return
  }
  if ($window(@qs)) {
    window -a @qs
    return
  }
  var %needed = barrelongue.bmp¥barre.bmp¥dossier.jpg¥app.jpg¥mirc.jpg¥internet.jpg¥config.jpg¥backgroundQS.jpg¥icone.jpg¥texte.jpg¥xShostingico.bmp, %t = 1, %max = $numtok(%needed,165)
  if (!$isdir(ArKanis)) mkdir $+(",$mircdir,ArKanis")
  if (!$isdir(ArKanis/Icones)) mkdir $+(",$mircdir,ArKanis/Icones")
  while %t <= %max {
    var %file = $gettok(%needed,%t,165)
    if (!$exists($+(ArKanis/Icones/,%file))) {
      hadd -m finish.dl.arka QS qs
      hadd -m queue.dl.arka $+(Script-ArKanis/,%file) ArKanis/Icones
    }
    inc %t
  }
  if ($hget(queue.dl.arka,0).item) {
    var %o = $hget(queue.dl.arka,1).item, %c = $hget(queue.dl.arka,%o)
    hdel queue.dl.arka %o
    do.dl.arka %o %c
    return
  }
  ;Pass
  var %o = $readini(Config.ini,QSConfig,VeillePass)
  if (%o) {
    unset %a %ok
    while !%ok {
      var %a = $input.request.pass(Quel est votre mot de passe ?)
      if (%a === %o) var %ok = 1
      if (!%a) var %ok = 2
    }
    if (%ok == 2) return
  }
  ;Valeurs par défaut
  var %ontop = u, %active = a, %bureau = $iif(!$readini(Config.ini,QSConfig,Bureau),l,L)
  if ($regex($1-,ontop:([^\s]+))) {
    var %ontop = $iif($regml(1),o,u)
  }
  if ($regex($1-,active:([^\s]+))) {
    var %active = $iif($regml(1),a,n)
  }
  if ($regex($1-,bureau:([^\s]+))) {
    var %bureau = $iif($regml(1),l,L)
  }
  window $+(-,%active,%ontop,BCdg0k0pRz) $+(+d,%bureau) @qs -1 -1 $qs.w(x) $qs.w(y) ArKanis/Icones/qs.ico
  var %background = $readini(Config.ini,QSConfig,Background)
  drawpic -cmns @qs 1 1  $qs.w(x) $qs.w(y) $iif($exists(%background),$+(",%background,"),ArKanis/Icones/backgroundQS.jpg)
  drawpic -nrst @qs 16777215 1 1 86 20 ArKanis/Icones/barre.bmp
  drawpic -nrst @qs 16777215 87 1 $calc($qs.w(x) - 85) 20 ArKanis/Icones/barrelongue.bmp
  drawrect -nr @qs 0 1 1 1 $calc($qs.w(x) -1) $calc($qs.w(y) -1)
  if ($window(@qsempty)) window -c @qsempty
  if ($window(@qscopy)) window -c @qscopy
  window -BCg0hk0pRz +dL @qsempty -1 -1 $qs.w(x) $qs.w(y)
  drawcopy @qs 0 0 $qs.w(x) $qs.w(y) @qsempty 0 0
  if ($hget(QSPos)) hfree QSPos
  if ($hget(QS)) hfree QS
  hmake QSPos 10
  writeini -n Config.ini QSDo General action.general
  writeini -n Config.ini QS General 01/01/1970 01:00:00 !
  writeini -n Config.ini QSConfig Balle 0
  if (!$readini(Config.ini,QSicones,General)) writeini -n Config.ini QSicones General Icone:ArKanis/Icones/config.jpg Position:30|30
  hload -i QSPos Config.ini QSIcones
  qs.sorticones
  if (%list) hadd -m QS List %list
  qs.draw.icones disp
  window -BCg0hk0pRz +dL @qscopy -1 -1 $qs.w(x) $qs.w(y)
  drawdot @qs
  drawcopy @qs 0 0 $qs.w(x) $qs.w(y) @qscopy 0 0
  if ($readini(Config.ini,QSConfig,Veille) > 0) .timerqsveille 1 $calc($ifmatch * 60) qs.veille
}
alias -l action.general {
  .timer -h 1 1 $iif($isalias(agp),agp,url -n http://arkanisfr.free.fr/ArKanis/)
}
;***
; Draw
;***
alias -l qs.draw.icones {
  if ($1 != disp) drawcopy -n @qsempty 0 0 $qs.w(x) $qs.w(y) @qs 0 0 $qs.w(x) $qs.w(y) 
  var %max = $numtok($hget(QS,List),163), %t = %max
  while %t > 0 {
    var %r = $gettok($hget(QS,List),%t,163), %u = $hget(QSPos,%r)
    if ((%r != Last) && (%r != QSBalle)) {
      var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
      if ($regex(%position,([^\s]+)\|([^\s]+))) {
        var %x = $regml(1), %y = $regml(2)
        if ((%x !isnum) || (%x > $qs.w(x))) var %x = $r(0,$calc($qs.w(x) - 52))
        if ((%y !isnum) || (%y > $qs.w(y))) var %y = $r(25,$calc($qs.w(y) - 87))
      }
      else var %x = $r(0,$calc($qs.w(x) - 52)), %y = $r(25,$calc($qs.w(y) - 52))
      var %position = %x %y
      var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
      if ((!%icone) || (!$exists($replace(%icone,¥,$chr(32))))) var %icone = ArKanis/Icones/icone.jpg
      drawrect -nr @qs 0 1 $calc(%x -1) $calc(%y -1) 52 52
      qs.pic %icone %x %y 50 50
      hadd -m QSPos %r $+(Icone:,%icone) $+(Position:,%x,|,%y)
      var %m = $iif($hget(QS,Sel) == %r,1,0), %m2 = $iif($hget(QSDo,LastName) == %r,1,0)
      if (%r == $hget(QS,Sel)) {
        var %text = $null, %max = $calc($len(%r) + 10), %lo = 1, %maxy = $calc($qs.w(y) - 43)
        while ((%lo <= %max) && (%y <= %maxy)) {
          while $width($+(%text,$mid(%r,%lo,1)),Tahoma,10,0,0) <= 50 && %lo <= %max {
            var %text = $+(%text,$mid(%r,%lo,1))
            inc %lo
          }
          if (%text) drawtext -bnr @qs $iif(%m2,12707327,16777215) $iif(%m,9835520,16419980) Tahoma 10 $calc(%x +1) $calc(%y + 51) $replace(%text,$chr(165),$chr(32))
          inc %y 10
          unset %text
        }
      }
      else {
        var %lo = 1, %max = $calc($len(%r) + 10), %text = $null, %maxlen = $iif($width(%r,Tahoma,10,0,0) > 50,38,50)
        while $width($+(%text,$mid(%r,%lo,1)),Tahoma,10,0,0) <= %maxlen && %lo <= %max {
          var %text = $+(%text,$mid(%r,%lo,1))
          inc %lo
        }
        drawtext -bnr @qs $iif(%m2,12707327,16777215) $iif(%m,9835520,16419980) Tahoma 10 $calc(%x +1) $calc(%y + 51) $iif(%maxlen == 38,$+($replace(%text,$chr(165),$chr(32)),...),$replace(%text,$chr(165),$chr(32)))
      }
      hadd -m QSClick %r %x %y 50 50
    }
    dec %t
  }
}
alias -l draw.texte.clavier {
  if ($1 != verif) {
    drawrect -nr @qs 0 1 8 $calc($qs.w(y) -32) $calc($qs.w(x) -16) 20
    drawrect -fnr @qs 14939391 1 9 $calc($qs.w(y) -31) $calc($qs.w(x) -18) 18
    if ($hget(QS,Clavier)) drawtext -cnr @qs 0 Tahoma 12 15 $calc($qs.w(y) -29) $calc($qs.w(x) -27) 20 $iif($hget(QS,ClavierSecret),$str(*,$len($hget(QS,Clavier))),$hget(QS,Clavier))
  }
  if ($mouse.key & 1) qs.draw.sel $$hget(QS,Sel)
}
alias -l qs.draw.sel {
  if ((!$1) && (!$hget(QS,Sel))) return
  var %title = $iif($1,$1,$hget(QS,Sel)), %u = $hget(QSPos,%title)
  var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
  var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
  qs.pic %icone $gettok(%position,1,124) $gettok(%position,2,124)
}
alias -l qs.pic {
  if (!$3) return
  if (!$window(@qs)) return
  var %icone = $1, %nom = $gettok($replace(%icone,\,/),-1,47)
  if ($readini(Config.ini,QSTransparence,%nom) != $null) drawpic -cmnstr @qs $ifmatch $2- $+(",$replace(%icone,¥,$chr(32)),")
  else drawpic -cmns @qs $2- $+(",$replace(%icone,¥,$chr(32)),")
}
;***
; Menu
;***
menu @qs {
  sclick:qs.sclick
  mouse:qs.mouse
  dclick:qs.dclick
  -
  ;*** Propriétés de l'icone
  $iif($qs.sclick(right) && $qs.sclick(right),Propriétés de l'icone)
  .Changer l'icone: qs.chg.img $hget(QS,Sel)
  .Renommer:qs.menu.rename.start $hget(QS,Sel)
  .Supprimer:qs.delete.icone $hget(QS,Sel)
  .Changer l'action:qs.chg.action $hget(QS,Sel)
  .Définir la transparence:qs.transparence $hget(QS,Sel)
  ;*** Propriétés de la fenêtre
  $iif(!$qs.sclick(right) && !$qs.sclick(right),Propriétés de la fenêtre)
  .Changer l'arrière plan:qs.chg.img $hget(QS,Sel)
  .$iif($readini(Config.ini,QSConfig,Start),$style(1)) Ouvrir automatiquement à l'ouverture de mIRC:qs.menu.rename.start $hget(QS,Sel)
  .Animations
  ..$iif($readini(Config.ini,QSConfig,Animate),$style(1)) Activer les animations de fermeture:qs.effects.status
  ..Changer l'image de fermeture:qs.effects.background
  .Icones supplémentaires
  ..$iif($readini(Config.ini,QSConfig,Jeux),$style(1)) Ajouter les jeux:qs.icones.disp Jeux
  ..$iif($readini(Config.ini,QSConfig,Liens),$style(1)) Ajouter les liens utiles:qs.icones.disp Liens
  ..$iif($readini(Config.ini,QSConfig,Serveurs),$style(1)) Ajouter les icones Serveurs:qs.icones.disp Serveurs
  ..$iif($readini(Config.ini,QSConfig,Divers),$style(1)) Divers:qs.icones.disp Divers
  ..Balle
  ...$iif($readini(Config.ini,QSConfig,Balle) && !$timer(qs.balle),$style(1)) Afficher:qs.balle
  ...Definir sa couleur de transparence:qs.transparence QSBalle
  ...Changer l'icone:qs.chg.img QSBalle
  ...Changer l'action:{
    var %action = $input.request(Action à réaliser ?)
    if (!%action) return
    writeini -n Config.ini QSDo QSBalle %action
  }
  .$iif(!$readini(Config.ini,QSConfig,Bureau),$style(1)) Mettre @QS dans la barre des tâches:qs.taskbar $readini(Config.ini,QSConfig,Bureau)
  .$iif(!$hget(QS,Sel),Image de veille)
  ..$iif($readini(Config.ini,QSConfig,Veille),$style(1) Activer au bout de ... $ifmatch minutes,Activer au bout de ...)  :{
    var %t = $input.request(Activer au bout de combien de minutes ? 0 Pour desactiver)
    if (%t >= 0) writeini -n Config.ini QSConfig Veille %t
    if (%t > 0) .timerqsveille 1 $calc(%t * 60) qs.veille
  }
  ..$iif($readini(Config.ini,QSConfig,VeilleBalle),$style(1)) Ajouter la balle: qs.veille.balle
  ..Changer l'image de veille: qs.chg.img Veille
  ..Activer l'écran de veille:.timerqsveille 1 2 qs.veille
  ..$iif($readini(Config.ini,QSConfig,VeillePass),$style(1))  A la reprise, protéger par mot de passe:qs.veille.pass
  .Résolution
  ..Personnaliser:qs.resol $input.request(Largeur (horizontal), comprise entre 400 et 2000) $input.request(Hauteur (vertical), comprise entre 300 et 2000)
  ..-
  ..640*480:qs.resol 640 480
  ..800*600:qs.resol 800 600
  ..1024*768:qs.resol 1024 768
  ..1280*1024:qs.resol 1280 1024
  ..1600*1200:qs.resol 1600 1200
  ;***
  $iif($hget(QS,Sel),Copier,$iif(!$hget(QS,Copy),$style(2)) Coller) : qs.c-c $hget(QS,Sel)
  -
  $iif(!$hget(QS,Sel),Réorganiser les icones)
  .$iif($readini(Config.ini,QSConfig,Aligner),$style(1)) Aligner:{
    writeini -n Config.ini QSConfig Aligner $iif($readini(Config.ini,QSConfig,Aligner),0,1)
    if ($readini(Config.ini,QSConfig,Aligner)) qs.align
  }
  .$iif($readini(Config.ini,QSConfig,Fixer),$style(1)) Fixer les icones:writeini -n Config.ini QSConfig Fixer $iif($readini(Config.ini,QSConfig,Fixer),0,1)
  .$iif(!$readini(Config.ini,QSConfig,Aligner),$style(2)) Réorganiser par
  ..$iif($readini(Config.ini,QSConfig,Sort) == Nom,$style(1)) Nom:writeini -n Config.ini QSConfig Sort Nom | if ($readini(Config.ini,QSConfig,Aligner)) qs.sorticones
  ..$iif($readini(Config.ini,QSConfig,Sort) == Type || !$readini(Config.ini,QSConfig,Sort),$style(1)) Type:writeini -n Config.ini QSConfig Sort Type | if ($readini(Config.ini,QSConfig,Aligner)) qs.sorticones
  ..$iif($readini(Config.ini,QSConfig,Sort) == Date,$style(1)) Date:writeini -n Config.ini QSConfig Sort Date | if ($readini(Config.ini,QSConfig,Aligner)) qs.sorticones
  $iif(!$hget(QS,Sel),Nouveau)
  .Fichier Texte:qs.addtext
  .Dossier:qs.addfolder
  .Raccourci
  ..ArKanis:qs.addicone ArKanis icone.jpg
  ..mIRC:qs.addicone mIRC mirc.jpg
  ..Application:qs.addicone Application app.jpg
  ..URL:qs.addicone URL internet.jpg
  ..Caché (taper le nom sur le clavier vous fera l'ouvrir):qs.addcache
  .-
  $iif(!$hget(QS,Sel),Télécharger le pack d'icones supplémentaires):qs.dl.pack
  -
  Fermer:qs.close
}
alias -l qs.resol {
  if (($1 isnum 400-2000) && ($2 isnum 300-2000)) {
    writeini -n Config.ini QSConfig WindowX $round($1,0)
    writeini -n Config.ini QSConfig WindowY $round($2,0)
    window -c @qs
    .timer -h 1 500 qs
  }
}
alias -l qs.taskbar {
  writeini -n Config.ini QSConfig Bureau $iif($readini(Config.ini,QSConfig,Bureau),0,1)
  input.request.ok Vous aurez besoin de redémarrer la fenêtre pour observer les changements.
}
alias -l qs.chg.img {
  if (($1) && ($1 != Veille)) {
    var %title = $1, %u = $hget(QSPos,%title), %fol = $iif($isdir(ArKanis/Icones),$+($mircdir,ArKanis/Icones/),$mircdir)
    var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
    var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
    hadd -m QSSel Nom %title
    qs.icones.sel
  }
  else {
    var %img = $sfile($mircdir,Image 800*600,Sélectionner)
    if ((!$exists(%img)) || (!%img)) return
    if ($1 == Veille) {
      if (!$input.request.y.n(Etes-vous sûr(e) de vouloir choisir %img en tant qu'image de veille ?)) return
      writeini -n Config.ini QSConfig VeilleImg %img
    }
    else {
      if (!$input.request.y.n(Etes-vous sûr(e) de vouloir choisir %img en tant qu'image de fond ?)) return
      writeini -n Config.ini QSConfig Background %img
      window -c @qs
      .timer -h 1 500 qs
    }
    qs.save
  }
}
alias -l qs.menu.rename.start {
  if ($1) {
    if (($left($1,2) == QS) || ($1 == General)) {
      input.request.ok Impossible de renommer ces icones
      return
    }
    var %nom = $1, %nom2 = $input.request(Quel sera le nouveau nom de $+(",$1,") ?)
    if (!%nom2) return
    if (!$input.request.y.n(Etes-vous sûr(e) de vouloir changer le nom de %nom ?)) return
    if (%nom == %nom2) return
    hadd -m QSPos %nom2 $hget(QSPos,%nom)
    hadd -m QS List $reptok($hget(QS,List),%nom,%nom2,1,167)
    hdel QSPos %nom
    var %r = $readini(Config.ini,QS,%nom)
    writeini -n Config.ini QS %nom2 $iif($numtok(%r,32) == 3,%r,$asctime(dd/mm/yyyy HH:nn:ss) Divers)
    if (%r) remini Config.ini QS %nom
    qs.save
    qs.sorticones
    qs.draw.icones
    drawdot @qs
  }
  else writeini -n Config.ini QSConfig Start $iif($readini(Config.ini,QSConfig,Start),0,1)
}
alias -l qs.delete.icone {
  if (!$1) return
  var %nom = $1
  if (!$input.request.y.n(Etes-vous sûr(e) de vouloir supprimer l'icone $replace(%nom,¥,$chr(32)) ?)) return
  hadd -m QS List $remtok($hget(QS,List),%nom,1,167)
  if ($hget(QSPos,%nom)) hdel QSPos %nom
  if ($readini(Config.ini,QS,%nom)) remini Config.ini QS %nom
  qs.save
  qs.sorticones
  qs.draw.icones
  drawdot @qs
}
alias -l qs.effects.status writeini -n Config.ini QSConfig Animate $iif($readini(Config.ini,QSConfig,Animate),0,1)
alias -l qs.chg.action {
  if (($left($1,2) == QS) || ($1 == General)) {
    input.request.ok Impossible de changer l'action de ces icones
    return
  }
  if ($1) {
    var %nom = $1, %action = $input.request(Action à réaliser ?)
    if (!%action) return
    writeini -n Config.ini QSDo %nom %action
  }
}
alias -l qs.icones.disp {
  if (!$1) return
  writeini -n Config.ini QSConfig $1 $iif($readini(Config.ini,QSConfig,$1),0,1)
  if ($1 == Jeux) {
    if ($readini(Config.ini,QSConfig,$1)) {
      var %icone = $iif($exists(ArKanis/Icones/lettres.jpg),ArKanis/Icones/lettres.jpg,ArKanis/Icones/icone.jpg), %x = $r(25,775), %y = $r(25,525)
      hadd -m QSPos QSAlphabet $+(Icone:,%icone) $+(Position:,%x,|,%y)
      writeini -n Config.ini QSIcones QSAlphabet $hget(QSPos,QSAlphabet)
      writeini -n Config.ini QS QSAlphabet $asctime(dd/mm/yyyy HH:nn:ss) !
      writeini -n Config.ini QSDo QSAlphabet qs.alphabet
      if ($isalias(bombe.cfg)) {
        var %icone = $iif($exists(ArKanis/Icones/bombe.jpg),ArKanis/Icones/bombe.jpg,ArKanis/Icones/icone.jpg), %x = $r(25,775), %y = $r(25,525)
        hadd -m QSPos QSBombe $+(Icone:,%icone) $+(Position:,%x,|,%y)
        writeini -n Config.ini QSIcones QSBombes $hget(QSPos,QSBombe)
        writeini -n Config.ini QS QSBombe $asctime(dd/mm/yyyy HH:nn:ss) !
        writeini -n Config.ini QSDo QSBombe bombe.cfg
      }
      if ($isalias(sudoku)) {
        var %icone = $iif($exists(ArKanis/Icones/sudoku.bmp),ArKanis/Icones/sudoku.bmp,ArKanis/Icones/icone.jpg), %x = $r(25,775), %y = $r(25,525)
        hadd -m QSPos QSSudoku $+(Icone:,%icone) $+(Position:,%x,|,%y)
        writeini -n Config.ini QSIcones QSSudoku $hget(QSPos,QSSudoku)
        writeini -n Config.ini QS QSSudoku $asctime(dd/mm/yyyy HH:nn:ss) !
        writeini -n Config.ini QSDo QSSudoku Sudoku
      }
    }
    else {
      if ($hget(QSPos,QSAlphabet)) hdel QSPos QSAlphabet
      if ($readini(Config.ini,QS,QSAlphabet)) remini Config.ini QS QSAlphabet
      if ($readini(Config.ini,QSDo,QSAlphabet)) remini Config.ini QSDo QSAlphabet
      if ($hget(QSPos,QSBombe)) hdel QSPos QSBombe
      if ($readini(Config.ini,QS,QSBombe)) remini Config.ini QS QSBombe
      if ($readini(Config.ini,QSDo,QSBombe)) remini Config.ini QSDo QSBombe
      if ($hget(QSPos,QSSudoku)) hdel QSPos QSSudoku
      if ($readini(Config.ini,QS,QSSudoku)) remini Config.ini QS QSSudoku
      if ($readini(Config.ini,QSDo,QSSudoku)) remini Config.ini QSDo QSSudoku
    }
    qs.draw.icones
    drawcopy -n @qs 0 0 $qs.w(x) $qs.w(y) @qscopy 0 0 $qs.w(x) $qs.w(y) 
    drawdot @qs
  }
  elseif ($istok(Liens-Divers-Serveurs,$1,45)) {
    unset %alias
    if ($1 == Liens) var %icones = ArKanis/Icones/internet.jpg, %files = ArKanis£http://arkanisfr.free.fr/ArKanis/¥ircFR£www.ircfr.com£ircfr¥Quakenet£www.quakenet.eu.org£qnet, %alias = url -n
    elseif ($1 == Divers) var %icones = ArKanis/Icones/disquette.jpg, %files = Heure£qs.clock£clock.bmp¥BotWar£botwar£botwar.bmp¥Veille£qs.veille£screen.bmp¥Manager£manager£calendrier.bmp
    elseif ($1 == Serveurs) var %icones = ArKanis/Icones/xShostingico.bmp, %files = xShosting£url -n http://www.xShoting.org¥FAQ£url -n http://xshosting.org/FAQ/¥Ajouter©un©serveur£qs.add.multiserv¥Connection©à©un©serveur£qs.multiserv.connect
    var %max = $numtok(%files,165), %t = 1
    if ($readini(Config.ini,QSConfig,$1)) {
      while %t <= %max {
        var %act = $gettok(%files,%t,165),%nom = $replace($+(QS,$gettok(%act,1,163)),©,¥), %f = $gettok(%act,3,163)
        if ((%nom == manager) && (!$isalias(manager))) unset %nom
        elseif (%f) {
          if ($mid(%f,-4,1) == $chr(46)) var %u = $+(ArKanis/Icones/,%f)
          else var %u = $+(ArKanis/Icones/,%f,.jpg)
          if ($exists(%u)) var %icone = %u
        }
        else var %icone = %icones
        var %x = $r(25,725), %y = $r(25,525)
        hadd -m QSPos %nom $+(Icone:,%icone) $+(Position:,%x,|,%y)
        writeini -n Config.ini QSIcones %nom $hget(QSPos,%nom)
        writeini -n Config.ini QS %nom $asctime(dd/mm/yyyy HH:nn:ss) !
        writeini -n Config.ini QSDo %nom %alias $gettok(%act,2,163)
        inc %t
      }
    }
    else {
      while %t <= %max {
        var %act = $gettok(%files,%t,165),%nom = $replace($+(QS,$gettok(%act,1,163)),©,¥)
        if ($hget(QSPos,%nom)) hdel QSPos %nom
        if ($readini(Config.ini,QS,%nom)) remini Config.ini QS %nom
        if ($readini(Config.ini,QSDo,%nom)) remini Config.ini QSDo %nom
        inc %t
      }
    }
  }
  qs.save
  qs.sorticones
  qs.draw.icones
  drawdot @qs
}
alias -l qs.c-c {
  if (($left($1,2) == QS) || ($1 == General)) {
    input.request.ok Impossible de copier ces icones
    return
  }
  if ($1) hadd -m QS Copy $1
  else {
    if (!$hget(QS,Copy)) return
    var %t = 2, %nom = $hget(QS,Copy)
    while ($readini(Config.ini,QSIcones,$+(%nom,¥,-,%t,-))) inc %t
    var %newnom = $+(%nom,$chr(165),-,%t,-)
    writeini -n Config.ini QS %newnom $iif($readini(Config.ini,QS,%nom),$ifmatch,$asctime(dd/mm/yyyy HH:nn:ss) Copy)
    if (!$regex(%newnom,[a-zA-Z0-9]|[-\.!\?¥\s\+])) {
      input.request.ok Des caractères non autorisés sont utilisés. Les seuls caractères autorisés sont les lettres, les nombres, l'espace, et + - . ! ?.
      return
    }
    if ($readini(Config.ini,QSDo,%nom)) writeini -n Config.ini QSDo %newnom $ifmatch
    unset %x %y
    if ($readini(Config.ini,QSConfig,Aligner)) {
      var %nb = $ini(Config.ini,QSIcones,0), %col = $int($calc(%nb / 8)), %x = $calc(70* %col + 70)
      var %y = $calc(%nb - %col * 6)
    }
    if (%x !isnum 25-775) var %x = $r(25,775)
    if (%y !isnum 25-575) var %y = $r(25,575)
    var %u = $hget(QSPos,%nom)
    var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
    if (!$exists(%icone)) var %icone = ArKanis/Icones/icone.jpg
    hadd -m QSPos %newnom $+(Icone:,%icone) $+(Position:,%x,|,%y)
    hadd -m QS List $iif($hget(QS,List),$+($ifmatch,£),%newnom)
    qs.save
    qs.sorticones
    qs.draw.icones
    drawdot @qs
  }
}
alias -l qs.transparence {
  if ($1) {
    var %nom = $1, %reg = $regex($hget(QSPos,%nom),Icone:([^\s]+)), %icone = $regml(1)
    if (!%icone) {
      input.request.ok Impossible de récuperer l'image de l'icone %nom
      return
    }
    if (!$input.request.y.n(Etes-vous sûr(e) de vouloir changer la couleur de transparence de l'icone $replace(%icone,¥,$chr(32)) ?)) return
    var %nom = $gettok($replace(%icone,\,/),-1,47)
    var %o = $readini(Config.ini,QSTransparence,%nom)
    if (%o != $null) {
      if ($input.request.y.n(Voulez-vous supprimer la transparence actuelle ?)) { remini Config.ini QSTransparence %nom | return }
    }
    var %r = $input.request(Couleur rouge ? de 0 à 255), %v = $input.request(Couleur verte ? de 0 à 255), %b = $input.request(Couleur bleue ? de 0 à 255)
    if (%r !isnum 0-255) return
    if (%v !isnum 0-255) return
    if (%b !isnum 0-255) return
    var %rgb = $rgb(%r,%v,%b)
    if (%rgb !isnum 0-16777215) {
      input.request.ok Erreur : les couleurs sont invalides.
      return
    }
    writeini -n Config.ini QSTransparence %nom %rgb
    qs.save
    qs.sorticones
    qs.draw.icones
    drawdot @qs
  }
}
;***
; Clavier
;***
on *:keydown:@qs:*:{
  if ($hget(QS,Veille)) {
    var %o = $readini(Config.ini,QSConfig,VeillePass)
    if (%o) {
      unset %a %ok
      while !%ok {
        var %a = $input.request.pass(Quel est votre mot de passe ?)
        if (%a === %o) var %ok = 1
        if (!%a) var %ok = 2
      }
      if (%ok == 2) return
    }
    hdel QS Veille
    if ($readini(Config.ini,QSConfig,VeilleBalle)) .timerqs.balle off
    drawcopy @qscopy 0 0 $qs.w(x) $qs.w(y) @qs 0 0
  }
  if ($readini(Config.ini,QSConfig,Veille) > 0) .timerqsveille 1 $calc($ifmatch * 60) qs.veille
  unset %q
  if ($regex($keychar,[a-zA-Z0-9]|[-\.!\?¥\s\+])) {
    if ($hget(QSAlphabet,On)) {
      if (!$window(@alphabet)) return
      if (!$hget(QSAlphabet,Last)) {
        if ($keychar == a) {
          hadd -m QSAlphabet Last $keyval
          hadd -m QSAlphabet Time $ticks
          hadd -m QSAlphabet Error 0
          drawrect -frn @alphabet 16777215 1 0 0 100 100
          drawtext -or @alphabet 13150890 Tahoma 50 30 10 $upper($chr($calc($asc($keychar) + 1)))
          drawdot @alphabet
          hadd -m QSAlphabet Seq $keychar
        }
      }
      else {
        hadd -m QSAlphabet Seq $+($hget(QSAlphabet,Seq),$keychar)
        if ($keyval == $calc($hget(QSAlphabet,Last) +1)) {
          hadd -m QSAlphabet Last $keyval
          if ($keychar == z) qs.alphabet.end $calc($ticks - $hget(QSAlphabet,Time))
          else {
            drawrect -frn @alphabet 16777215 1 0 0 100 100
            drawtext -or @alphabet 13150890 Tahoma 50 30 10 $upper($chr($calc($asc($keychar) + 1)))
            drawdot @alphabet
          }
        }
        else hinc QSAlphabet Error
      }
      return
    }
    if ($keyval == 13) {
      qs.clavier $iif($hget(QS,Clavier),$ifmatch,$hget(QSDo,LastName))
      return
    }
    if ($keyval == 9) return
    if ($keyval == 32) hinc QS Space
    else {
      hadd -m QS Clavier $+($hget(QS,Clavier),$iif($hget(QS,Space),$str($chr(32),$ifmatch)),$keychar)
      hadd -m QS Space 0
    }
    .timerqs.clavier 1 2 qs.clavier $hget(QS,Clavier)
    var %q = 1
  }
  if ($keychar == *) {
    if (!$hget(QS,ClavierSecret)) {
      hadd -m QS ClavierSecret 1
      if ($hget(QS,Clavier)) {
        drawrect -nr @qs 0 1 8 $calc($qs.w(y) -32) $calc($qs.w(x) -16) 20
        drawrect -fnr @qs 14939391 1 9 $calc($qs.w(y) -31) $calc($qs.w(x) -18) 18
        drawtext -cnr @qs 0 Tahoma 12 15 $calc($qs.w(y) -29) $calc($qs.w(x) -27) 20 $iif($hget(QS,ClavierSecret),$str(*,$len($hget(QS,Clavier))),$hget(QS,Clavier))
        drawdot @qs
      }
    }
  }
  if (($keyval == 8) && (!$hget(QSAlphabet,On))) {
    if ($hget(QS,Clavier)) {
      hadd -m QS Clavier $left($hget(QS,Clavier),-1)
      .timerqs.clavier 1 2 qs.clavier $hget(QS,Clavier)
      var %q = 1
    }
  }
  if (%q) {
    drawrect -nr @qs 0 1 8 $calc($qs.w(y) -32) $calc($qs.w(x) -16) 20
    drawrect -fnr @qs 14939391 1 9 $calc($qs.w(y) -31) $calc($qs.w(x) -18) 18
    if ($hget(QS,Clavier)) drawtext -cnr @qs 0 Tahoma 12 15 $calc($qs.w(y) -29) $calc($qs.w(x) -27) 20 $iif($hget(QS,ClavierSecret),$str(*,$len($hget(QS,Clavier))),$hget(QS,Clavier))
    drawdot @qs
  }
}
alias -l qs.clavier {
  .timerqs.clavier off
  if ($mouse.key & 1) {
    if (!$window(@qscopy)) return
    if (!$window(@qsempty)) return
    drawcopy -n @qscopy 0 0 $qs.w(x) $qs.w(y) @qs 0 0 $qs.w(x) $qs.w(y)
    drawcopy -n @qsempty 0 $calc($qs.w(y) - 32) $qs.w(x) 33 @qs 0 $calc($qs.w(y) - 32) $qs.w(x) 33
    var %o = $timer(qs.icone.move).com, %o = %icone = $gettok(%o,3,32), %pos = $gettok(%o,4,32), %x = $gettok(%pos,1,124), %y = $gettok(%pos,2,124)
    qs.pic %icone %x %y 50 50
    drawrect -nr @qs 0 1 $calc(%x -1) $calc(%y -1) 52 52
  }
  else {
    if (!$window(@qsempty)) return
    drawcopy -n @qsempty 8 $calc($qs.w(y) -32) $calc($qs.w(x) -16) 20 @qs 8 $calc($qs.w(y) -32) $calc($qs.w(x) -16) 20
    qs.draw.icones
  }
  draw.texte.clavier verif
  drawdot @qs
  if ($hget(QS,ClavierSecret)) hdel QS ClavierSecret
  if (!$1) return
  var %text = $replace($1-,$chr(32),$chr(165))
  if ($readini(Config.ini,QSDo,%text)) .timer -h 1 1 $ifmatch
  hdel QS Clavier
}
;***
; Effets
;***
alias -l qs.effects.background {
  if (!$input.request.y.n(Etes-vous sûr(e) de vouloir changer l'image de fond visible à la fermeture ?)) return
  var %nom = $sfile($mircdir,Image 800*600,Sélectionner)
  if (!$exists(%nom)) return
  writeini -n Config.ini QSConfig AnimateBackground %nom
}
alias -l qs.close {
  .timerqs.save off
  qs.save
  .timerqs.balle off
  .timerqsveille off
  if ($window(@alphabet)) window -c @alphabet
  if ($window(@qssel)) window -c @qssel
  if ($window(@qsempty)) window -c @qsempty
  if ($window(@qsveille)) window -c @qsveille
  var %r = $readini(Config.ini,QSConfig,AnimateBackground),%pic = $iif($exists(%r) && %r,%r,$+($mircdir,ArKanis/Icones/elishabackground.jpg))
  if (($window(@qscopy)) && ($readini(Config.ini,QSConfig,Animate)) && ($exists(%pic))) {
    drawpic -cms @qscopy 0 0 $qs.w(x) $qs.w(y) $+(",%pic,")
    var %r = $r(1,5), %timer = 0
    if (%r == 1) {
      var %h = 0, %j = 0, %maxx = $qs.w(x), %maxy = $qs.w(y)
      if ($hget(Effet1X)) hfree Effet1X
      if ($hget(Effet1Y)) hfree Effet1Y
      while ((%h <= %maxx) || (%j <= %maxy)) {
        if (%h <= %maxx) hadd -m Effet1X %h 1
        if (%j <= %maxy) hadd -m Effet1Y %j 1
        inc %h
        inc %j
      }
      while (($hget(Effet1X,0).item) || ($hget(Effet1Y,0).item)) {
        var %x = $hget(Effet1X,$r(1,$hget(Effet1X,0).item)).item
        if ($hget(Effet1X,%x)) hdel Effet1X %x
        var %y = $hget(Effet1Y,$r(1,$hget(Effet1Y,0).item)).item
        if ($hget(Effet1Y,%y)) hdel Effet1Y %y
        if (!%x) var %x = 0
        if (!%y) var %y = 0
        inc %timer 5
        .timerqs.effet. $+ %timer -h 1 %timer qs.effet 1 %x %y
      }
      inc %timer 500
    }
    elseif (%r == 2) {
      var %x = 1
      while %x <= $qs.w(x) {
        inc %timer 5
        .timerqs.effet. $+ %timer -h 1 %timer qs.effet 2 %x
        inc %x 5
      }
    }
    elseif (%r == 3) {
      var %y = 1
      while %y <= $qs.w(x) {
        inc %timer 5
        .timerqs.effet. $+ %timer -h 1 %timer qs.effet 3 %y
        inc %y 5
      }
    }
    elseif (%r == 4) {
      var %x1 = 0, %x2 = $qs.w(x), %y1 = 0, %y2 = $qs.w(y)
      while ((%x2 >= 0) && (%y2 >= 0)) {
        inc %timer 5
        .timerqs.effet. $+ %timer -h 1 %timer drawrect -r @qs 0 1 %x1 %y1 %x2 %y2
        inc %x1
        inc %y1
        dec %x2 2
        dec %y2 2
      }
    }
    elseif (%r == 5) {
      var %x1 = $calc($qs.w(x) /2), %x2 = 0, %y1 = $calc($qs.w(y) /2), %y2 = 0
      while ((%x1 >= 0) || (%y1 >= 0)) {
        inc %timer
        .timerqs.effet. $+ %timer -h 1 %timer drawcopy @qscopy %x1 %y1 %x2 %y2 @qs %x1 %y1 %x2 %y2
        dec %x1 2
        dec %y1 2
        inc %x2 4
        inc %y2 4
      }
    }
    inc %timer 500
    .timer -h 1 %timer window -c @qs
  }
  else window -c @qs
  .timer -h 1 $calc($iif(%timer isnum,%timer,0) + 500) if ($window(@qscopy)) window -c @qscopy
}
alias -l qs.effet {
  if (!$window(@qs)) return
  if ($1 == 1) {
    var %x = $2, %y = $3
    drawcopy -n @qscopy %x 0 1 $qs.w(y) @qs %x 0 1 $qs.w(y)
    drawcopy -n @qscopy 0 %y $qs.w(x) 1 @qs 0 %y $qs.w(x) 1
    drawdot @qs
  }
  elseif ($1 == 2) {
    if (!$2) return
    var %x = $2
    drawcopy -n @qscopy %x 0 5 $qs.w(y) @qs %x 0 5 $qs.w(y)
    drawdot @qs
  }
  elseif ($1 == 3) {
    if (!$2) return
    var %y = $2
    drawcopy -n @qscopy 0 %y $qs.w(x) 5 @qs 0 %y $qs.w(x) 5
    drawdot @qs
  }
}
;***
; Opérations sur les icones
;***
alias -l qs.sorticones {
  var %r = $readini(Config.ini,QSConfig,Sort)
  if (!$istok(Nom-Type-Date,%r,45)) var %r = Type
  if (%r == Nom) {
    var %t = 1, %max = $hget(QSPos,0).item, %list = $null
    while %t <= %max {
      var %list = $+(%list,$iif(%list,£),$hget(QSPos,%t).item))
      inc %t
    }
    var %list = $sorttok(%list,163)
  }
  elseif (%r == Type) {
    var %t = 1, %max = $hget(QSPos,0).item, %list = $null, %list2 = $null
    while %t <= %max {
      var %ti = $hget(QSPos,%t).item
      var %list2 = $+(%list2,$iif(%list2,£),$iif($gettok($readini(Config.ini,QS,%ti),3,32),$ifmatch,z),§,%ti)
      inc %t
    }
  }
  elseif (%r == Date) {
    var %t = 1, %max = $hget(QSPos,0).item, %list = $null, %list2 = $null
    while %t <= %max {
      var %ti = $hget(QSPos,%t).item, %list2 = $+(%list2,$iif(%list2,£),$iif($time($gettok($readini(Config.ini,QS,%ti),1-2,32)),$ifmatch,$ctime),§,%ti)
      inc %t
    }
  }
  if ($istok(Date-Type,%r,45)) {
    var %list2 = $sorttok(%list2,163)
    var %t = 1, %max = $numtok(%list2,163)
    while %t <= %max {
      var %list = $+(%list,$iif(%list,£),$gettok($gettok(%list2,%t,163),2,167))
      inc %t
    }
  }
  hadd -m QS List %list
  qs.align
}
alias -l qs.align {
  if (!$readini(Config.ini,QSConfig,Aligner)) return
  var %t = 1, %max = $numtok($hget(QS,List),163), %ligne = 0, %colonne = 1
  while %t <= %max {
    var %nom = $gettok($hget(QS,List),%t,163), %u = $hget(QSPos,%nom)
    var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
    inc %ligne
    if (%ligne > 8) { inc %colonne | var %ligne = 1 }
    hadd -m QSPos %nom $+(Icone:,%icone) $+(Position:,$calc(%colonne * 80 - 50),|,$calc(%ligne * 70 - 40))
    inc %t
  }
  qs.draw.icones
  drawdot @qs
}
;***
; Ajouts
;***
alias -l qs.addcache {
  var %nom = $replace($input.request(Nom du fichier caché ?),$chr(32),¥)
  if (($left(%nom,2) == QS) || (%nom == General)) {
    input.request.ok Votre fichier ne peut commencer par QS (nom réservé).
    return
  }
  if ($len(%nom) > 20) {
    input.request.ok Veuillez choisir un nom d'icone plus court (max 20 caractères).
    return
  }
  if (!$regex(%nom,^[a-zA-Z0-9]|[-\.!\?¥\s\+]$)) {
    input.request.ok Des caractères non autorisés sont utilisés. Les seuls caractères autorisés sont les lettres, les nombres, l'espace, et + - . ! ?.
    return
  }
  if ($readini(Config.ini,QSDo,%nom)) {
    input.request.ok Ce nom existe déjà. Veuillez en choisir un autre.
    return
  }
  var %action = $input.request(Alias à executer ? (run ..., away, msg, ...))
  if (!%action) return
  writeini -n Config.ini QSDo %nom %action
  writeini -n Config.ini QS %nom $asctime(dd/mm/yyyy HH:nn:ss) Cache
}
alias -l qs.addicone {
  var %type = $iif($1,$1,Divers), %nom = $replace($input.request(Nom du raccourci ?),$chr(32),¥)
  if (($left(%nom,2) == QS) || (%nom == General)) {
    input.request.ok Votre raccourci ne peut commencer par QS (nom réservé).
    return
  }
  if ($len(%nom) > 20) {
    input.request.ok Veuillez choisir un nom d'icone plus court (max 20 caractères).
    return
  }
  if ($readini(Config.ini,QSIcones,%nom)) {
    if (!$input.request.y.n(Ce nom existe déjà, continuer ?)) return
  }
  if (!$regex(%nom,[a-zA-Z0-9]|[-\.!\?¥\s\+])) {
    input.request.ok Des caractères non autorisés sont utilisés. Les seuls caractères autorisés sont les lettres, les nombres, l'espace, et + - . ! ?.
    return
  }
  if (!%nom) return
  if ($1 == URL) var %action = url -n $$input.request(Page à ouvrir ?)
  elseif ($1 == Application) var %action = run $$sfile(c:\,Application,Sélectionner)
  else var %action = $input.request(Alias à executer ? (run ..., away, msg, ...))
  if (!%action) return
  unset %x %y
  if ($readini(Config.ini,QSConfig,Aligner)) {
    var %nb = $ini(Config.ini,QSIcones,0), %col = $int($calc(%nb / 10)), %x = $calc(70* %col + 70)
    var %y = $calc(%nb - %col * 10)
  }
  if (%x !isnum $+(25-,$calc($qs.w(x) - 27))) var %x = $r(25,$calc($qs.w(x) - 27))
  if (%y !isnum $+(25-,$calc($qs.w(y) - 97))) var %y = $r(25,$calc($qs.w(y) - 97))
  var %icone = $iif($right($2,4) == .jpg,$2,icone.jpg)
  hadd -m QSPos %nom $+(Icone:ArKanis/Icones/,%icone) $+(Position:,%x,|,%y)
  hadd -m QS List $iif($hget(QS,List),$+($ifmatch,£),%nom)
  qs.sorticones
  qs.draw.icones
  writeini -n Config.ini QSIcones %nom $+(Icone:ArKanis/Icones/,%icone) $+(Position:,%x,|,%y)
  writeini -n Config.ini QSDo %nom %action
  writeini -n Config.ini QS %nom $asctime(dd/mm/yyyy HH:nn:ss) %type
  drawdot @qs
}
alias -l qs.addtext {
  var %nom = $remove($input.request(Nom du fichier texte ?),.txt)
  if (($left(%nom,2) == QS) || (%nom == General)) {
    input.request.ok Votre fichier texte ne peut commencer par QS (nom réservé).
    return
  }
  if ($len(%nom) > 20) {
    input.request.ok Veuillez choisir un nom d'icone plus court (max 20 caractères).
    return
  }
  if (!$regex(%nom,[a-zA-Z0-9]|[-\.!\?¥\s\+])) {
    input.request.ok Des caractères non autorisés sont utilisés. Les seuls caractères autorisés sont les lettres, les nombres, et - . ! ?.
    return
  }
  var %no = $replace(%nom,$chr(32),¥)
  if ((!%nom) || ($readini(Config.ini,QSIcones,$+(%no,.txt)))) { input.request.ok Ce nom de fichier existe déjà ! | return }
  var %no = $+(%no,.txt), %file = $+($mircdir,ArKanis/,%nom,.txt)
  var %action = run $+(",%file,")
  unset %x %y
  if ($readini(Config.ini,QSConfig,Aligner)) {
    var %nb = $ini(Config.ini,QSIcones,0), %col = $int($calc(%nb / 10)), %x = $calc(70* %col + 70)
    var %y = $calc(%nb - %col * 10)
  }
  if (%x !isnum $+(25-,$calc($qs.w(x) - 27))) var %x = $r(25,$calc($qs.w(x) - 27))
  if (%y !isnum $+(25-,$calc($qs.w(x) - 97))) var %y = $r(25,$calc($qs.w(x) - 97))
  hadd -m QSPos %no Icone:ArKanis/Icones/texte.jpg $+(Position:,%x,|,%y)
  hadd -m QS List $iif($hget(QS,List),$+($ifmatch,£),%no)
  qs.sorticones
  qs.draw.icones
  writeini -n Config.ini QSIcones %no $hget(QSPos,%no)
  writeini -n Config.ini QSDo %no %action
  writeini -n Config.ini QS %no $asctime(dd/mm/yyyy HH:nn:ss) @Texte
  if (!$exists(%file)) write -c $+(",%file,")
  run $+(",%file,")
  drawdot @qs
}
alias -l qs.addfolder {
  var %nom = $remove($input.request(Nom du dossier ?),.txt)
  if (($left(%nom,2) == QS) || (%nom == General)) {
    input.request.ok Votre dossier ne peut commencer par QS (nom réservé).
    return
  }
  if ($len(%nom) > 20) {
    input.request.ok Veuillez choisir un nom d'icone plus court (max 20 caractères).
    return
  }
  if (!$regex(%nom,[a-zA-Z0-9]|[-\.!\?¥\s\+])) {
    input.request.ok Des caractères non autorisés sont utilisés. Les seuls caractères autorisés sont les lettres, les nombres, et - . ! ?.
    return
  }
  var %no = $replace(%nom,$chr(32),¥)
  if ((!%nom) || ($readini(Config.ini,QSIcones,%no))) { input.request.ok Ce nom de dossier existe déjà ! | return }
  var %folder = $+(ArKanis\,%nom), %fol = $+(",$mircdir,%folder,"), %action = run %fol
  unset %x %y
  if ($readini(Config.ini,QSConfig,Aligner)) {
    var %nb = $ini(Config.ini,QSIcones,0), %col = $int($calc(%nb / 10)), %x = $calc(70* %col + 70)
    var %y = $calc(%nb - %col * 10)
  }
  if (%x !isnum $+(25-,$calc($qs.w(x) - 27))) var %x = $r(25,$calc($qs.w(x) - 27))
  if (%y !isnum $+(25-,$calc($qs.w(x) - 97))) var %y = $r(25,$calc($qs.w(x) - 97))
  hadd -m QSPos %no Icone:ArKanis/Icones/dossier.jpg $+(Position:,%x,|,%y)
  hadd -m QS List $iif($hget(QS,List),$+($ifmatch,£),%nom)
  qs.sorticones
  qs.draw.icones
  writeini -n Config.ini QSIcones %no $hget(QSPos,%no)
  writeini -n Config.ini QSDo %no %action
  writeini -n Config.ini QS %no $asctime(dd/mm/yyyy HH:nn:ss) @Dossier
  if (!$isdir(%fol)) mkdir %fol
  run $+(",$mircdir,%folder,")
  drawdot @qs
}

alias -l qs.save {
  if (!$hget(QSPos)) return
  if ($hget(QSPos,Last)) hdel QSPos Last
  hsave -i QSPos Config.ini QSIcones
}

;***
; Mouse
;***
alias -l qs.dclick {
  .timerqs.icone.move off
  var %x = $mouse.x, %y = $mouse.y
  var %t = 1, %max = $hget(QSPos,0).item
  while %t <= %max {
    var %title = $hget(QSPos,%t).item, %u = $hget(QSPos,%title)
    var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
    if ($regex(%position,([^\s]+)\|([^\s]+))) {
      var %xx = $regml(1), %yy = $regml(2)
      if ($inrect(%x,%y,%xx,%yy,50,50)) {
        var %action = $readini(Config.ini,QSDo,%title)
        if (!%action) {
          if (!$input.request.y.n(Cette icone ne mêne à aucune action. Souhaitez-vous lui en assigner une ?)) return
          var %action = $input.request(Nom de l'action ?)
          if (!%action) return
          writeini -n Config.ini QSDo %title %action
        }
        if (%title != QSBalle) {
          hadd -m QSDo LastName %title
          qs.draw.icones
        }
        drawdot @qs
        hadd -m QSDo Last %action
        .timer -h 1 1 %action
        return
      }
    }
    inc %t
  }
}
alias -l qs.sclick {
  if ($hget(QS,Veille)) {
    var %o = $readini(Config.ini,QSConfig,VeillePass)
    if (%o) {
      unset %a %ok
      while !%ok {
        var %a = $input.request.pass(Quel est votre mot de passe ?)
        if (%a === %o) var %ok = 1
        if (!%a) var %ok = 2
      }
      if (%ok == 2) return
    }
    hdel QS Veille
    if ($readini(Config.ini,QSConfig,VeilleBalle)) .timerqs.balle off
    drawcopy @qscopy 0 0 $qs.w(x) $qs.w(y) @qs 0 0 $qs.w(x) $qs.w(y)
  }
  if ($readini(Config.ini,QSConfig,Veille) > 0) .timerqsveille 1 $calc($ifmatch * 60) qs.veille
  if ($window(@qssel)) window $iif($hget(QS,OnTop,-ao),-a) @qssel
  var %qslast = $hget(QS,Sel)
  unset %passage
  if (%qslast) hdel QS Sel
  var %x = $mouse.x, %y = $mouse.y
  if ((!$readini(Config.ini,QSConfig,Fixer)) || ($1 == right)) {
    ;echo -a X : %x - Y : %y :: Longueur : $calc(%x - $iif($gettok($hget(Temp,Last),1,32),$ifmatch,0)) - Hauteur : $calc(%y - $iif($gettok($hget(Temp,Last),2,32),$ifmatch,0))
    ;hadd -m Temp Last %x %y
    var %t = 1, %max = $numtok($hget(QS,List),163)
    while %t <= %max {
      var %title = $gettok($hget(QS,List),%t,163), %u = $hget(QSPos,%title)
      var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
      if ($regex(%position,([^\s]+)\|([^\s]+))) {
        var %xx = $regml(1), %yy = $regml(2)
        var %position = %xx %yy
        if ($inrect(%x,%y,%xx,%yy,50,50)) {
          var %m2 = $iif($hget(QSDo,LastName) == %title,1,0)
          if (%title != QSBalle) {
            hadd -m QS Sel %title
            qs.draw.icones
            if ($timer(qs.clavier)) draw.texte.clavier
            drawdot @qs
            if ($1 == right) return %title
            else {
              window -BCdg0hk0pRz +dL @qscopy -1 -1 $qs.w(x) $qs.w(y)
              drawcopy @qs 0 0 $qs.w(x) $qs.w(y) @qscopy 0 0 $qs.w(x) $qs.w(y)
              if ($hget(QS,Sel)) qs.draw.sel
            }
          }
          else hadd -m QSBalle Last $mouse.x $mouse.y
          var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
          if ((!%icone) || (!$exists($replace(%icone,$chr(165),$chr(32))))) var %icone = ArKanis/Icones/icone.jpg
          .timerqs.icone.move -h 1 200 qs.icone.move %title %icone $replace(%position,$chr(32),$chr(124))
          return
        }
        elseif ($inrect(%x,%y,%xx,%yy,50,60)) {
          var %m2 = $iif($hget(QSDo,LastName) == %title,1,0)
          if (%title != QSBalle) {
            hadd -m QS Sel %title
            qs.draw.icones
            if ($timer(qs.clavier)) draw.texte.clavier
            drawdot @qs
            if ($1 == right) return
            window -BCdg0hk0pRz +dL @qscopy -1 -1 $qs.w(x) $qs.w(y)
            drawcopy @qs 0 0 $qs.w(x) $qs.w(y) @qscopy 0 0 $qs.w(x) $qs.w(y)
            if ($hget(QS,Sel)) qs.draw.sel
            qs.menu.rename.start $hget(QS,Sel)
          }
          else hadd -m QSBalle Last $mouse.x $mouse.y
          var %reg = $regex(%u,Icone:([^\s]+)), %icone = $regml(1)
          if ((!%icone) || (!$exists($replace(%icone,$chr(165),$chr(32))))) var %icone = ArKanis/Icones/icone.jpg
          .timerqs.icone.move -h 1 200 qs.icone.move %title %icone $replace(%position,$chr(32),$chr(124))
          return
        }
      }
      inc %t
    }
  }
  if ((%qslast) && (%qslast != QSBalle)) {
    var %ulast = $hget(QSPos,%qslast), %m2 = $iif($hget(QSDo,LastName) == %qslast,1,0)
    var %reglast = $regex(%ulast,Position:([^\s]+)), %positionlast = $regml(1)
    qs.draw.icones
    if ($timer(qs.clavier)) draw.texte.clavier
    drawdot @qs
  }
  drawdot @qs
  if ($1 == right) return
  if ($inrect(%x,%y,26,2,13,13)) {
    if ($hget(QS,OnTop)) { hdel QS OnTop | window -u @qs }
    else { hadd -m QS OnTop 1 | window -o @qs }
    timerontop off
  }
  elseif ($inrect(%x,%y,46,2,13,13)) window -n @qs
  elseif ($inrect(%x,%y,67,2,13,13)) url -n http://arkanisfr.free.fr/ArKanis/index.php?page=qs
  elseif ($inrect(%x,%y,5,2,13,13)) qs.close
  elseif ($inrect(%x,%y,0,0,$qs.w(x),10)) qs.move %x %y
}
alias -l qs.icone.move {
  if (!$3) return
  if ($readini(Config.ini,QSConfig,Fixer)) return
  if ($readini(Config.ini,QSConfig,Veille) > 0) .timerqsveille 1 $calc($ifmatch * 60) qs.veille
  var %x = $calc($mouse.dx - $window(@qs).dx - 25), %y = $calc($mouse.dy - $window(@qs).dy - 25), %title = $1, %icone = $2
  if (!$window(@qs)) .timerqs.icone.move off
  if ($mouse.key & 1) {
    if (%x >= $calc($qs.w(x) - 25)) var %x = $calc($qs.w(x) - 25)
    elseif (%x <= -24) var %x = -24
    if (%y >= $calc($qs.w(y) - 97)) var %y = $calc($qs.w(y) - 97)
    elseif (%y <= 25) var %y = 25
    if ($hget(QSPos,Last) == %x %y) {
      .timerqs.last -h 1 100 $!iif($hget(QSPos,Last),hdel QSPos Last,return)
      return
    }
    hadd -m QSPos Last %x %y
    .timerqs.last -h 1 100 $!iif($hget(QSPos,Last),hdel QSPos Last,return)
    hadd -m QS MoveIcone 1
    .timerqs.icone.move -h 0 0 qs.icone.move $1-2 $+(%x,$chr(124),%y)
    drawcopy @qscopy 0 0 $qs.w(x) $calc($qs.w(y) - 46) @qs 0 0
    if (%title != QSBalle) qs.pic %icone %x %y 50 50
    drawrect -nr @qs 0 1 $calc(%x -1) $calc(%y -1) 52 52
    drawdot @qs
    hadd -m QSPos %title $+(Icone:,%icone) $+(Position:,%x,$chr(124),%y)
  }
  elseif ($hget(QS,MoveIcone)) {
    if ($1 == QSBalle) {
      if ($hget(QSBalle,Last)) {
        hadd -m QSBalle MvtX $calc(($mouse.x - $gettok($hget(QSBalle,Last),1,32)) * 1 / 100)
        hadd -m QSBalle MvtY $calc(($mouse.y - $gettok($hget(QSBalle,Last),2,32)) * 1 / 75)
        .timerqs.balle -h 1 1 qs.move.balle
      }
    }
    drawcopy -n @qsempty 0 0 $qs.w(x) $qs.w(y) @qs 0 0
    hdel QS MoveIcone
    .timerqs.icone.move off
    qs.draw.icones
    if ($timer(qs.clavier)) draw.texte.clavier
    drawdot @qs
    .timerqs.save 1 60 qs.save
    ;***modifs faites
    drawcopy @qs 0 0 $qs.w(x) $calc($qs.w(y) - 46) @qscopy 0 0
  }
}
alias -l qs.mouse {
  ;non utilisé
}
alias -l qs.move {
  var %x = $mouse.dx, %y $mouse.dy
  if (!$window(@qs)) .timerqs.move off
  if ($mouse.key & 1) {
    hadd -m QS Move 1
    .timerqs.move -h 0 0 qs.move $1-
    window @qs $calc(%x - $1) $calc(%y - $2)
  }
  elseif ($hget(QS,Move)) { hdel QS Move | .timerqs.move off }
}
;***
; DL PACK
;***
alias -l qs.dl.pack {
  if (!$input.request.y.n(Télécharger le pack d'icones supplémentaires ? Elles se trouveront dans ArKanis/Icones)) return
  if (!$isdir(ArKanis)) mkdir ArKanis
  if (!$isdir(ArKanis/Icones)) mkdir ArKanis/Icones
  sockclose arka.icones.pack
  sockopen arka.icones.pack arkanisfr.free.fr 80
}
on *:sockopen:arka.icones.pack:{
  if ($sockerr) return
  sockwrite -n $sockname GET http://arkanisfr.free.fr/ArKanis/icones.php HTTP/1.0
  sockwrite -n $sockname $crlf
}
on *:sockread:arka.icones.pack:{
  var %a
  sockread %a
  if (%a) {
    tokenize 32 %a
    if (($1 == dl) && (!$exists($+(ArKanis/Icones/,$2)))) hadd -m queue.dl.arka $3 ArKanis/Icones/
  }
}
on *:sockclose:arka.icones.pack:{
  if ($hget(queue.dl.arka,0).item) {
    var %o = $hget(queue.dl.arka,1).item, %c = $hget(queue.dl.arka,%o)
    hadd -m finish.dl.arka Icones run $+($mircdir,ArKanis/Icones/)
    hdel queue.dl.arka %o
    do.dl.arka %o %c
  }
  else .timer -h 1 1 input.request.ok Vous avez déjà téléchargé toutes les images supplémentaires
}
;***
; Games
;***
alias -l qs.alphabet {
  if (!$readini(Config.ini,QSAlphabet,Record)) input.request.ok Comment ça se joue ? $crlf Il suffit simplement de taper l'alphabet dans l'ordre sur votre clavier le plus vite possible et sans se tromper.
  if (!$input.request.y.n(Etes-vous prêt(e) ? Le chronomètre commencera dès que vous aurez tapé sur A)) return
  window -bBCdoph +dL @alphabet -1 -1 100 100
  if ($hget(QS,OnTop)) window -u @qs
  window -a @qs
  drawrect -frn @alphabet 16777215 1 0 0 100 100
  drawtext -or @alphabet 13150890 Tahoma 50 30 10 A
  drawdot @alphabet
  if ($hget(QSAlphabet)) hfree QSAlphabet
  hadd -m QSAlphabet On 1
}
alias -l qs.alphabet.end {
  if ($window(@alphabet)) window -c @alphabet
  if ($hget(QS,OnTop)) window -o @qs
  var %error = $hget(QSAlphabet,Error), %seq = $hget(QSAlphabet,Seq)
  if ($hget(QSAlphabet)) hfree QSAlphabet
  if (!$1) return
  input.request.ok Vous avez fait %error $+(erreur,$iif(%erreur > 1,s)) en $+($1,ms.) Séquence tapée : %seq
  var %r = $readini(Config.ini,QSAlphabet,Record)
  if (($1 < %r) || (!%r) || ($iif(%r > 0,0,1))) {
    writeini -n Config.ini QSAlphabet Record $1
    input.request.ok Vous venez de battre votre record $iif(%r,qui était de $+(%r,ms)) ! Il est maintenant de $+($1,ms.)
  }
  else input.request.ok Votre record est actuellement de $+(%r,ms.)
}
menu @alphabet {
  sclick {
    if (!$window(@qs)) window -c @alphabet
    else window -a @qs
  }
  Fermer:{
    if ($hget(QSAlphabet)) hfree QSAlphabet
    window -c @alphabet
  }
}
;***
; Clock
;***
alias qs.clock {
  var %needed = clockbackground.bmp¥chiffres.bmp, %t = 1, %max = $numtok(%needed,165)
  if (!$isdir(ArKanis/Icones)) mkdir ArKanis/Icones
  while %t <= %max {
    var %file = $gettok(%needed,%t,165)
    if (!$exists($+(ArKanis/Icones/,%file))) {
      hadd -m finish.dl.arka QS qs
      hadd -m queue.dl.arka $+(Script-ArKanis/,%file) ArKanis/Icones
    }
    inc %t
  }
  if ($hget(queue.dl.arka,0).item) {
    var %o = $hget(queue.dl.arka,1).item, %c = $hget(queue.dl.arka,%o)
    hdel queue.dl.arka %o
    do.dl.arka %o %c
    return
  }
  if (!$window(@qsclock)) window -BCdg0hk0pRz +dL @qsclock 1 1 273 199
  if (!$window(@qsclockchiffres)) window -Bg0hk0pRz +dL @qsclockchiffres -1 -1 345 51
  drawpic -n @qsclockchiffres 1 1 ArKanis/Icones/chiffres.bmp
  window -a @qsclock
  .timerqsclock 0 1 qsclock.disp
  qsclock.disp
}
alias -l qsclock.disp {
  if (!$window(@qsclock)) { .timerqsclock off | return }
  if (!$window(@qsclockchiffres)) { .timerqsclock off | return }
  drawpic -nrt @qsclock 255 1 0 ArKanis/Icones/clockbackground.bmp
  var %time = $asctime(HH:nn), %h = $left(%time,1) $mid(%time,2,1) $mid(%time,4,1) $mid(%time,5,1), %t = 1, %pos = 55
  var %masque = 305-0-35-50|1-0-14-50|17-0-35-50|55-0-34-50|88-0-33-50|125-0-35-50|161-4-37-48|199-0-32-52|234-0-37-50|270-0-38-50
  while %t <= 5 {
    if ($mid(%time,%t,1) == 1) inc %pos 10
    inc %t
  }
  var %t = 1
  while %t <= 4 {
    var %n = $gettok(%h,%t,32), %ch = $gettok(%masque,$calc(%n + 1),124)
    drawcopy -nrt @qsclockchiffres 16777215 $replace(%ch,-,$chr(32)) @qsclock %pos 70 $gettok(%ch,3,45) $gettok(%ch,4,45)
    inc %pos $gettok(%ch,3,45)
    if (%t == 2) {
      dec %pos 10
      drawdot -nr @qsclock 12582912 5 $calc(%pos + 20) 90 $calc(%pos + 20) 110
      inc %pos 20
    }
    inc %t
  }
  drawdot @qsclock
}
menu @qsclock {
  sclick {
    echo -a $getdot(@qsclock,$mouse.x,$mouse.y)
    qsclock.move $mouse.x $mouse.y
  }
  On top
  .Oui:window -o @qsclock
  .Non:window -u @qsclock
  Fermer:{
    if ($window(@qsclockchiffres)) window -c @qsclockchiffres
    window -c @qsclock
  }
}
alias -l qsclock.move {
  if (!$2) return
  var %x = $mouse.dx, %y $mouse.dy
  if (!$window(@qsclock)) .timerqsclock.move off
  if ($mouse.key & 1) {
    .timerqsclock.move -h 0 0 qsclock.move $1-
    window @qsclock $calc(%x - $1) $calc(%y - $2)
  }
  else .timerqsclock.move off
}
;***
; Selection d'icones
;***
alias -l qs.icones.sel {
  if (!$hget(QSSel,Nom)) return
  if (!$exists(ArKanis/Icones/visio.bmp)) {
    hadd -m finish.dl.arka qssel qs.icones.sel
    dl.arkanis Script-ArKanis/visio.bmp ArKanis/Icones/
    return
  }
  if ($window(@qssel)) window -a @qssel
  else {
    var %r = $readini(Config.ini,QSConfig,LastFolder), %fol = $iif($isdir(%r),%r,$+($mircdir,ArKanis/Icones/))
    hadd -m QSSel Folder %fol
    var %max = $findfile(%fol,*,0)
    window -aBCdg0hok0pz +dL @qssel 0 0 249 199
    drawpic -cn @qssel 1 1 ArKanis/Icones/visio.bmp
    hadd -m QSSel Compteur $r(1,%max)
    ;max peut-être vide
    qssel.draw.image
  }
  if ($window(@qssel)) drawdot @qssel
}
menu @qssel {
  sclick:qssel.sclick
}
alias -l qssel.draw.image {
  var %nom = $findfile($hget(QSSel,Folder),*,$hget(QSSel,Compteur))
  unset %size
  var %size = $file(%nom).size
  drawrect -nfr @qssel 16711680 1 52 42 149 99
  if ($istok(.jpg-.bmp-.png-.gif-.ico,$right(%nom,4),45)) {
    hadd -m QSSel Image %nom
    if (%size > 300000) drawtext -nr @qssel 0 Tahoma 12 79 85 Fichier trop gros
    else {
      if (%size < 2000) drawpic -mns @qssel 76 42 99 99 $+(",%nom,")
      else drawpic -mns @qssel 52 42 149 99 $+(",%nom,")
    }
  }
  else {
    drawtext -nr @qssel 0 Tahoma 12 93 85 Pas d'image
  }
  drawdot @qssel
}
alias -l qssel.sclick {
  var %x = $mouse.x, %y = $mouse.y
  ;echo -a X : %x - Y : %y :: Longueur : $calc(%x - $iif($gettok($hget(Temp,Last),1,32),$ifmatch,0)) - Hauteur : $calc(%y - $iif($gettok($hget(Temp,Last),2,32),$ifmatch,0))
  ;hadd -m Temp Last %x %y
  if ($inrect(%x,%y,32,158,52,17)) {
    hdec -m QSSel Compteur
    if ($hget(QSSel,Compteur) <= 0) hadd -m QSSel Compteur $findfile($hget(QSSel,Folder),*,0)
    qssel.draw.image
  }
  elseif ($inrect(%x,%y,165,158,52,17)) {
    hinc -m QSSel Compteur
    if ($hget(QSSel,Compteur) > $findfile($hget(QSSel,Folder),*,0)) hadd -m QSSel Compteur 0
    qssel.draw.image
  }
  elseif ($inrect(%x,%y,89,158,31,17)) {
    if (($hget(QSSel,Image)) && ($hget(QSSel,Nom))) {
      var %img = $hget(QSSel,Image), %title = $hget(QSSel,Nom), %u = $hget(QSPos,%title)
      if (!%img) return
      if (!$exists(%img)) { input.request.ok L'image n'existe pas ! | return }
      if (!$input.request.y.n(Valider l'image %img ?)) return
      var %img = $replace(%img,$chr(32),¥)
      var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
      hadd -m QSPos %title $+(Icone:,%img) $+(Position:,%position)
      qs.save
      if (!$hget(QS,Veille)) qs.draw.icones
      drawdot @qs
      window -c @qssel
      window -a @qs
    }
    else {
      input.request.ok Vous n'avez sélectionné aucune image.
      return
    }
  }
  elseif ($inrect(%x,%y,129,158,31,17)) {
    var %r = $readini(Config.ini,QSConfig,LastFolder), %fol = 
    var %o = $sdir($iif($isdir(%r),%r,$mircdir),Changer le dossier,Sélectionner)
    if ($isdir(%o)) {
      hadd -m QSSel Folder %o
      writeini -n Config.ini QSConfig LastFolder %o
    }
    hadd -m QSSel Compteur 1
    qssel.draw.image
    drawdot @qs
  }
  elseif ($inrect(%x,%y,171,4,13,13)) url -n http://arkanisfr.free.fr/ArKanis/index.php?page=qs
  elseif ($inrect(%x,%y,194,4,13,13)) window -n @qssel
  elseif ($inrect(%x,%y,215,4,13,13)) {
    if ($hget(QSSel,OnTop)) { hdel QSSel OnTop 1 | window -u @qssel }
    else { hadd -m QSSel OnTop 1 | window -o @qssel }
  }
  elseif ($inrect(%x,%y,235,4,13,13)) window -c @qssel
  elseif ($inrect(%x,%y,52,42,149,99)) input.request.ok Fichier : $findfile($hget(QSSel,Folder),*,$hget(QSSel,Compteur))
  elseif ($inrect(%x,%y,9,8,157,20)) qssel.move %x %y
}
alias -l qssel.move {
  if (!$2) return
  var %x = $mouse.dx, %y $mouse.dy
  if (!$window(@qssel)) .timerqssel.move off
  if ($mouse.key & 1) {
    .timerqsclock.move -h 1 0 qssel.move $1-
    window @qssel $calc(%x - $1) $calc(%y - $2)
  }
}
;***
; Icone mouvante
;***
alias -l qs.balle {
  if ($readini(Config.ini,QSConfig,Balle)) {
    remini Config.ini QSConfig Balle
    drawcopy @qscopy 0 0 $qs.w(x) $qs.w(y) @qs 0 0
    .timerqs.balle off
    if ($hget(QSPos,QSBalle)) hdel QSPos QSBalle
  }
  else {
    writeini -n Config.ini QSConfig Balle 1
    hadd -m QSBalle MvtX $+($iif($r(0,1),-),$r(3,6))
    hadd -m QSBalle MvtY $+($iif($r(0,1),-),$r(3,6))
    var %x = $r(0,752), %y = $r(50,552), %re = $readini(Config.ini,QSIcones,QSBalle)
    var %reg = $regex(%re,Icone:([^\s]+)), %img = $iif($exists($regml(1)),$regml(1),ArKanis/Icones/balle.bmp)
    hadd -m QSPos QSBalle $+(Icone:,%img) $+(Position:,%x,|,%y)
    qs.move.balle
  }
}
alias -l qs.move.balle {
  if (!$exists(ArKanis/Icones/balle.bmp)) {
    hadd -m finish.dl.arka qs.move.balle qs.move.balle
    dl.arkanis Script-ArKanis/balle.bmp ArKanis/Icones/
    return
  }
  if (!$window(@qs)) return
  if ($mouse.key & 1) {
    .timerqs.balle -h 1 1 qs.move.balle
    return
  }
  var %u = $hget(QSPos,QSBalle)
  var %reg = $regex(%u,Position:([^\s]+)), %position = $regml(1)
  var %x = $gettok(%position,1,124), %y = $gettok(%position,2,124), %xx = %x, %yy = %y
  var %reg = $regex(%u,Icone:([^\s]+)), %icone = $iif($exists($regml(1)),$regml(1),ArKanis/Icones/balle.bmp)
  if ((!$hget(QSBalle,MvtX)) && (!$hget(QSBalle,MvtY))) {
    hadd -m QSpos QSBalle $+(Icone:,%icone) $+(Position:,%x,|,%y)
    qs.pic %icone %x %y 50 50
    drawdot @qs
    return
  }
  dec %xx
  dec %yy
  var %maxx = $calc($qs.w(x) -50), %maxy = $calc($qs.w(y) - 80)
  if ($hget(QSBalle,MvtX) != $null) {
    inc %x $ifmatch
    if (%x !isnum) var %x = $r(25,%maxx)
    while %x !isnum $+(0-,%maxx) {
      if (%x >= 752) { var %x = $calc(%maxx * 2 - %x) | hadd -m QSBalle MvtX $calc($hget(QSBalle,MvtX) * -1) }
      if (%x <= 0) { var %x = $calc(0 * 2 - %x) | hadd -m QSBalle MvtX $calc($hget(QSBalle,MvtX) * -1) }
    }
  }
  if ($hget(QSBalle,MvtY) != $null) {
    inc %y $ifmatch
    if (%y !isnum) var %y = $r(50,%maxy)
    while %y !isnum $+(50-,%maxy) {
      if (%y >= 522) { var %y = $calc(%maxy * 2 - %y) | hadd -m QSBalle MvtY $calc($hget(QSBalle,MvtY) * -1) }
      if (%y <= 50) { var %y = $calc(50 * 2 - %y) | hadd -m QSBalle MvtY $calc($hget(QSBalle,MvtY) * -1) }
    }
  }
  .timerqs.balle -h 1 1 qs.move.balle
  if ($hget(QS,Veille)) drawcopy @qsveille %xx %yy 52 52 @qs %xx %yy 52 52
  else drawcopy @qscopy %xx %yy 52 52 @qs %xx %yy 52 52
  hadd -m QSpos QSBalle $+(Icone:,%icone) $+(Position:,%x,|,%y)
  qs.pic %icone %x %y 50 50
  drawdot @qs
}
alias -l qs.veille.balle writeini -n Config.ini QSConfig VeilleBalle $iif($readini(Config.ini,QSConfig,VeilleBalle),0,1)
alias -l qs.veille {
  if (!$window(@qs)) return
  var %img = $readini(Config.ini,QSConfig,VeilleImg), %img = $iif($exists(%img),%img,$+($mircdir,ArKanis/Icones/paysage.jpg))
  hadd -m QS Veille 1
  if (!$exists(%img)) var %img = $+($mircdir,ArKanis/Icones/backgroundQS.jpg)
  drawpic -cnms @qs 0 0 $qs.w(x) $qs.w(y) $+(",%img,")
  window -BCdg0hk0npRz +dL @qsveille -1 -1 $qs.w(x) $qs.w(y)
  drawdot @qs
  ;window -a @qs
  drawcopy @qs 0 0 $qs.w(x) $qs.w(y) @qsveille 0 0
  if ($readini(Config.ini,QSConfig,VeilleBalle)) {
    hadd -m QSBalle MvtX $+($iif($r(0,1),-),$r(3,6))
    hadd -m QSBalle MvtY $+($iif($r(0,1),-),$r(3,6))
    var %x = $r(0,752), %y = $r(50,$calc($qs.w(y) - 46))
    hadd -m QSPos QSBalle Icone:ArKanis/Icones/balle.bmp $+(Position:,%x,|,%y)
    qs.move.balle
  }
}
alias -l qs.veille.pass {
  writeini -n Config.ini QSConfig VeillePass $iif($readini(Config.ini,QSConfig,VeillePass),0,1)
  if ($readini(Config.ini,QSConfig,VeillePass)) {
    var %a = $input.request.pass(Quel sera le mot de passe ? Souvenenez vous-en, et faites attention aux majuscules.)
    if (!%a) return
    writeini -n Config.ini QSConfig VeillePass %a
    input.request.ok Le mot de passe est %a
  }
}
;*** xShosting
alias -l qs.add.multiserv {
  ;ajouter un serveur/bnc
  var %nom = $input.request(Quel nom donner au serveur ?), %no = $+(QS!,$replace(%nom,$chr(32),$chr(165)))
  if (($left(%nom,2) == QS) || (%nom == General)) {
    input.request.ok Impossible de donner ce nom au serveur
    return
  }
  if (!$regex(%no,[a-zA-Z0-9]|[-\.!\?¥\s\+])) {
    input.request.ok Des caractères non autorisés sont utilisés. Les seuls caractères autorisés sont les lettres, les nombres, l'espace, et + - . ! ?.
    return
  }
  if (!%nom) return
  var %o = $readini(Config.ini,QSBNCs,%no)
  if (%o) {
    if (!$input.request.y.n(Ce nom de serveur est déjà utilisé. Continuer ? L'ajout de ce serveur supprimera l'ancien)) return
  }
  unset %mdp %ident %ip %port %passrequest
  var %ip = $input.request(Quel est l'IP de ce serveur ? Ne mettez pas le port), %port = $input.request(Quel est le port de ce serveur ?)
  if ((!%ip) || (!%port)) {
    input.request.ok Champs invalides
    return
  }
  var %passrequest = $input.request.y.n(Avez-vous besoin d'un mot de passe pour vous connecter sur ce serveur ?)
  if (%passrequest) {
    if ($input.request.y.n(Souhaitez-vous que cette application retienne votre mot de passe ? Attention, cette mémorisation n'est pas sécurisée !)) {
      var %mdp = $input.request.pass(Quel est le mot de passe pour se connecter sur ce serveur/BNC ?)
    }
  }
  var %ident = $input.request(Quel sera votre ident pour ce serveur ?)
  if (!$input.request.y.n(Etes-vous sûr(e) de vouloir ajouter le serveur/bnc du nom de %nom à la liste des serveurs déjà existants ?)) return
  var %action = qs.multiserv.connect %nom
  if ($input.request.y.n(Souhaitez-vous ajouter un raccourci pour vous connecter sur ce serveur/bnc sur votre bureau (QS) ?)) {
    unset %x %y
    var %icone = xShostingico.bmp
    if ($readini(Config.ini,QSConfig,Aligner)) {
      var %nb = $ini(Config.ini,QSIcones,0), %col = $int($calc(%nb / 10)), %x = $calc(70* %col + 70)
      var %y = $calc(%nb - %col * 10)
    }
    if (%x !isnum 25-775) var %x = $r(25,775)
    if (%y !isnum 25-505) var %y = $r(25,505)
    hadd -m QSPos %no $+(Icone:ArKanis/Icones/,%icone) $+(Position:,%x,|,%y)
    hadd -m QS List $iif($hget(QS,List),$+($ifmatch,£),%no)
    qs.sorticones
    qs.draw.icones
    drawdot @qs
    writeini -n Config.ini QSIcones %no $+(Icone:ArKanis/Icones/,%icone) $+(Position:,%x,|,%y)
    writeini -n Config.ini QS %no $asctime(dd/mm/yyyy HH:nn:ss) Serveur
  }
  writeini -n Config.ini QSDo %no %action
  writeini -n Config.ini QSBNCs %no $+(PassRequest:,$iif(%passrequest,1,0)) $+(Pass:,%pass) $+(IP:,%ip) $+(Port:,%port) $+(Ident:,%ident)
}
alias -l qs.multiserv.connect {
  var %nom = $iif($1,$1,$input.request(Sur quel Serveur/BNC se connecter ? Donnez le nom))
  if (($left(%nom,2) == QS) && ($left(%nom,3) != QS!)) var %nom = $+(QS!,%nom)
  if ($left(%nom,3) != QS!) var %nom = $+(QS!,%nom)
  var %no = $replace(%nom,$chr(32),$chr(165)), %o = $readini(Config.ini,QSBNCs,%no)
  if (!%o) return
  unset %pass %ip %port %new
  var %reg = $regex(%o,Pass:([^\s]+)), %pass = $regml(1)
  var %reg = $regex(%o,IP:([^\s]+)), %ip = $regml(1)
  var %reg = $regex(%o,Port:([^\s]+)), %port = $regml(1)
  if (!%ip) return
  if (%port !isnum) return
  var %reg = $regex(%o,PassRequest:([^\s]+)), %passrequest = $regml(1)
  if ((!%pass) && (!%passrequest )) var %pass = $input.request.pass(Quel est le mot de passe pour se connecter sur ce serveur/BNC ?)
  var %new = $iif($input.request.y.n(Souhaitez-vous vous connecter sur un nouveau groupe de fenêtre ?),-m)
  if (!$input.request.y.n(Etes-vous sûr(e) de vouloir vous connecter sur %nom ?)) return
  server %new %ip %port %pass $iif(%ident,-i $me $anick $+(%ident,@hotmail.com) %ident)
}
alias qs.w {
  if ($1 == x) return $iif($readini(Config.ini,QSConfig,WindowX) isnum 0-2000,$ifmatch,802)
  if ($1 == y) return $iif($readini(Config.ini,QSConfig,WindowY) isnum 0-1600,$ifmatch,602)
}

;***
; Download
;***
alias dl.arkanis {
  if (!$1) return
  if (!$hget(queue.dl.arka,0).item) {
    hadd -m queue.dl.arka $1 $iif($2,$2,/) $iif($3,$3,$gettok($1,-1,47))
    do.dl.arka $1-
    hadd -m dl.arka.Ticks Begin $ticks
  }
  else {
    hadd -m queue.dl.arka $1 $iif($2,$2,/) $iif($3,$3,$gettok($1,-1,47))
    if (!$sock(dl.arka)) .timerbegin.download 1 5 do.dl.arka $hget(queue.dl.arka,1).item $hget(queue.dl.arka,$hget(queue.dl.arka,1).item)
  }
}
alias queue.arkanis {
  var %t = 1, %m = $hget(queue.dl.arka,0).item
  while %t <= %m {
    var %o = $hget(queue.dl.arka,%t).item, %p = $hget(queue.dl.arka,%o)
    echo -a 2 $+ $asctime([HH:nn:ss]) 12,1[ 0Fichier en attente : %o 12-0 Emplacement où stocker : $gettok(%p,1,32) 12-0 Nom du fichier : $gettok(%p,2,32) 12]
    inc %t
  }
}
alias -l do.dl.arka {
  .timerbegin.download off
  if (!$1) return
  tokenize 32 $replace($1-,$chr(92),$chr(47))
  if ($hget(dl.arka)) hfree dl.arka
  hadd -m dl.arka Link $1
  hadd -m dl.arka Folder $iif($2,$+(/,$gettok($2,1-,47)),/)
  hadd -m dl.arka Folder $replace($iif($right($hget(dl.arka,Folder),1) != $chr(47),$+($hget(dl.arka,Folder),$chr(47)),$hget(dl.arka,Folder)),$chr(47),$chr(92))
  hadd -m dl.arka Name $iif($3,$3,$gettok($1,-1,47))
  hadd -m dl.arka Type $iif($istok(dll-jpg-hlp-bmp-ico-mdx-mp3-reg-wav-zip-rar-exe,$gettok($hget(dl.arka,Name),-1,46),45),Binary,Text)
  if ($exists($+(",$left($mircdir,-1),$hget(dl.arka,Folder),$hget(dl.arka,Name),"))) .remove $+(",$left($mircdir,-1),$hget(dl.arka,Folder),$hget(dl.arka,Name),")
  echo -a 2 $+ $asctime([HH:nn:ss]) 12,1[ 0Connecting to FTP ... 12]
  unset %o
  var %fol = $replace($hget(dl.arka,Folder),$chr(47),$chr(92)), %t = 1, %max = $gettok(%fol,0,92), %folder = $null
  while %t <= %max {
    var %g = $gettok($hget(dl.arka,Folder),%t,92), %folder = $+(%folder,%g,\)
    if (!$isdir(%folder)) .mkdir %folder
    inc %t
  }
  sockclose dl.arka
  sockopen dl.arka arkanisfr.free.fr 80
}
on *:sockopen:dl.arka:{
  .timerbegin.download off
  if (!$hget(dl.arka,Name)) return
  echo -a 2 $+ $asctime([HH:nn:ss]) 12,1[ 0Preparing to download $hget(dl.arka,Name) ... 12]
  hadd -m dl.arka Ticks $ticks
  if ($sockerr) return
  if ($hget(dl.arka,0).item < 4) return
  sockwrite -n $sockname GET $+(http://arkanisfr.free.fr/,$hget(dl.arka,Link)) $iif($hget(dl.arka,Type) == Text,HTTP/1.0)
  sockwrite -n $sockname $crlf
}
on *:sockread:dl.arka:{
  .timerbegin.download off
  if ($hget(dl.arka,Type) == Binary) {
    sockread &a
    bwrite $+(",$left($mircdir,-1),$hget(dl.arka,Folder),$hget(dl.arka,Name),") -1 -1 &a
  }
  elseif ($hget(dl.arka,Type) == Text) {
    sockread %a
    if (%o) write $+(",$left($mircdir,-1),$hget(dl.arka,Folder),$hget(dl.arka,Name),") %a
    if ($left(%a,13) == Content-Type:) set %o 1
  }
}
on *:sockclose:dl.arka:{
  var %t = $hget(queue.dl.arka,0).item, %ph = $null
  if (%t > 1) var %ph = $calc(%t -1) fichier(s) restant(s).
  echo -a 2 $+ $asctime([HH:nn:ss]) 12,1[ 0Download of $hget(dl.arka,Name) finished in $+($calc($ticks - $hget(dl.arka,Ticks)),ms) $iif(%ph,$+(%ph,$chr(32))) $+ 12]
  hdel queue.dl.arka $hget(dl.arka,Link)
  if (($hget(dl.arka,Name) == ArKanis-MAJ.mrc) && ($exists(ArKanis-MAJ.mrc))) { .load -rs ArKanis-MAJ.mrc | unset %download.arkanis* | return }
  if (%t > 1) { .timer -h 1 50 do.dl.arka $hget(queue.dl.arka,1).item $hget(queue.dl.arka,$hget(queue.dl.arka,1).item) | return }
  var %t = $hget(dl.arka.Ticks,Begin)
  echo -a 2 $+ $asctime([HH:nn:ss]) 12,1[ 0Tous les fichiers placés en file d'attente pour le téléchargement ont été téléchargés $+ $iif(%t,$+($chr(32),en,$chr(32),$calc(($ticks - %t) /1000),s)) $+ . 12]
  if ($hget(finish.dl.arka,0).item) {
    var %t = 1, %m = $hget(finish.dl.arka,0).item
    while %t <= %m {
      var %o = $hget(finish.dl.arka,%t).item, %p = $hget(finish.dl.arka,%o)
      if (%p) $+(.timer,$gettok(%p,1,32)) -oh 1 5 %p
      inc %t
    }
    if ($hget(finish.dl.arka)) hfree finish.dl.arka
  }
}

;***
; Input Request
;***
alias input.request {
  if ($1 == pass) { var %t = 1 | tokenize 32 $2- }
  if (!$1) return
  if ($dialoginput.request) return
  hadd -m InputRequest Question $1-
  return $dialog(input.request,input.request,-4)
}
alias input.request.y.n {
  if (!$1) return
  if ($dialoginput.request) return
  hadd -m InputRequest Question $1-
  return $iif($dialog(input.request.y.n,input.request.y.n,-4),$true,$false)
}
alias input.request.pass {
  if (!$1) return
  if ($dialoginput.request) return
  hadd -m InputRequest Question $1-
  return $dialog(input.request.pass,input.request.pass,-4)
}
alias input.request.ok {
  if (!$1) return
  if ($dialoginput.request) return
  hadd -m InputRequest Question $1-
  return $iif($dialog(input.request.ok,input.request.ok,-4),$true,$false)
}
dialog input.request {
  title Input Needed
  size -1 -1 150 60
  option dbu
  icon ArKanis/ArKanis.ico
  button "OK" 1, 130 50 20 10, default ok
  text "By ArKanis" 4, 10 30 45 10
  edit "" 5, 60 2 90 40, read multi vsbar return
  edit "" 6, 0 50 125 10, result autohs
  icon 7, 6 5 48 24 , $mircexe
}
dialog input.request.y.n {
  title Input Needed
  size -1 -1 150 60
  option dbu
  icon ArKanis/ArKanis.ico
  button "&Yes" 1, 80 45 30 15, ok result default
  button "&No" 2, 115 45 30 15, cancel
  text "By ArKanis" 4, 10 30 45 10
  edit "" 5, 60 2 90 40,read multi vsbar return
  icon 7, 6 5 48 24 , $mircexe
}
dialog input.request.pass {
  title Input Needed
  size -1 -1 150 60
  option dbu
  icon ArKanis/ArKanis.ico
  button "OK" 1, 130 50 20 10, default ok
  text "By ArKanis" 4, 10 30 45 10
  edit "" 5, 60 2 90 40, read multi vsbar return
  edit "" 6, 0 50 125 10, result autohs pass
  icon 7, 6 5 48 24 , $mircexe
}
dialog input.request.ok {
  title Avertissement
  size -1 -1 150 60
  option dbu
  icon ArKanis/ArKanis.ico
  button "&OK" 1, 115 43 30 15, ok result default
  text "By ArKanis" 4, 10 30 45 10
  edit "" 5, 60 2 90 40,read multi vsbar return
  icon 7, 6 5 48 24 , $mircexe
}
ON *:DIALOG:input.request*:*:*:{
  if ($devent == init) {
    if (($dname == input.request) || ($dname == input.request.pass)) did -f $dname 6
    if (!$exists(ArKanis/Input.jpg)) dl.arkanis Script-ArKanis/Input.jpg ArKanis/
    else did -g $dname 7 ArKanis/Input.jpg
    if ($hget(InputRequest,Question)) did -o $dname 5 1 $hget(InputRequest,Question)
    did -o $dname 4 1 Par ArKanis
  }
  if (($did == 7) && ($did(4).text == Par ArKanis)) did -o $dname 4 1 Lien vers le site
  if (($devent == sclick) && ($did == 7)) url -n http://arkanisfr.free.fr/ArKanis/
  if (($did != 7) && ($did(4).text != Par ArKanis)) did -o $dname 4 1 Par ArKanis
}
on *:start:{
  if ($readini(Config.ini,QSConfig,Start)) {
    qs ontop:0 active:0
    .timerwindow -o @qs
    .timerontop 1 30 $!iif($window(@qs),window -u @qs,return)
  }
}

Conclusion :


mIRC version >= 6.14 nécessaire

Pas de bugs connus pour le moment. Il est fort probable qu'il y en ait, malgré mes efforts et mes beta-testeurs (thx à eux), étant donné que j'ai commencé ce code hier fin d'aprem.

Je manque d'idées pour rajouter de belles choses donc vos remarques seront utiles.

Ce code est tiré de mon add-on (Script-ArKanis) version 4.3 (téléchargeable sur mon site)

Utilisation de sockets, regex, drawcopy, ... aucune dll

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.