home *** CD-ROM | disk | FTP | other *** search
/ HaCKeRz KrOnIcKLeZ 3 / HaCKeRz_KrOnIcKLeZ.iso / scriptz / chanserv.tcl < prev    next >
Text File  |  1996-04-23  |  14KB  |  473 lines

  1. # chanserv.tcl
  2. # 27 March 1996 by Gord-@saFyre
  3. # for eggdrop version 1.0
  4. # provides dcc and msg/public commands for multichannel bot settings
  5. # stores and reloads info on "added" channels to provide permanence -
  6. # bot will rejoin and reset all channels it was on if it crashes and
  7. # is brought back up.
  8.  
  9. # ADDED COMMANDS:
  10. # All change commands require master status.
  11. # DCC commands added:
  12. # .join <channel>
  13. # .leave <channel>
  14. # .setmode [<+/-mode>...<+-mode>][-TOPIC][+TOPIC <topictext>]  
  15. #    setmode applies the changes to the console channel of the 
  16. #    master who issues the command - if no parameters are given,
  17. #    it returns the status of the current channel's modes
  18. # .channels
  19. #    channels lists the channels the bot is currently on (op command)
  20. #
  21. # MSG commands added:
  22. # /msg <bot> join <channel>
  23. # /msg <bot> leave <channel>
  24. # /msg <bot> channels
  25. #    channels lists the channels the bot is currently on (op command)
  26. #
  27. # PUB commands added:
  28. # !topic <topictext>
  29. # !setmode [<+/-mode>...<+-mode>][-TOPIC][+TOPIC <topictext>]  
  30. #    setmode applies the changes to the channel in which the
  31. #    command was publicly issued - if no parameters are given,
  32. #    it returns the status of the current channel's modes
  33. #
  34.  
  35. # set the default options you would like new channels to have (these 
  36. # can only be shanged using the builtin tcl commands).
  37.  
  38. set defchanoptions {chanmode "+n-likm" idle-kick 120}
  39.  
  40. # set the default modes you would like new channels to have (these
  41. # can later be changed for each channel using the 'setmode' command.
  42.  
  43. set defchanmodes {-clearbans +enforcebans +dynamicbans +userbans +autoop -bitch +greet +protectops +statuslog}
  44.  
  45. # set the file in which chanserv will store channel state information 
  46. # for permanence
  47.  
  48. set chanfile "pinkfloyd.channelfile"
  49.  
  50.  
  51. ##############################################
  52. # Do NOT modify anything below this          #
  53. ##############################################
  54. proc cleanarg {arg} {
  55.   set response ""
  56.   for {set i 0} {$i < [string length $arg]} {incr i} {
  57.     set char [string index $arg $i]
  58.     if {($char != "\12") && ($char != "\15")} {
  59.       append response $char
  60.     }
  61.   }
  62.   return $response
  63. }
  64.  
  65. set savedchans { }
  66. set okchanmodes {+clearbans -clearbans +enforcebans -enforcebans +dynamicbans -dynamicbans +userbans -userbans +autoop -autoop +bitch -bitch +greet -greet +protectops -protectops +statuslog -statuslog}
  67.  
  68. proc getchanmode {channel} {
  69.   global savedchans
  70.   for {set i 0} {$i < [llength $savedchans]} {incr i} {
  71.     set this [lindex $savedchans $i]
  72.     if {[string compare [string tolower [lindex $this 0]] [string tolower $channel]] == 0} {
  73.       return [lindex $this 1]
  74.     }
  75.   }
  76.   return ""
  77. }
  78.  
  79. proc getchantopic {channel} {
  80.   global savedchans
  81.   for {set i 0} {$i < [llength $savedchans]} {incr i} {
  82.     set this [lindex $savedchans $i]
  83.     if {[string compare [string tolower [lindex $this 0]] [string tolower $channel]] == 0} {
  84.       return [lindex $this 2]
  85.     }
  86.   }
  87.   return ""
  88. }
  89.  
  90. proc setchanmode {channel data} {     
  91.   global savedchans
  92.   for {set i 0} {$i < [llength $savedchans]} {incr i} {
  93.     set this [lindex $savedchans $i]
  94.     if {[string compare [string tolower [lindex $this 0]] [string tolower $channel]] == 0} {
  95.       set topic [lindex $this 2]
  96.       set this [list $channel $data $topic]
  97.       set savedchans [lreplace $savedchans $i $i $this]
  98.       savechans
  99.       return 0
  100.     }
  101.   }
  102. }
  103.  
  104. proc setchantopic {channel data} {     
  105.   global savedchans
  106.   for {set i 0} {$i < [llength $savedchans]} {incr i} {
  107.     set this [lindex $savedchans $i]
  108.     if {[string compare [string tolower [lindex $this 0]] [string tolower $channel]] == 0} {
  109.       set modes [lindex $this 1]
  110.       set this [list $channel $modes $data]
  111.       set savedchans [lreplace $savedchans $i $i $this]
  112.       savechans
  113.       return 0
  114.     }
  115.   }
  116. }
  117.  
  118. proc savechans {} {
  119.   global savedchans
  120.   global chanfile
  121.   set fd [open $chanfile w]
  122.   foreach channelinfo $savedchans {
  123.     puts $fd $channelinfo
  124.   }
  125.   close $fd
  126.   return
  127. }
  128.  
  129. proc loadchans {} {
  130.   global savedchans
  131.   global chanfile
  132.   global botnick
  133.   global defchanoptions
  134.   putlog "### chanserv.tcl by Gord-@saFyre loaded."
  135.   if {[catch {set fd [open $chanfile r]}] != 0} {
  136.     setconfigchans
  137.     putlog "### channel file $chanfile does not exist!"
  138.     return 0
  139.   }
  140.   set savedchans { }
  141.   while {![eof $fd]} {
  142.     set savedchans [lappend savedchans [string trim [gets $fd]]]
  143.   }
  144.   close $fd
  145.   set savedchans [lreplace $savedchans end end]
  146.   if ([llength $savedchans]) {
  147.     foreach channelinfo $savedchans {
  148.       set channel [lindex $channelinfo 0]
  149.       set modes [lindex $channelinfo 1]
  150.       set topic [lindex $channelinfo 2]
  151.       set needop "need-op \{gain-ops $channel\}"
  152.       set needinvite "need-invite \{ \}"
  153.       set options [concat $defchanoptions $needop $needinvite]
  154.       channel add $channel $options
  155.       foreach mode $modes {
  156.         channel set $channel $mode
  157.       }
  158.       if {$topic != ""} {
  159.         putserv "TOPIC $channel :$topic"
  160.       }
  161.       putlog "Added saved channel $channel with modes \"$modes\" and topic \"$topic\""
  162.     }
  163.   }
  164.   if {($savedchans == { }) && ([llength [channels]] > 0} {
  165.     setconfigchans
  166.   }
  167.   return
  168. }
  169.  
  170. proc setconfigchans {} {
  171.   global savedchans
  172.   foreach channel [channels] {
  173.     set chanmodes [lrange [channel info $channel] 4 end]
  174.     set savit $channel
  175.     lappend savit $chanmodes ""
  176.     lappend savedchans $savit
  177.   }
  178.   savechans
  179.   return 1
  180. }
  181.  
  182. proc addchannel {channel chanmodes topic} {
  183.   global defchanoptions savedchans
  184.   if {[lsearch [string tolower [channels]] [string tolower $channel]] >= 0} {return 0}
  185.   set needop "need-op \{gain-ops $channel\}"
  186.   set needinvite "need-invite \{ \}"
  187.   set options [concat $defchanoptions $needop $needinvite]
  188.   channel add $channel $options
  189.   foreach option $chanmodes {
  190.     channel set $channel $option
  191.   }
  192.   if {$topic != ""} {
  193.     putserv "TOPIC $channel :$topic"
  194.   }
  195.   lappend channel $chanmodes $topic
  196.   lappend savedchans $channel
  197.   savechans
  198.   return 1
  199. }
  200.  
  201. proc remchannel {channel} {
  202.   global savedchans
  203.   if {[lsearch [string tolower [channels]] [string tolower $channel]] == -1} {return 0}
  204.   if ([llength $savedchans]) {
  205.     set index 0
  206.     foreach channelinfo $savedchans {
  207.       set ochannel [lindex $channelinfo 0]
  208.       if {[string tolower $ochannel] == [string tolower $channel]} {
  209.         set savedchans [lreplace $savedchans $index $index]
  210.         channel remove $channel
  211.         savechans
  212.         return 1
  213.       }
  214.       incr index
  215.     }
  216.   }
  217.   return 0
  218. }
  219.  
  220. proc dcc_botjoin {handle idx channel} {
  221.   global defchanmodes
  222.   if {([llength $channel] != 1) || ([string first # $channel] == -1)} {
  223.     putdcc $idx "syntax: .join #channel"
  224.     return 0
  225.   }
  226.   if {[addchannel $channel $defchanmodes ""]} {
  227.     putcmdlog "joined $channel - requested by $handle"
  228.   } else {
  229.     putdcc $idx "I'm already on $channel!"
  230.   }
  231.   return 0
  232. }
  233.  
  234. bind dcc m join dcc_botjoin
  235.   
  236. proc dcc_botleave {handle idx channel} {
  237.   if {([llength $channel] != 1) || ([string first # $channel] == -1)} {
  238.     putdcc $idx "syntax: .leave #channel"
  239.     return 0
  240.   }
  241.   if {[lsearch [string tolower [channels]] [string tolower $channel]] == 0} {
  242.     putdcc $idx "I can't leave my home channel!"
  243.     return 0
  244.   }
  245.   if {[remchannel $channel]} {
  246.     putcmdlog "left $channel - requested by $handle"
  247.   } else {
  248.     putdcc $idx "I'm not on $channel!"
  249.   }
  250.   return 0
  251. }
  252.  
  253. bind dcc m leave dcc_botleave
  254.  
  255. proc dcc_settopic {handle idx topic} {
  256.   set channel [lindex [console $idx] 0]
  257.   set topic [cleanarg $topic]
  258.   if {[llength $topic] >= 1} {
  259.     set t2 ""
  260.     for {set i 0} {$i < [string length $topic]} {incr i} {
  261.       set this [string index $topic $i]
  262.       if {$this == "\""} {
  263.         append t2 "\'"
  264.       } {
  265.         if {$this == "\{"} {
  266.           append t2 "("
  267.         } {
  268.           if {$this == "\}"} {                     
  269.             append t2 ")"
  270.           } {
  271.             append t2 $this
  272.           }
  273.         }
  274.       }
  275.     }
  276.     set topic $t2
  277.     putserv "TOPIC $channel :$topic"
  278.     setchantopic $channel $topic
  279.     putcmdlog "Channel $channel default topic set to \"$topic\" by $handle."
  280.     putdcc $idx "Topic set for channel $channel."
  281.     return 0
  282.   }
  283.   set topic [getchantopic $channel]
  284.   putdcc $idx "Default topic for $channel is \"$topic\"."
  285.   return 0
  286. }
  287.  
  288. bind dcc n topic dcc_settopic
  289.  
  290. proc msg_botjoin {nick uhost handle channel} {
  291.   global defchanmodes botnick
  292.   set channel [cleanarg $channel]
  293.   if {([llength $channel] != 1) || ([string first # $channel] == -1)} {
  294.     putserv "NOTICE $nick :syntax: /msg $botnick join #channel"
  295.     return 0
  296.   }
  297.   if {[addchannel $channel $defchanmodes ""]} {
  298.     putcmdlog "joined $channel - requested by $handle"
  299.   } else {
  300.     putserv "NOTICE $nick :I'm already on $channel!"
  301.   }
  302.   return 0
  303. }
  304.  
  305. bind msg m join msg_botjoin
  306.   
  307. proc msg_botleave {nick uhost handle channel} {
  308.   global botnick
  309.   set channel [cleanarg $channel]
  310.   if {([llength $channel] != 1) || ([string first # $channel] == -1)} {
  311.     putserv "NOTICE $nick :syntax: /msg $botnick leave #channel"
  312.     return 0
  313.   }
  314.   if {[lsearch [string tolower [channels]] [string tolower $channel]] == 0} {
  315.     putserv "NOTICE $nick :I can't leave my home channel!"
  316.     return 0
  317.   }
  318.   if {[remchannel $channel]} {
  319.     putcmdlog "left $channel - requested by $handle"
  320.   } else {
  321.     putserv "NOTICE $nick :I'm not on $channel!"
  322.   }
  323.   return 0
  324. }
  325.  
  326. bind msg m leave msg_botleave
  327.  
  328. proc pub_settopic {nick uhost handle channel topic} {
  329.   set topic [cleanarg $topic]
  330.   if {[llength $topic] >= 1} {
  331.     set t2 ""
  332.     for {set i 0} {$i < [string length $topic]} {incr i} {
  333.       set this [string index $topic $i]
  334.       if {$this == "\""} {
  335.         append t2 "\'"
  336.       } {
  337.         if {$this == "\{"} {
  338.           append t2 "("
  339.         } {
  340.           if {$this == "\}"} {                     
  341.             append t2 ")"
  342.           } {
  343.             append t2 $this
  344.           }
  345.         }
  346.       }
  347.     }
  348.     set topic $t2
  349.     putserv "TOPIC $channel :$topic"
  350.     setchantopic $channel $topic
  351.     putcmdlog "Channel $channel default topic set to \"$topic\" by $handle."
  352.     putserv "NOTICE $nick :Topic set for channel $channel."
  353.     return 0
  354.   }
  355.   set topic [getchantopic $channel]
  356.   putserv "NOTICE $nick :Default topic for $channel is \"$topic\"."
  357.   return 0
  358. }
  359.  
  360. bind pub m !topic pub_settopic
  361.  
  362. proc chanmodechange {handle channel modes} {
  363.   set modes [cleanarg $modes]
  364.   global okchanmodes
  365.   set donemodes { }
  366.   set chanmodes [getchanmode $channel]
  367.   if {([string index $modes 0] != "+") && ([string index $modes 0] != "-")} {return $donemodes}
  368.   set t2 ""
  369.   for {set i 0} {$i < [string length $modes]} {incr i} {
  370.     set this [string index $modes $i]
  371.     if {$this == "\""} {
  372.       append t2 "\'"
  373.     } {
  374.       if {$this == "\{"} {
  375.         append t2 "("
  376.       } {
  377.         if {$this == "\}"} {                     
  378.           append t2 ")"
  379.         } {
  380.           append t2 $this
  381.         }
  382.       }
  383.     }
  384.   }
  385.   set modes $t2
  386.   for {set i 0} {$i < [llength $modes]} {incr i} {
  387.     set mode [string tolower [lindex $modes $i]]
  388.     if {[string match $mode "+topic"]} {
  389.       if {[expr $i + 1] < [llength $modes]} {
  390.         set topic [lrange $modes [expr $i + 1] end]
  391.       } else {
  392.         set topic ""
  393.       }
  394.       setchantopic $channel $topic
  395.       putserv "TOPIC $channel :$topic"
  396.       putcmdlog "Channel $channel default topic set to \"$topic\" by $handle."
  397.       lappend donemodes +topic
  398.       setchanmode $channel $chanmodes
  399.       return $donemodes
  400.     }
  401.     if {[string match $mode "-topic"]} {
  402.       setchantopic $channel ""
  403.       putserv "TOPIC $channel :"
  404.       putcmdlog "Channel $channel default topic set to \"$topic\" by $handle."
  405.       lappend donemodes -topic
  406.       continue
  407.     }
  408.     if {[lsearch $okchanmodes $mode] != -1} {
  409.       channel set $channel $mode
  410.       lappend donemodes $mode
  411.       set antimode [string trimleft $mode "+-"]
  412.       if {[string index $mode 0] == "-"} {
  413.         set antimode "+$antimode"
  414.       } else {
  415.         set antimode "-$antimode"
  416.       }
  417.       set index [lsearch $chanmodes $antimode]
  418.       if {$index != -1} {
  419.         set chanmodes [lreplace $chanmodes $index $index $mode]
  420.       }
  421.       setchanmode $channel $chanmodes
  422.     }
  423.   }
  424.   return $donemodes
  425. }
  426.  
  427. proc dcc_chchanmodes {hand idx arg} {
  428.   set arg [cleanarg $arg]
  429.   set channel [lindex [console $idx] 0]
  430.   set setmodes [chanmodechange $hand $channel $arg]
  431.   if {$setmodes == { }} {
  432.     set setmodes [lrange [channel info $channel] 4 end]
  433.   } {
  434.     putcmdlog "$hand set channel $channel to: $setmodes"
  435.   }
  436.   putdcc $idx "Channel $channel set to: $setmodes"
  437.   return 0
  438. }
  439.  
  440. bind dcc m setmode dcc_chchanmodes
  441.  
  442. proc dcc_channels {hand idx arg} {
  443.   putdcc $idx "Currently on: [channels]"
  444.   return 0
  445. }
  446.  
  447. bind dcc o channels dcc_channels
  448.  
  449. proc pub_chchanmodes {nick uhost hand arg channel} {
  450.   set arg [cleanarg $arg]
  451.   set setmodes [chanmodechange $hand $channel $arg]
  452.   if {$setmodes == { }} {
  453.     set setmodes [lrange [channel info $channel] 4 end]
  454.   } {
  455.     putcmdlog "$hand set channel $channel to: $setmodes"
  456.   }
  457.   putserv "NOTICE $nick :Channel $channel set to: $setmodes"
  458.   return 0
  459. }
  460.  
  461. bind pub m !setmode pub_chchanmodes
  462.  
  463. proc msg_channels {nick uhost hand arg channel} {
  464.   putserv "NOTICE $nick :Currently on: [channels]"
  465.   return 0
  466. }
  467.  
  468. bind msg o channels msg_channels
  469.  
  470. loadchans
  471.  
  472.