botlending forum  

Go Back   botlending forum > Eggdrop & TCL > Tcl scripting

Tcl scripting Tcl scripting related questions

Closed Thread
 
LinkBack Thread Tools Display Modes
Old 09-08-2004, 19:24   #1 (permalink)
Junior Member
 
Join Date: Jul 2004
Posts: 3
Rep Power: 0
dutz is an unknown quantity at this point
Exclamation need help urgent !fuck !kiss !slap ...etc

#This is the action.tcl that allows to add a public command for the bot to /me :)
#Copyright dutz 2004 <<>> inspired by yx_96_local_v.tcl a&a copyright .. All rights reserved
#You can add or modify message by adding or modifing the lines :) example :
#Let say you want to modify the command slap ... you just need to modify this line : puthelp #"PRIVMSG $chan :\001ACTION
#after this line you see loveste pe \002$target\002 cu ciocanul .... and
#you modify ..that .. in to whatever you want..let`s say \002$target\002 cu barosu` :) and thats #all:P
#now lets say you wanna add your new shit ... justa add a line after this text that will look #like this : example:
#you wanna add "flood command" .. you just need yo add a line like this: routine:addcom flood # pub:flood 1020 504 |v 1
#and then ... after that line .. you must add this :
#proc pub:flood {hand chan args x mix} {
# set target [lindex $args 0]
# if {$args == ""} {
# puthelp "PRIVMSG $chan :USAGE: flood <nick>"
# return 1 }
# puthelp "PRIVMSG $chan :\001ACTION your message "
# return "$target" }

routine:addcom slap pub:slap 1020 504 |v 1
routine:addcom fute pub:fute 1020 504 |v 1
routine:addcom pupa pub:pupa 1019 505 |v 1

proc pub:slap {hand chan args x mix} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan :USAGE: slap <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION loveste pe \002$target\002 cu ciocanul peste degetul mic de la picior\001"
return "$target" }


proc pub:fute {hand chan args x mix} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan :USAGE: fute <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION Il fute tare de tot pe \002$target\002 exact in ga0z!\001"
return "$target" }


proc pub:pupa {hand chan args x mix} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan : USAGE: kiss <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION pupa duuuulce pe \002$target\002 pe botic :D \001"
return "$target" }



am asa ceva...pus intrun tcl....intrebarea mea e.... cum fac ca asta sa fie o comanda publica? sa o poata accesa oricine ?
dutz is offline  
Old 09-08-2004, 20:22   #2 (permalink)
Administrator

aka aqwzsx
 
Join Date: Jun 2004
Posts: 832
Blog Entries: 126
Rep Power: 3
UniversaliA is on a distinguished road
Default

Code:
routine:addcom slap pub:slap 1020 504 |v 1
routine:addcom fute pub:fute 1020 504 |v 1
routine:addcom pupa pub:pupa 1019 505 |v 1
schimbi in
Code:
 
routine:addcom slap pub:slap 1020 504 |s 1
routine:addcom fute pub:fute 1020 504 |s 1
routine:addcom pupa pub:pupa 1019 505 |s 1
PS am o rugaminte, sa scoti "inspired by yx_96_local_v.tcl a&a copyright", acolo nu este asa cod, deci nu e cazul
UniversaliA is offline  
Old 10-08-2004, 01:05   #3 (permalink)
Junior Member
 
Join Date: Jul 2004
Posts: 3
Rep Power: 0
dutz is an unknown quantity at this point
Default

erm...desigur ca nu merge fara a&a sau desigur ca merge ?
dutz is offline  
Old 10-08-2004, 02:23   #4 (permalink)
Administrator

aka aqwzsx
 
Join Date: Jun 2004
Posts: 832
Blog Entries: 126
Rep Power: 3
UniversaliA is on a distinguished road
Default

Nu merge. Ca sa mearga stergi
Code:
 
routine:addcom slap pub:slap 1020 504 |v 1
routine:addcom fute pub:fute 1020 504 |v 1
routine:addcom pupa pub:pupa 1019 505 |v 1
adaugi
Code:
bind pub -|- .slap pub:slap
bind pub -|- .fuck pub:fute
bind pub -|- .kiss pub:pupa
dupa aceasta toate randurile

Code:
 {hand chan args x mix}
inlocuiesti cu
Code:
 {nick uhost hand chan args}
versiunea finala
Code:
bind pub -|- .slap pub:slap
bind pub -|- .fuck pub:fuck
bind pub -|- .kiss pub:kiss 
 
proc pub:slap {nick uhost hand chan args} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan :USAGE: slap <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION loveste pe \002$target\002 cu ciocanul peste degetul mic de la picior\001"
return "$target" }
 
 
proc pub:fute {nick uhost hand chan args} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan :USAGE: fute <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION Il fute tare de tot pe \002$target\002 exact in ga0z!\001"
return "$target" }
 
 
proc pub:pupa {nick uhost hand chan args} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan : USAGE: kiss <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION pupa duuuulce pe \002$target\002 pe botic :D \001"
return "$target" }

Last edited by UniversaliA; 15-08-2004 at 18:53.
UniversaliA is offline  
Old 11-08-2004, 23:21   #5 (permalink)
Senior Member
 
GoRaPiD's Avatar
 
Join Date: Jun 2004
Location: In pat cu avatarul meu
Age: 20
Posts: 259
Rep Power: 0
GoRaPiD is an unknown quantity at this point
Send a message via Yahoo to GoRaPiD
Question Tcl

Code:
routine:addcom slap pub:slap 1020 504 |v 1
routine:addcom fute pub:fute 1020 504 |v 1
routine:addcom pupa pub:pupa 1019 505 |v 1

proc pub:slap {hand chan args x mix} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan :USAGE: slap <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION loveste pe \002$target\002 cu ciocanul peste degetul mic de la picior\001"
return "$target" }


proc pub:fute {hand chan args x mix} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan :USAGE: fute <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION Il fute tare de tot pe \002$target\002 exact in ga0z!\001"
return "$target" }


proc pub:pupa {hand chan args x mix} {
set target [lindex $args 0]
if {$args == ""} {
puthelp "PRIVMSG $chan : USAGE: kiss <nick>"
return 1 }
puthelp "PRIVMSG $chan :\001ACTION pupa duuuulce pe \002$target\002 pe botic :D \001"
return "$target" }
asta poate fi folosit ca script asa ?
__________________
Forza RAPID ALE ALEEEEEEEEEEEEEEEEEEEEEEe
GoRaPiD is offline  
Old 10-10-2004, 00:12   #6 (permalink)
Junior Member
 
Join Date: Jun 2004
Posts: 8
Rep Power: 0
Vlad is an unknown quantity at this point
Default

aqwzsx cu ce ai zis tu acolo merge dar merge cu orice nick daca da cineva !slap <orice nick> si acel nick nu exista botul tot zice * @TheBot loveste pe <orice nick> cu ciocanul peste degetul mic de la picior ... cum fac sa zica doar daca nickul acela este pe canal iar daca nu este sa zica ca nu este acel nick pe canal ?
__________________
THE ONE THAT WAS, THE ONE THAT IS, THE ONE THAT WILL BE !
Vlad is offline  
Old 10-10-2004, 13:13   #7 (permalink)
Administrator

aka aqwzsx
 
Join Date: Jun 2004
Posts: 832
Blog Entries: 126
Rep Power: 3
UniversaliA is on a distinguished road
Default

Adaugi randul urmator

Code:
 
 
if {![onchan $target $chan]} { puthelp "PRIVMSG $chan :FAILED: I don't see $target on $chan" 
return 1 }

Last edited by UniversaliA; 06-11-2004 at 17:49.
UniversaliA is offline  
Old 29-10-2004, 18:24   #8 (permalink)
lsn
Member
 
lsn's Avatar
 
Join Date: Jun 2004
Location: In the NeXuS
Posts: 160
Rep Power: 37
lsn will become famous soon enough
Exclamation faq, mai, url again :)

ceva de dat cu capul

line adaugata la chanset

Code:
 [regexp {^(desc|url|mail)$} $mode] } { pub:setts $hand $chan $args $x $mix ;return } elseif {
procesele

Code:
 
 
routine:addcom	url	 pub:url 0000 000 |s 1
routine:addcom	mail	pub:mail 0000 000 |s 1
routine:addcom	desc	pub:desc 0000 000 |s 1
 
proc setts:load {} {
global setts
catch {unset setts}
if {![file exists "setts.dat"]} {
	set outfile [open "setts.dat" w]
	close $outfile
}
set infile [open "setts.dat" r]
set buffer [read $infile]
close $infile
set buffer [split $buffer "\n"]
foreach line $buffer {
	if {$line != ""} {
	 set dline [split $line "|"]
	 set dchan [string tolower [lindex $dline 0]]
	 set dcmd [lindex $dline 1]
	 set dinfo [lindex $dline 2]
	 set setts($dchan,$dcmd) $dinfo
	}
}
return 1
}
proc setts:save {} {
global setts
set outfile [open "setts.dat" w]
foreach item [array names setts *,*] {
	set dchan [lindex [split $item ","] 0]
	set dcmd [lindex [split $item ","] 1]
	set dinfo $setts($item)
	if {($dchan != "") && ($dcmd != "") && ($dinfo != "")} {
	 puts $outfile "$dchan|$dcmd|$dinfo"
	}
}
close $outfile
return 1
}
 
proc setts:iswhat {what chan} {
global setts
return [info exists setts([string tolower $chan],$what)]
}
proc setts:add {what info chan} {
global setts
if {[setts:iswhat $what $chan]} { return 0 }
set setts([string tolower $chan],$what) "$info"
return 1
}
proc setts:del {what chan} {
global setts
if {![setts:iswhat $what $chan]} { return 0 }
catch {unset setts([string tolower $chan],$what)}
return 1
}
 
proc pub:setts {hand chan args x mix} {
global setts
set nick [lindex $hand 0]
set cmd [string tolower [lindex [split $args] 0]]
set chan [string tolower $chan]
set what [lindex $args 0]
set info [join [lrange $args 1 end]]
if {!($what == "") && !($info == "") && !($info == "reset")} { set res [setts:add $what "$info" $chan];tell $x 1198 "$what $info"; setts:save ;return} elseif {
	 !($what == "") && ($info == "reset")} {set res [setts:del $what $chan];tell $x 1197 $what;setts:save;return} elseif {
	 ($what == "")} {return}
 
}
setts:load
 
 
proc pub:url {hand chan args x mix} {
global setts
catch {unset setts}
if {![file exists "setts.dat"]} {
	set outfile [open "setts.dat" w]
	close $outfile
}
set infile [open "setts.dat" r]
set buffer [read $infile]
close $infile
set buffer [split $buffer "\n"]
foreach line $buffer {
	if {($line != "") && [string match *$chan|url* $line]} {
	 set dline [split $line "|"]
	 set dchan [string tolower [lindex $dline 0]]
	 set dcmd [lindex $dline 1]
	 set dinfo [lindex $dline 2]
	 set setts($dchan,$dcmd) $dinfo
	}
}
if {[info exists dinfo]} {tell $x 1196 "$dinfo"} else {return}}
 
proc pub:mail {hand chan args x mix} {
global setts
catch {unset setts}
if {![file exists "setts.dat"]} {
	set outfile [open "setts.dat" w]
	close $outfile
}
set infile [open "setts.dat" r]
set buffer [read $infile]
close $infile
set buffer [split $buffer "\n"]
foreach line $buffer {
	if {($line != "") && [string match *$chan|mail* $line]} {
	 set dline [split $line "|"]
	 set dchan [string tolower [lindex $dline 0]]
	 set dcmd [lindex $dline 1]
	 set dinfo [lindex $dline 2]
	 set setts($dchan,$dcmd) $dinfo
	}
}
if {[info exists dinfo]} {tell $x 1195 "$dinfo"} else {return}}
 
proc pub:desc {hand chan args x mix} {
global setts
catch {unset setts}
if {![file exists "setts.dat"]} {
	set outfile [open "setts.dat" w]
	close $outfile
}
set infile [open "setts.dat" r]
set buffer [read $infile]
close $infile
set buffer [split $buffer "\n"]
foreach line $buffer {
	if {($line != "") && [string match *$chan|desc* $line]} {
	 set dline [split $line "|"]
	 set dchan [string tolower [lindex $dline 0]]
	 set dcmd [lindex $dline 1]
	 set dinfo [lindex $dline 2]
	 set setts($dchan,$dcmd) $dinfo
	}
}
if {[info exists dinfo]} {tell $x 1194 "$dinfo"} else {return}}

functioneaza partial, dupa un timp daca pune alte setari pt alte canale le sterge pe cele de dinainte nu doar pe canalul respectiv...... daca aveti ceva idei, nu va abtineti sa le ziceti
lsn is offline  
Old 06-11-2004, 16:30   #9 (permalink)
Administrator

aka aqwzsx
 
Join Date: Jun 2004
Posts: 832
Blog Entries: 126
Rep Power: 3
UniversaliA is on a distinguished road
Default

1. Pentru a citi un fisier si a scrie in fisier citesti http://forum.botlending.com/showthread.php?t=2. Nu ezita sa folosesti search pe forum

2. In scriptul care folosesti tu, deja sunt procese difinite pentru a seta proprietati de canal si care salveaza aceste proprietati, in plus tu poti face aceasta alternativ cu procesul default eggdop: setudef <str> <name> care e optimizat la maxim. (In orice caz, e foarte bine ca incerci sa creezi propriile solutii, aici numai castigi in experienta & cunostinte, dar uneori nu merita sa inventezi din nou bicicleta :P)

3. Referitor la erorile din acest script, de la inceput o sa evedentiez generalitatile si algoritmica si dupa aceea va fi analizat fiecare proces in parte.
  • fiecare data cand e folosita comanda url/mail/desc tu faci catch {unset setts} ca pe urma sa citesti acelas array din fisier, sa treci prin procedura de filtrare a textului din fisier, etc etc - ca sa dai un rezultat. Si aceasta se face fiecare data cand cineva da una din aceste comenzi. Nu vad nici un motiv de a sterge o variabila din memorie la bot ca sa o recitesti iaras din fisier; in fisier se pastreaza datele doar pentru cazuri cand botul face restart sau are die. In plus daca chiar in cazul cum ai facut tu, tu ai putea procesul de citire sa-l difinesti undeva in script o singura data si sa-l folosesti deja in comenzile tale, din momentul in care tu in fiecare comanda repeti aceeasi rutina; si daca ai 10-20 de comenzi care citesc din fisier niste date ? La fiecare in parte iarasi o sa adaugi din nou aceleasi randuri ? Dar daca tu ai decis sa skimbi denumirea la fisier sau algoritmul de citire a datelor ? O sa corijezi in toate comenzile din totul ? Deci ar fi bine putin sa te deprinzi cu OOP - Object Oriented Programming, care consta in un simplu principiu: din moment cand tu ai la tine in script un cod care se repeta de mai multe ori - faci pentru el un proces aparte si il folosesti de cate ori ai nevoie. Avanatajele: in caz de modificare - modifici doar un singur proces & nu la fiecare comanda in parte care foloseste acest proces, codul tau e mai citibil & mai compact.
  • [string match *$chan|mail* $line] nu ar fi mai bine [string match -nocase *$chan|mail* $line] ? ai evita eroarea cand denumirea la chan e cu CAPS.
  • analiza scriptului:
a) proc setts:load {} {}

ai difinit procesul pe urma in undeva in script la initiat cu simpla comanda setts:load. Ca pe urma fiecare data cand folosesti comanda url/desc/mail - sa dai unset. In plus cand dai rehash ? acest proces e executat din nou si din nou in van, si variabile care sunt in fisier mai vechi vor fi scrise deasupra la cele noi din memorie. Deci, mai bine ar fi sa-l initiezi asa: if {![info exists setts]} {setts:load}. Respectiv acuma in caz de rehash, daca array setts deja exista - nu are rost sa initiezi acest proces.

if {![file exists "setts.dat"]} {} nu ar fi mai bine inloc de setts.dat sa setezi o variabila globala ? sa poti seta orice denumire de script oricand doresti tu ?

b) proc setts:save {} {}

ai inventat din nou bicicleta. Sunt doua modalitati mai optimale de a face aceasta:
Code:
set fp [open setts.datw]
puts $fp[list array set setts [array get setts]]
close $fp
Pentru a citi acest fisier scrii doar source setts.dat. Comanda source e opitmizata si nu ai nevoie de nici un alt cod in plus.

A doua modalitate e de a scrie un nou proces de exemplu read:settings si sa salvezi in urmatorul fel:

Code:
set fp [open setts.datw]
puts $fp "#Channel settings etc etc "
foreach chan [string tolower [channels]] {
puts $fp "read:settings mail $chan $setts($chan,mail)"
puts $fp "read:settings url $chan $setts($chan,url)"
puts $fp "read:settings desc $chan {$setts($chan,desc)}"
}
close $fp
Acuma ca sa citesti acest fisier tot folosesti source setts.dat. Logic totul ce e scris acolo va fi executat, si anume comanda read:settings cu optiunile mail desc url. Comanda ar trebui sa arate cam asa:

Code:
proc read:settings {option chan txt} {
global setts
 
set $setts($chan,$option) $text
}
Respectiv BOTul va citi toate datele la toate canalele in un singur array din care tu le poti citi oricand, pentru ca array va fi in memorie la BOT, cu conditia ca tu nu dai unset. Aceasta a doua varianta e folosita la scriptul a&a care ai tu & putin e mai complicata decat prima, care e mai evidenta, sigura & eficienta. Ca sa inveti despre array & cum ele sunte folosite, citeste http://mini.net/tcl/1598.

P.S. Pentru a doua varianta ai nevoie de o rutina de automatizare la chan join & part, BOTul automat sa creieze variabilele $setts($chan,OPTION) & sa le stearga. Sau simplu poti face asa:
Code:
if {[info exists setts($chan,OPTION)} {puts $fp "read:settings OPTION$chan $setts($chan,OPTION)"}
In ori caz ai nevoie ca la chan part sa dai unset la setts($chan,*)

c) proc setts:iswhat {} {} SKIP
d) proc setts:add {} {} SKIP
e) proc setts:del {} {}

Code:
 
if {![setts:iswhat $what $chan]} { return 0 }
catch {unset setts([string tolower $chan],$what)}
Daca deja ai verificat daca exista setarea, de ce mai utilizezi catch ? pentru ca sigur nu o sa ai eroare, deci folosesti sau una sau alta. Articol referitor la aceste doua comenzi http://mini.net/tcl/1322.

f) proc pub:setts {} {}

Code:
 
set cmd [string tolower [lindex [split $args] 0]]
set what [lindex $args 0]
Doua variabile cu acelas parametru dar setate in mod diferit De fapt cmd nici nu e folosita de tine, inteleg ca te inspiri din alt script, dar te-ai intrebat de ce el asa a scris ? Ca sa-ti dai seama incearca comanda "!setts []" sau "!setts }". Articol referitor la semne speciale care dau erori & cum sa le eviti http://www.peterre.com/characters.html

Code:
if {!($what == "") && !($info == "") && !($info == "reset")} { set res [setts:add $what "$info" $chan];tell $x 1198 "$what $info"; setts:save ;return} elseif {
!($what == "") && ($info == "reset")} {set res [setts:del $what $chan];tell $x 1197 $what;setts:save;return} elseif {
($what == "")} {return
}
nu e mai simplu fara negatie la negatii ?
Code:
{($what != "") && ($info != "") && ($info != "reset")}
g) proc pub:url {} {}
presupunand ca totul ce am spus mai sus e valibil, referitor la cititul din fisier, si nu conteaza care varainta e folosita, info despre canale deja e in memoria botului & procesul ar arata cam asa:

proc pub:url {hand chan args x mix} {
global setts

set chan [string tolower $chan]

if {[info exists setts($chan,url)] && $setts($chan,url) !=""} {tell $x 1196 $setts($chan,url)} else {return "FAILED: empy"}
}

h) proc pub:mail {} {} SKIP
e) proc pub:desc {} {} SKIP

Last edited by UniversaliA; 06-11-2004 at 18:21.
UniversaliA is offline  
Old 15-12-2004, 09:58   #10 (permalink)
lsn
Member
 
lsn's Avatar
 
Join Date: Jun 2004
Location: In the NeXuS
Posts: 160
Rep Power: 37
lsn will become famous soon enough
Default Varianta mea de !chanset rules

dau aici varianta generala care o folosesc eu

in fisierul yx_90_local_n.tcl se adauga la proc pub:chanset (aici dar pt rules|mail|desc ......sper sa va descurcati mai departe)
Code:
[regexp {^(desc|mail|rules)$} $mode] } { pub:setts $hand $chan $args $x $mix ;return } elseif {
apoi comanda si procesele (pentru rules, pentru celelalte doar adaugati variabile si faceti comenzile)

pub:setts
Code:
setudef str rules
 
proc pub:setts {hand chan args x mix} {
set nick [lindex $x 0]
set what [lindex $args 0]
set info [join [lrange $args 1 end]]
set rules [channel get $chan "rules"]
if {($rules == "")} {set rules ""}
if {($info == "")} {usage $x chanset; return "invalid parameters specified"} elseif {
	 [string match -nocase reset $info]} {tell $x 263 "$chan $what";channel set $chan $what "";return "$what REset"} {tell $x 260 "$chan $what $info";channel set $chan $what "$info";return "$chan $info"}}
comanda

Code:
 routine:addcom	rules		 pub:rules	 0000 000 |s 1
 
proc pub:rules {hand chan args x mix} {
if {([channel get $chan "rules"] == "") && [check:n:ch $hand $chan]} {tell $x 261 "rules rules";return "rules not setup yet"} elseif {
	 ([channel get $chan "rules"] != "")} {tell $x 262 "[channel get $chan "rules"]";return "..."} {return "none ..."}}
bineinteles trebuie definite numerele care apar la tell $x 000 in yx_83_dictn_en.tcl si in celelalte fisiere de limba daca doriti

P.S. 1 sau 2 setari cred ca sunt in plus dar acuma le-am observat si eu, oricum asta e varianta generala care o folosesc sper ca nu am uitat nimic

Last edited by lsn; 15-12-2004 at 12:25.
lsn is offline  
Closed Thread

Bookmarks


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On
Forum Jump


All times are GMT +3. The time now is 11:14.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.