This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.
For more information, see this announcement post . Click the X in the top right-corner of this box to dismiss this message.
Help for those learning Tcl or writing their own scripts.
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 1:04 am
Hello guys. I need a little bit help about this script. Something is wrong. Is it possiable someone help me with it?
Code: Select all
bind msg n op msg:op
proc msg:op {nick uhost handle txt} {
if {$txt == ""} {
putserv "samode $chan +o $nick"
return 0
}
if {![onchan $txt $chan]} {
putserv "notice $nick :$txt is not on $chan"
return 0
}
putserv "samode $chan +o $txt"
putserv "PRIVMAG #admins :$txt get OP in $chan"
}
CrazyCat
Revered One
Posts: 1296 Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:
Post
by CrazyCat » Sun Sep 04, 2022 3:58 am
Give the error message, use .set errorInfo to have more datas about the error.
But...
- $chan is never setted
- PRIVMAG ?
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 4:44 am
CrazyCat wrote: Give the error message, use .set errorInfo to have more datas about the error.
But...
- $chan is never setted
- PRIVMAG ?
Hey, CrazyCat. This is the error:
[08:42:39] Tcl error [msg:op]: can't read "chan": no such variable
if there's a will, there's a way.
willyw
Revered One
Posts: 1203 Joined: Thu Jan 15, 2009 12:55 am
Post
by willyw » Sun Sep 04, 2022 9:49 am
...
This is the error:
[08:42:39] Tcl error [msg:op]: can't read "chan": no such variable
CrazyCat pointed that out,with:
- $chan is never setted
See here:
Code: Select all
proc msg:op {nick uhost handle txt} {
if {$txt == ""} {
putserv "samode $chan +o $nick"
...
When your script gets to that point, it is trying to use a variable named $chan, that does not exist. It's never been set in that procedure.
Is this script intended to be used in just one channel? If so, a simple solution would be to simply :
at the top of the proc.
Also, don't forget that CrazyCat said:
- PRIVMAG ?
because once you get the $chan variable thing fixed, then that line with that typo in it, is going to error.
I hope this helps.
For a fun (and popular) Trivia game, visit us at: irc.librairc.net #science-fiction . Over 300K Q & A to play in BogusTrivia !
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 1:53 pm
So, the point is to give me op at any channel where I want. The bot is IRCop. And must make notice at #admins for any get op. The bot will not be in the channel where I want to give me OP. Must be something like OperServ but eggdrop.
if there's a will, there's a way.
SpiKe^^
Owner
Posts: 831 Joined: Fri May 12, 2006 10:20 pm
Location: Tennessee, USA
Contact:
Post
by SpiKe^^ » Sun Sep 04, 2022 3:33 pm
Try this code.
The command syntax is: op #somechannel
The bot will attempt to OP the +n flagged command user in #somechannel.
Important: This is Not a very secure method of getting op, as it is just protected by the flags on the bind!!!!
Be sure your bot owners only have very secure host masks!
Code: Select all
bind msg n op msg:op
proc msg:op {nick uhost handle txt} {
set chan [lindex [split [string trim $txt]] 0]
if {![string match "#?*" $chan]} {
putserv "PRIVMSG $nick :Command syntax: \002op #somechannel\002"
return 0
}
putserv "samode $chan +o $nick"
putserv "PRIVMSG #admins :$nick get OP in $chan"
}
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 3:57 pm
Yeah, this work Spike^^ but is give OP only to the user use the command. I can`t give OP to another user. I can get of only to myself.
if there's a will, there's a way.
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 4:29 pm
The bot now is give OP only to the user who use the command.
The false is my. I ment the bot must give OP to everyone named in the command.
The script must be work like this way: "op #somechannel somenick"
if there's a will, there's a way.
CrazyCat
Revered One
Posts: 1296 Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:
Post
by CrazyCat » Sun Sep 04, 2022 6:57 pm
Code: Select all
bind msg n op msg:op
proc msg:op {nick uhost handle txt} {
lassign [split [string trim $txt]] chan vict
if {![string match "#?*" $chan]} {
putserv "PRIVMSG $nick :Command syntax: \002op #somechannel \[user\]\002"
return 0
}
if {$vict eq ""} { set vict $nick }
putserv "samode $chan +o $vict"
putserv "PRIVMSG #admins :$vict get OP in $chan"
}
This will allow
!op #channel and
!op #channel user
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 8:25 pm
Thank you CrazyCat is working perfect!
if there's a will, there's a way.
SpiKe^^
Owner
Posts: 831 Joined: Fri May 12, 2006 10:20 pm
Location: Tennessee, USA
Contact:
Post
by SpiKe^^ » Sun Sep 04, 2022 10:18 pm
Here's a more complete version of the script, with all the features you hinted about in your posts above...
This will allow
!op #channel and
!op #channel user
and
!op #channel nick nick2 nick3
Code: Select all
# set one admin channel here for an added security check.
# both the bot and the command user will need to be in this channel.
# maybe set this channel password protected or invite only...
# ex. set samop(adminchan) "#admins"
# or set empty to not require command users to be in an admin channel.
# ex: set samop(adminchan) ""
set samop(adminchan) "#admins"
# set one report channel here for the bot to report mode changes to.
# ex. set samop(reportchan) "#admins"
# or set empty to not report modes. ex: set samop(reportchan) ""
set samop(reportchan) "#admins"
bind msg n op msg:op
proc msg:op {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "PRIVMSG $nick :Command syntax: \002op #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "PRIVMSG $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "o" [llength $targets]]
putserv "samode $chan +$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :[join $targets] get OP in $chan"
}
return 0
}
putlog "samop.tcl version 0.1 loaded."
Valentin
Voice
Posts: 14 Joined: Sun Sep 04, 2022 12:54 am
Location: London
Contact:
Post
by Valentin » Sun Sep 04, 2022 11:23 pm
Code: Select all
# set one admin channel here for an added security check.
# both the bot and the command user will need to be in this channel.
# maybe set this channel password protected or invite only...
# ex. set samop(adminchan) "#admins"
# or set empty to not require command users to be in an admin channel.
# ex: set samop(adminchan) ""
set samop(adminchan) "#admins"
# set one report channel here for the bot to report mode changes to.
# ex. set samop(reportchan) "#admins"
# or set empty to not report modes. ex: set samop(reportchan) ""
set samop(reportchan) "#admins"
#################################
############# OWNER #############
#################################
bind msg n owner msg:qop
proc msg:qop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002OWNER #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "q" [llength $targets]]
putserv "samode $chan +$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used OWNER to make [join $targets] OWNER in $chan"
}
return 0
}
##################################
############ PROTECT #############
##################################
bind msg n protect msg:sop
proc msg:sop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002PROTECT #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "a" [llength $targets]]
putserv "samode $chan +$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used PROTECT to make [join $targets] PROTECT in $chan"
}
return 0
}
#################################
############## OP ###############
#################################
bind msg n op msg:op
proc msg:op {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002OP #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "o" [llength $targets]]
putserv "samode $chan +$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used OP to make [join $targets] OP in $chan"
}
return 0
}
#################################
############# HALFOP ############
#################################
bind msg n halfop msg:hop
proc msg:hop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002HALFOP #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "h" [llength $targets]]
putserv "samode $chan +$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used HALFOP to make [join $targets] HALFOP in $chan"
}
return 0
}
#################################
############# VOICE #############
#################################
bind msg n voice msg:vop
proc msg:vop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002VOICE #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "v" [llength $targets]]
putserv "samode $chan +$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used VOICE to make [join $targets] VOICE in $chan"
}
return 0
}
#################################
############# OWNER #############
#################################
bind msg n deowner msg:deqop
proc msg:deqop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002DEOWNER #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "q" [llength $targets]]
putserv "samode $chan -$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used DEOWNER to make [join $targets] DEOWNER in $chan"
}
return 0
}
##################################
############ PROTECT #############
##################################
bind msg n deprotect msg:desop
proc msg:desop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002DEPROTECT #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "a" [llength $targets]]
putserv "samode $chan -$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used DEPROTECT to make [join $targets] DEPROTECT in $chan"
}
return 0
}
#################################
############## OP ###############
#################################
bind msg n deop msg:deop
proc msg:deop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002DEOP #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "o" [llength $targets]]
putserv "samode $chan -$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used DEOP to make [join $targets] DEOP in $chan"
}
return 0
}
#################################
############# HALFOP ############
#################################
bind msg n dehalfop msg:dehop
proc msg:dehop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002DEHALFOP #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "h" [llength $targets]]
putserv "samode $chan -$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used DEHALFOP to make [join $targets] DEHALFOP in $chan"
}
return 0
}
#################################
############ DEVOICE ############
#################################
bind msg n devoice msg:devop
proc msg:devop {nick uhost handle txt} { global samop
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002DEVOICE #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $samop(adminchan)]} {
if {![botonchan $samop(adminchan)] || ![onchan $nick $samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat "v" [llength $targets]]
putserv "samode $chan -$mode [join $targets]"
if {[string match "#?*" $samop(reportchan)]} {
putserv "PRIVMSG $samop(reportchan) :$nick used DEVOICE to make [join $targets] DEVOICE in $chan"
}
return 0
}
#################################
############# HELP ##############
#################################
bind msg n help msg:help
proc msg:help {nick uhost hand txt} {
if {[llength $txt]<13} {
putserv "NOTICE $nick :=============== HELP ================"
putserv "NOTICE $nick :/msg AdminServ OWNER #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEOWNER #channel nick"
putserv "NOTICE $nick :/msg AdminServ PROTECT #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEPROTECT #channel nick"
putserv "NOTICE $nick :/msg AdminServ OP #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEOP #channel nick"
putserv "NOTICE $nick :/msg AdminServ HALFOP #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEHALFOP #channel nick"
putserv "NOTICE $nick :/msg AdminServ VOICE #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEVOICE #channel nick"
putserv "NOTICE $nick :/msg AdminServ HELP"
putserv "NOTICE $nick :================ END ================"
}
}
putlog "samop.tcl version 0.1 loaded."
So, this is the scripts. Working perfect. I`m just added commands for +q +a +h +v -q -a -o -h -v and help.
Thank you, Spike^^ and CrazyCat
if there's a will, there's a way.
CrazyCat
Revered One
Posts: 1296 Joined: Sun Jan 13, 2002 8:00 pm
Location: France
Contact:
Post
by CrazyCat » Mon Sep 05, 2022 10:20 am
Could do a shorter version using a routing proc:
Code: Select all
# set one admin channel here for an added security check.
# both the bot and the command user will need to be in this channel.
# maybe set this channel password protected or invite only...
# ex. set samop(adminchan) "#admins"
# or set empty to not require command users to be in an admin channel.
# ex: set samop(adminchan) ""
set samop(adminchan) "#admins"
# set one report channel here for the bot to report mode changes to.
# ex. set samop(reportchan) "#admins"
# or set empty to not report modes. ex: set samop(reportchan) ""
set samop(reportchan) "#admins"
#################################
############# OWNER #############
#################################
bind msg n owner msg:qop
bind msg n protect msg:sop
bind msg n op msg:op
bind msg n halfop msg:hop
bind msg n voice msg:vop
bind msg n deowner msg:deqop
bind msg n deprotect msg:desop
bind msg n deop msg:deop
bind msg n dehalfop msg:dehop
bind msg n devoice msg:devop
proc msg:qop {nick uhost handle text} { samode $nick + q OWNER $text }
proc msg:sop {nick uhost handle text} { samode $nick + p PROTECT $text }
proc msg:op {nick uhost handle text} { samode $nick + o OP $text }
proc msg:hop {nick uhost handle text} { samode $nick + h HALFOP $text }
proc msg:vop {nick uhost handle text} { samode $nick + v VOICE $text }
proc msg:deqop {nick uhost handle text} { samode $nick - q DEOWNER $text }
proc msg:desop {nick uhost handle text} { samode $nick - p DEPROTECT $text }
proc msg:deop {nick uhost handle text} { samode $nick - o DEOP $text }
proc msg:dehop {nick uhost handle text} { samode $nick - h DEHALFOP $text }
proc msg:devop {nick uhost handle text} { samode $nick - v DEVOICE $text }
proc samode {nick to mode label text} {
set targets [lassign [split [string trim $txt]] chan]
if {![string match "#?*" $chan]} {
putserv "NOTICE $nick :Command syntax: \002$label #somechannel \[nick(s)\]\002"
return 0
}
if {[string match "#?*" $::samop(adminchan)]} {
if {![botonchan $::samop(adminchan)] || ![onchan $nick $::samop(adminchan)]} {
putserv "NOTICE $nick :Both you & the bot must be on $::samop(adminchan)"
return 0
}
}
if {![llength $targets]} { lappend targets $nick }
set mode [string repeat $mode [llength $targets]]
putserv "samode $chan $to$mode [join $targets]"
if {[string match "#?*" $::samop(reportchan)]} {
putserv "PRIVMSG $::samop(reportchan) :$nick used $label to make [join $targets] $label in $chan"
}
return 0
}
#################################
############# HELP ##############
#################################
bind msg n help msg:help
proc msg:help {nick uhost hand txt} {
if {[llength $txt]<13} {
putserv "NOTICE $nick :=============== HELP ================"
putserv "NOTICE $nick :/msg AdminServ OWNER #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEOWNER #channel nick"
putserv "NOTICE $nick :/msg AdminServ PROTECT #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEPROTECT #channel nick"
putserv "NOTICE $nick :/msg AdminServ OP #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEOP #channel nick"
putserv "NOTICE $nick :/msg AdminServ HALFOP #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEHALFOP #channel nick"
putserv "NOTICE $nick :/msg AdminServ VOICE #channel nick"
putserv "NOTICE $nick :/msg AdminServ DEVOICE #channel nick"
putserv "NOTICE $nick :/msg AdminServ HELP"
putserv "NOTICE $nick :================ END ================"
}
}
putlog "samop.tcl version 0.1 loaded."
Could also be optimised with a variable containing modes and labels which can allow to generate help depending on its content
SpiKe^^
Owner
Posts: 831 Joined: Fri May 12, 2006 10:20 pm
Location: Tennessee, USA
Contact:
Post
by SpiKe^^ » Mon Sep 05, 2022 10:48 am
That looks nice CrazyCat:)
Yusif
Voice
Posts: 34 Joined: Fri Aug 18, 2023 11:08 am
Post
by Yusif » Thu Sep 14, 2023 7:39 pm
can you please do modify in this script for simple use?
need it work in #Chanops .. when the chanop need to op in any room by bot, he/she have to type:
!op #chan to get op in that room + confirm msg in #chanops he/she opped
!deop #chan to drop op + confirm msg in #chanops he/she deopped
!hop #chan to get halfop + confirm msg in #chanops he/she halfop
!dehop #chan to dehalfop + confirm msg in #chanops he/she dehop
thanks