Codage TCL - Socket incorporé
#1
Bonjour,

Je suis sur une réalisation d'un codage tcl que j'aimerai rendre le plus efficace possible et sans multiplié les conf sur l'eggdrop alors j'ai pensé que de mettre une seule configuration et plusieurs sockets pourrait etre la solution...
Soucis étant je ne sais pas du tout comment faire le lancement de la proc pour répondre à ceci
tcl
# Socket #
set Bot(bot) "BOt1"
set lBot(nickserv) "NickServ"
set Bot(bot2) "BOt WEB"
set Bot(bot3) "BOt Radio"
set Bot(bot4) "BOt secu"



En cherchant un peu sur d'autre configuration j'ai vu ceci
tcl
######################
## LANCEMENT SOCKET ##
######################
proc lanchsock {} {
global bot
	if {[info exists bot(idx)] && [valididx $bot(idx)]} {return}
	if {![catch "connect $bot(ip) $bot(port)" bot(idx)]} {
		putdcc $bot(idx) "PROTOCTL NICKv2 SJOIN2 UMODE2 NOQUIT VL TKLEXT"
		putdcc $bot(idx) "PASS $bot(pass)"
		putdcc $bot(idx) "SERVER $bot(link) 1 :$bot(real)"
 
		putdcc $bot(idx) ":$bot(link) NICK $bot(bot) 1 [unixtime] $bot(real) $bot(host) $bot(link) 0 +oqS $bot(host) :$bot(ident)"
		putdcc $bot(idx) ":$bot(bot) MODE $bot(bot) +oOSrqswBNghaW"
		putdcc $bot(idx) ":$bot(bot) JOIN $bot(chanircop)"
		putdcc $bot(idx) ":$bot(bot) MODE $bot(chanircop) +q $bot(bot)"
		putdcc $bot(idx) ":$bot(bot) MODE $bot(chanircop) +ntsO"
 
		putdcc $bot(idx) ":$bot(link) NICK $bot(bot2) 1 [unixtime] $bot(real) $bot(host) $bot(link) 0 +oqS $bot(host) :$bot(ident)"
		putdcc $bot(idx) ":$bot(bot2) MODE $bot(bot2) +oOSrqswBNghaW"
		putdcc $bot(idx) ":$bot(bot2) JOIN $bot(chanircop)"
		putdcc $bot(idx) ":$bot(bot2) MODE $bot(chanircop) +q $bot(bot2)"
 
		putdcc $bot(idx) ":$bot(link) NICK $bot(bot3) 1 [unixtime] $bot(real) $bot(host) $bot(link) 0 +oqS $bot(host) :$bot(ident)"
		putdcc $bot(idx) ":$bot(bot3) MODE $bot(bot3) +oOSrqswBNghaW"
		putdcc $bot(idx) ":$bot(bot3) JOIN $bot(chanircop)"
		putdcc $bot(idx) ":$bot(bot3) MODE $bot(chanircop) +h $bot(bot3)"
		putdcc $bot(idx) ":$bot(bot3) JOIN $bot(chanbots)"
		putdcc $bot(idx) ":$bot(bot3) MODE $bot(chanbots) +o $bot(bot3)"
		putdcc $bot(idx) ":$bot(bot3) MODE $bot(chanbots) +ntm"
 
		putdcc $bot(idx) ":$bot(link) NICK $bot(bot4) 1 [unixtime] $bot(real) $bot(host) $bot(link) 0 +oqS $bot(host) :$bot(ident)"
		putdcc $bot(idx) ":$bot(bot4) MODE $bot(bot4) +oOSrqswBNghaW"
		putdcc $bot(idx) ":$bot(bot4) JOIN $bot(chanircop)"
		putdcc $bot(idx) ":$bot(bot4) MODE $bot(chanircop) +h $bot(bot4)"
		putdcc $bot(idx) ":$bot(bot4) JOIN $bot(chanhelp)"
		putdcc $bot(idx) ":$bot(bot4) MODE $bot(chanhelp) +o $bot(bot4)"
		putdcc $bot(idx) ":$bot(bot4) MODE $bot(chanhelp) +nt"
 
		putdcc $bot(idx) ":$bot(link) EOS"
		control $bot(idx) event
	}
	utimer 15 verifidx
}
 
proc verifidx {} {
global bot
if {[valididx $bot(idx)]} {utimer 20 verifidx} else {utimer 2 lanchsock}
}



Soucis rien ne se passe... Pouvez vous m'aider ? Merci.
Répondre Avertir
#2
Et ta procédure verifidx, elle est lancée quand et comment ?
Répondre
#3
Salut,

Tiens je te file un exemple de proc que Alias avais fais pour son tcl services ! ;)

tcl
proc checkconnect {} {
   if {![info exists aurore(idx)]} { utimer 30 [namespace current]::checkconnect } else { xconnect:serv }
}
 
proc xconnect:serv {} {
   variable aurore
   if [catch {set aurore(idx) [connect $aurore(ip) $aurore(port)]} err] {
      putlog "Connection error :$err"
      return
   }
   putdcc $aurore(idx) "PASS $aurore(pwdlink)"
   putdcc $aurore(idx) "SERVER $aurore(serv) 1 [unixtime] [unixtime] J09 ACAA\] +s :$aurore(info)"
   putdcc $aurore(idx) ":$aurore(serv) NICK $aurore(nick) '' '' $aurore(identd) $aurore(host) $aurore(serv) '' :$aurore(nom)"
   putdcc $aurore(idx) ":$aurore(nick) MODE $aurore(nick) +owsgkd"
   putdcc $aurore(idx) ":$aurore(nick) JOIN $aurore(log)"
   putdcc $aurore(idx) ":$aurore(nick) MODE $aurore(log) +ntsv $aurore(nick)"
   control $aurore(idx) [namespace current]::controling_server
   utimer 10 [namespace current]::verify
}


Répondre Avertir
#4
Citation :Et ta procédure verifidx, elle est lancée quand et comment ?
Aucune idée. j'ai juste trouvé ça sur le net mais j'ai pas cherché plus loin...

Citation :Tiens je te file un exemple de proc que Alias avais fais pour son tcl services !
Ton code est à integrer directement sur le codage ?
Répondre Avertir
#5
Non c'est un example pour que tu comprene le fonctionnement du proc

Tien voici un code d'exemple a toi de le modifier a ta guise :)

tcl
######################
# Configuration Link #
######################
 
set laura(link)     "Adresse-du-link"
set laura(info)     "Info-du-link"
set laura(host)     "Host-du-link"
set laura(ip)       "Ip-du-link"
set laura(port)     "Port-du-link"
set laura(pass)     "Mot-de-passe-du-link"
set laura(pseudo)   "Pseudo-du-robot"
set laura(real)     "Realname-du-robot"
set laura(ident)    "Ident-du-robot"
set laura(salon)    "Salon-du-robot"
set laura(mode)     "+oOSqsw"
 
 
#############
# Connexion #
#############
 
proc connexion {} {
	global laura
	if {![catch "connect $laura(ip) $laura(port)" laura(idx)]} {
		putdcc $laura(idx) "PASS $laura(pass)"
		putdcc $laura(idx) "SERVER $laura(link) 1 :$laura(info)"
		putdcc $laura(idx) ":$laura(link) NICK $laura(pseudo) 1 [unixtime] $laura(ident) $laura(host) $laura(link) :$laura(real)"
		putdcc $laura(idx) ":$laura(pseudo) MODE $laura(pseudo) $laura(mode)"
		putdcc $laura(idx) ":$laura(pseudo) JOIN $laura(salon)"
		control $laura(idx) event; utimer 30 verification
	}
}
 
################
# Verification #
################
 
if {![info exists laura(idx)]} { connexion }
 
proc verification {} {
	global laura
	if {[valididx $laura(idx)]} { utimer 30 verification } else { connexion }
}
 
#############
# Evenement #
#############
 
proc event {idx arg} {
	global laura
	set arg [split $arg]
	if {[lindex $arg 0]=="PING"} { putdcc $idx "PONG [lindex $arg 1]" }
}


Répondre Avertir
#6
Merci :D

J'ai un soucis, peut-etre que j'ai mal codé..
tcl
######################
# Configuration Link #
######################
 
set bela(link)    "Adresse-du-link"
set bela(info)    "Info-du-link"
set bela(host)    "Host-du-link"
set bela(ip)       "Ip-du-link"
set bela(port)    "Port-du-link"
set bela(pass)    "Mot-de-passe-du-link"
set bela(pseudo)   "Pseudo-du-robot"
set bela(real)    "Realname-du-robot"
set bela(ident)    "Ident-du-robot"
set bela(salon)    "Salon-du-robot"
set bela(mode)    "+oOSqsw"
 
# Socket #
set Bot(bot) "bara"
set lBot(nickserv) "NickServ"
set Bot(bot2) "Bela"
set Bot(bot3) "Boleslava"
set Bot(bot4) "Dobromila"
set Bot(bot5) "Elena"
set Bot(bot6) "Drahoslava"
set Bot(bot7) "Ivana"
set Bot(bot8) "Jaromíra"

 
######################
## LANCEMENT SOCKET ##
######################
proc connexion {} {
   global bara
   if {![catch "connect $bara(ip) $bara(port)" bara(idx)]} {
      putdcc $bara(idx) "PASS $bara(pass)"
      putdcc $bara(idx) "SERVER $bara(link) 1 :$bara(info)"
      putdcc $bara(idx) ":$bara(link) NICK $bara(pseudo) 1 [unixtime] $bara(ident) $bara(host) $bara(link) :$bara(real)"
      putdcc $bara(idx) ":$bara(pseudo) MODE $bara(pseudo) $bara(mode)"
      putdcc $bara(idx) ":$bara(pseudo) JOIN $bara(salon)"
      control $bara(idx) event; utimer 30 verification
   }
}
 
proc connexion {} {
   global bela
   if {![catch "connect $bela(ip) $bela(port)" bela(idx)]} {
      putdcc $bela(idx) "PASS $bela(pass)"
      putdcc $bela(idx) "SERVER $bela(link) 1 :$bela(info)"
      putdcc $bela(idx) ":$bela(link) NICK $bela(pseudo) 1 [unixtime] $bela(ident) $bela(host) $bela(link) :$bela(real)"
      putdcc $bela(idx) ":$bela(pseudo) MODE $bela(pseudo) $bela(mode)"
      putdcc $bela(idx) ":$bela(pseudo) JOIN $bela(salon)"
      control $bela(idx) event; utimer 30 verification
   }
}
proc connexion {} {
   global Boleslava
   if {![catch "connect $Boleslava(ip) $Boleslava(port)" Boleslava(idx)]} {
      putdcc $Boleslava(idx) "PASS $Boleslava(pass)"
      putdcc $Boleslava(idx) "SERVER $Boleslava(link) 1 :$Boleslava(info)"
      putdcc $Boleslava(idx) ":$Boleslava(link) NICK $Boleslava(pseudo) 1 [unixtime] $Boleslava(ident) $Boleslava(host) $Boleslava(link) :$Boleslava(real)"
      putdcc $Boleslava(idx) ":$Boleslava(pseudo) MODE $Boleslava(pseudo) $Boleslava(mode)"
      putdcc $Boleslava(idx) ":$Boleslava(pseudo) JOIN $Boleslava(salon)"
      control $Boleslava(idx) event; utimer 30 verification
   }
}
 
 proc connexion {} {
   global Dobromila
   if {![catch "connect $Dobromila(ip) $Dobromila(port)" Dobromila(idx)]} {
      putdcc $Dobromila(idx) "PASS $Dobromila(pass)"
      putdcc $Dobromila(idx) "SERVER $Dobromila(link) 1 :$Dobromila(info)"
      putdcc $Dobromila(idx) ":$Dobromila(link) NICK $Dobromila(pseudo) 1 [unixtime] $Dobromila(ident) $Dobromila(host) $Dobromila(link) :$Dobromila(real)"
      putdcc $Dobromila(idx) ":$Dobromila(pseudo) MODE $Dobromila(pseudo) $Dobromila(mode)"
      putdcc $Dobromila(idx) ":$Dobromila(pseudo) JOIN $Dobromila(salon)"
      control $Dobromila(idx) event; utimer 30 verification
   }
}
################
# Verification #
################
 
if {![info exists bara(idx)]} { connexion }
 
proc verification {} {
   global bara
   if {[valididx $bara(idx)]} { utimer 30 verification } else { connexion }
}
}
#############
# Evenement #
#############
 
proc event {idx arg} {
   global bara
   set arg [split $arg]
   if {[lindex $arg 0]=="PING"} { putdcc $idx "PONG [lindex $arg 1]" }
}



Et j'ai une erreur
Citation : can't read "Dobromila(ip)": no such variable
while executing
"catch "connect $Dobromila(ip) $Dobromila(port)" Dobromila(idx)"
(procedure "connexion" line 3)
invoked from within
"connexion "
invoked from within
"if {![info exists bara(idx)]} { connexion }"
(file "scripts/socket.tcl" line 83)
invoked from within
"source scripts/socket.tcl"
(file "socket.conf" line 107)
[10:26:10] * FICHIER DE CONFIGURATION NON CHARGE (INTROUVABLE OU ERREUR)
Répondre Avertir
#7
Salut,

Pour utilise un exemple du code de socket que j'avais, il lui faut le code entier sinon il risque d'avoirs quelques soucis :p
Tiens regarde le code entier qui et dispos sur le site.

tcl
namespace eval ::socks {
   variable aurore
 
#********************#
# Service.Socket 1.0 #
#********************#
 
#**************************#
# Information link reseau. #
#**************************#
 
set aurore(serv) "Aurore.****.fr"
set aurore(ip) "ip"
set aurore(port) "port"
set aurore(pwdlink) "pass"
set aurore(info) "Aurore Services"
 
#****************************#
# Configuration des sockets. #
#****************************#
 
set aurore(nick) "Hera"
set aurore(identd) "Hera"
set aurore(host) "Services.****.fr"
set aurore(nom) "Services-Log"
 
#***************************#
# Salon de log des sockets. #
#***************************#
 
set aurore(log) "#Services"
set aurore(quit01) "Redemarage Aurore-Service."
set aurore(quit02) "Fermeture Aurore-Service."
 
#****************************************#
# Lancement de la procédure des sockets. #
#****************************************#
 
proc checkconnect {} {
   if {![info exists aurore(idx)]} { utimer 30 [namespace current]::checkconnect } else { xconnect:serv }
}
 
proc xconnect:serv {} {
   variable aurore
   if [catch {set aurore(idx) [connect $aurore(ip) $aurore(port)]} err] {
      putlog "Connection error :$err"
      return
   }
   putdcc $aurore(idx) "PASS $aurore(pwdlink)"
   putdcc $aurore(idx) "SERVER $aurore(serv) 1 [unixtime] [unixtime] J09 ACAA\] +s :$aurore(info)"
   putdcc $aurore(idx) ":$aurore(serv) NICK $aurore(nick) '' '' $aurore(identd) $aurore(host) $aurore(serv) '' :$aurore(nom)"
   putdcc $aurore(idx) ":$aurore(nick) MODE $aurore(nick) +owsgkd"
   putdcc $aurore(idx) ":$aurore(nick) JOIN $aurore(log)"
   putdcc $aurore(idx) ":$aurore(nick) MODE $aurore(log) +ntsv $aurore(nick)"
   control $aurore(idx) [namespace current]::controling_server
   utimer 10 [namespace current]::verify
}
 
#***********************************#
# Verify si le serveur est Connecté #
#***********************************#
 
proc verify {} {
   variable aurore
   if [valididx [set [namespace current]::aurore(idx)]] {
      utimer 30 [namespace current]::verify
   } else {
      xconnect:serv
   }
}
 
proc controling_server {idx arg} {
   variable aurore
   set arg1 [lindex [split $arg " "] 0]
   set arg2 [lindex [split $arg " "] 1]
   set arg3 [lindex [split $arg " "] 2]
   set arg4 [lindex [split $arg " "] 3]
   set arg5 [lindex [split $arg " "] 4]
   set arg6 [lindex [split $arg " "] 5]
   set arg7 [lindex [split $arg " "] 6]
   set arg8 [lindex [split $arg " "] 7]
   set arg10 [string trim [lrange [split $arg " "] 3 end] :]
   if {$arg2=="PING"} {
      putdcc $aurore(idx) ":$aurore(serv) PONG $aurore(ip) :$aurore(serv)"
    }   
}
 
#**********************#
# Restart des sockets. #
#**********************#
 
bind evnt - prerestart [namespace current]::eva:restart
proc eva:restart {args} {
   variable aurore
   putdcc $aurore(idx) ":$aurore(serv) SQUIT $aurore(serv) :Restart Sockets."
   catch {close $aurore(idx)}
}
 
#********************#
# Rehash du Service. #
#********************#
 
bind dcc n xrehash [namespace current]::eggy:xrehash
proc eggy:xrehash {nick idx arg} {
   variable aurore
   putdcc $idx "\002Rehash de Aurore-Service et des fichiers\002"
   utimer 4 rehash
}
 
#*********************#
# Restart du Service. #
#*********************#
 
bind dcc n xrestart [namespace current]::eggy:xrestart
proc eggy:xrestart {nick idx arg} {
   variable aurore
   putdcc $idx "\002Redémarrage de Aurore-service\002"
   if [valididx [set [namespace current]::aurore(idx)]] {
      putdcc $aurore(idx) ":$aurore(nick) QUIT :$aurore(quit01)"
      putdcc $aurore(idx) ":$aurore(serv) SQUIT :$aurore(serv)"
      catch {close $aurore(idx)}
      foreach kill [utimers] {
          if {[lindex $kill 1]=="[namespace current]::verify"} { killutimer [lindex $kill 2] }
      }
    }
    xconnect:serv
}
 
#*****************#
# Die du Service. #
#*****************#
 
bind dcc n xdie [namespace current]::eggy:xdie
proc eggy:xdie {nick idx arg} {
    putdcc $idx "\002Arrêt de Aurore-Service\002"
    if [valididx [set [namespace current]::aurore(idx)]] {
       putdcc $aurore(idx) ":$aurore(nick) QUIT : $aurore(quit02)"
       putdcc $aurore(idx) ":$aurore(serv) SQUIT :$aurore(quit02)"
       catch {close $aurore(idx)}
       foreach kill [utimers] {
          if {[lindex $kill 1]=="[namespace current]::verify"} { killutimer [lindex $kill 2] }
       }
   }
}
 
#****************************#
# Fin du Service Sockets 1.0 #
#****************************#
# connection 
[namespace current]::xconnect:serv
}
 
putlog "\0031Service Sockets 1.0 \0034Chargé."



Ce système de socket fonctionne bien, Mais ont et sur du namespace, donc sur certains points sa peut-être plus chiant tout dépend de ce que l'ont fait.
Mais je me suis jamais plaint j'ai toujours réussis à faire ce que j'ai voulut faire ;)

Si besoin base toi sur sa car c'est un code propre pour ma part, et si besoin demande sur le forum ont sera te guider je pense

EDIT : Si tu utilise comme type de server "UnrealIRCD", Pense à changer le protocol du server dans le code
Répondre Avertir
#8
Heu, tu as 4 procédures "connexion", ça ne te choque pas ?
Ensuite, tu utilises $Dobromila alors que nul part cette variable n'est définie, tu as juste défini $Bot(bot4).
Donc ou bien il te manque ue procédure qui crée les variables en fonction du contenu de $Bot ou bien tu n'as pas tout compris à ce que tu fais.
Répondre
#9
Je dois bien avoue que je suis perdu totalement CrazyCat..

J'ai testé ton codage aliasangelius

Mais moi j'aimerai comment dire ça faire un lancement de deux ou trois bot à partir d'une même configuration avec des rôles différent.. Et avec les codages que j'ai eu trouve j'arrive jamais à connecter les bots..
Répondre Avertir
#10
(20/03/2014, 11:56)aliasangelius a écrit : Salut,

Pour utilise un exemple du code de socket que j'avais, il lui faut le code entier sinon il risque d'avoirs quelques soucis :p
Tiens regarde le code entier qui et dispos sur le site.

Salut Alias ,

Si il et complet celui que je lui et donné sauf que toi tu l'utilise en namespace alors que moi non ^^
Répondre Avertir
#11
Reprenons,

@Kee, Mon code ne tant empêche pas de faire ça.
Il suffit de rajouter des variables simplement.

Donc si tu veut je peux t'expliquer comment faire, Tu me dit nom des autres sockets et tu va voir que c'est simple.

@BaGrift, Oui mais sauf ton event et pas bon.
Répondre Avertir
#12
Je suis pas contre aliasangelius si ça te dérange pas...

Pour nom set Bela, Boleslava, Dobromila, Drahoslava et Jaromíra. Ce que je me pose aussi comme question, c'est est ce que sur la conf après je peux "assigner" un codage à un bot en particulier par exemple Bela=Radio - Dobromila=Moderation - Jaromira=Animation ?

Merci de m'aide encore
Répondre Avertir
#13
Alors j'ai pas tout compris.
J'ai compris la partie pour assigner une tâche différentes par socket c'est sa que tu veut dire ?

Si c'est cela oui c'est tout à fait possible, Toutes sockets peuvent avoir une tâche prédéfini sur une chose ou autre.

Exemple : Tu va avoir Nickserv lui va enregistré les demande de pseudo pour être enregistré sur le réseaux.
Bela, Va avoir comme fonction de mettre le status +o sur le salon accueil au ircop.
Etc..

Mais oui c'est tout à fait possible, Faut faire du côté Evément server sur "privmsg".
Si tu sais pas vraiment comment faire dit le moi
Répondre Avertir
#14
Oui c'est ça en gros et oui j'aurai besoin d'aide je pense car je me suis peut-être montrer trop gourmand.. Et vu que j'apprends du moins j'essaie d'apprendre seul y a des trucs sur lesquels je suis court..
Répondre Avertir
#15
Bon.. La je pense qu'il va falloir quelques trucs.
Je vais refaire mon code et ensuite dedans ou ici je vais commenter plus ou moins, pour que tu comprenne.

Bien sur tu va bosser aussi pour modifié etc :)
Comme sa tu comprendra mieux je pense.
Répondre Avertir


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)
Tchat 100% gratuit -Discutez en toute liberté