################################## ### EFnetNews.tcl ### ### Version 1.1 ### ### By Wcc ### ### wcc@techmonkeys.org ### ### http://www.dawgtcl.com:81/ ### ### EFnet #|DAWG|Tcl ### ################################## ############################################################################ ### Copyright © 2000 - 2002 |DAWG| Scripting Group. All rights reserved. ### ############################################################################ ############################################################################## ## This script retrieves news updates from http://www.efnet.org and sends ## ## them to all +efnews channels. Public and dcc triggers are also provided. ## ############################################################################## ############## ## COMMANDS ## ################################################################# ## DCC ## .EFnews [limit] (Can be changed.) ## ######### Shows the last X news entries from the EFnet news ## ######### page. X is defined by the default setting, below, or ## ######### by the optional "limit" (max news entries to show) ## ######### argument. ## ######### ---------------------------------------------------- ## ######### .chanset +/-efnews ## ######### Setting a channel +efnet news makes new news entries ## ######### get announced to the channel. ## ################################################################# ## PUB ## !EFnews [limit] (Can be changed.) ## ######### Shows the last X news entries from the EFnet news ## ######### page. X is defined by the default setting, below, or ## ######### by the optional "limit" (max news entries to show) ## ######### argument. ## ################################################################# ########################################################## ## Just load the script, edit the settings, and rehash. ## ########################################################## ############################# # Set the dcc command here. # ############################# set efnetnews_setting(dcmd) "news" ############################# # Set the pub command here. # ############################# set efnetnews_setting(pcmd) "!news" ############################################################### # Set the flag required to use the pub and dcc commands here. # ############################################################### set efnetnews_setting(flag) "-" ######################################################### # Set the number of recent news entries to return here. # ######################################################### set efnetnews_setting(rmax) "1" ################################################# # Set the time between updates in minutes here. # ################################################# set efnetnews_setting(updatetime) "10" ############################ # Set the update url here. # ############################ set efnetnews_setting(url) "jawapos.co.id/index.php" ############################### # Set the database file here. # ############################### set efnetnews_setting(database) "./scripts/efnetnews.db" ################################### # Enable use of bold in DCC chat? # ################################### set efnetnews_setting(bold) 1 ######################################### # Set the reply mode here: # # 0 - Private message to the channel. # # 1 - Notice to the channel. # # 2 - Private message to the nick. # # 3 - Notice to the nick. # ######################################### set efnetnews_setting(rplmode) "0" ############################################# # Prefix "EFNETNEWS:" in DCC chat messages? # ############################################# set efnetnews_setting(EFNETNEWS:) 1 ############################# # Enable bold in headlines? # ############################# set efnetnews_setting(hbold) 1 #################### # Code begins here # #################### if {![string match 1.6.* $version]} { putlog "\002EFNETNEWS:\002 \002WARNING:\002 This script is intended to run on eggdrop 1.6.x." } if {[info tclversion] < 8.2} { putlog "\002EFNETNEWS:\002 \002WARNING:\002 This script is intended to run on Tcl Version 8.2 or later." } bind dcc $efnetnews_setting(flag) $efnetnews_setting(dcmd) efnetnews_dcc bind pub $efnetnews_setting(flag) $efnetnews_setting(pcmd) efnetnews_pub package require http setudef flag efnews proc efnetnews_readarray {array file} { upvar $array ours if {[catch {open $file r} fd]} { return } if {[array exists ours]} { unset ours } foreach line [split [read $fd] \n] { if {[regexp {^%!%(.*)!!!(.*)$} $line match name data]} { set ours($name) $data } } close $fd } proc efnetnews_savearray {array file} { upvar $array ours if {![array exists ours] || [catch {open $file w} fd]} { return } foreach entry [array names ours] { puts $fd "%!%$entry!!!$ours($entry)" } close $fd } proc efnetnews_html2text {text} { regsub -all -- {<[^>]*>} $text {} text regsub -all -- { } $text { } text regsub -all -- {<} $text {<} text regsub -all -- {>} $text {>} text regsub -all -- {"} $text {"} text regsub -all -- {'} $text {'} text regsub -all -- {[} $text {[} text regsub -all -- {]} $text {]} text regsub -all -- {©} $text {©} text regsub -all -- {&} $text {&} text return $text } proc efnetnews_dopre {} { if {!$::efnetnews_setting(EFNETNEWS:)} { return "" } if {!$::efnetnews_setting(bold)} { return "EFNETNEWS: " } return "\002EFNETNEWS:\002 " } proc efnetnews_hbold {text} { return [expr {($::efnetnews_setting(hbold)) ? "\002$text\002" : "$text"}] } proc efnetnews_notify {text} { foreach chan [channels] { if {[botonchan $chan] && [lsearch -exact [channel info $chan] "+efnews"] != -1} { puthelp "PRIVMSG $chan :$text" } } } proc efnetnews_notnumber {string} { return [regexp {[^0-9]} $string] } proc efnetnews_sendtext {nick chan text} { switch -- $::efnetnews_setting(rplmode) { "0" { puthelp "PRIVMSG $chan :$text" } "1" { puthelp "NOTICE $chan :$text" } "2" { puthelp "PRIVMSG $nick :$text" } "3" { puthelp "NOTICE $nick :$text" } } } if {![array exists efnetnews_master] && [file exists $efnetnews_setting(database)]} { efnetnews_readarray efnetnews_master $efnetnews_setting(database) } if {[lsearch -glob [timers] "* efnetnews_update *"] == -1} { timer $efnetnews_setting(updatetime) efnetnews_update } proc efnetnews_dcc {hand idx text} { if {![info exists ::efnetnews_master(data,0)]} { putdcc $idx "[efnetnews_dopre]The news data has not yet been updated." ; return } if {[string compare [set rmax [join [lrange [split $text] 0 0]]] ""] == [set ctr 0] || [efnetnews_notnumber [join [lrange [split $text] 0 0]]]} { set rmax $::efnetnews_setting(rmax) } while {$ctr < $rmax} { if {![info exists ::efnetnews_master(data,$ctr)]} { return } putdcc $idx "[efnetnews_dopre][efnetnews_hbold "\[[expr $ctr + 1]\] \[\037EFnet\037\] $::efnetnews_master(headline,$ctr)"]" set string $::efnetnews_master(data,$ctr) incr ctr while {[string compare $string ""] != 0} { if {[string length $string] <= 400} { putdcc $idx "[efnetnews_dopre]$string" ; break } putdcc $idx "[efnetnews_dopre][string range $string 0 [set lr [string last " " [string range $string 0 400]]]]" set string [string range $string $lr end] } } } proc efnetnews_pub {nick uhost hand chan text} { if {![info exists ::efnetnews_master(data,0)]} { efnetnews_sendtext $nick $chan "The news data has not yet been updated." ; return } if {[string compare [set rmax [join [lrange [split $text] 0 0]]] ""] == [set ctr 0] || [efnetnews_notnumber [join [lrange [split $text] 0 0]]]} { set rmax $::efnetnews_setting(rmax) } while {$ctr < $rmax} { if {![info exists ::efnetnews_master(data,$ctr)]} { return } efnetnews_sendtext $nick $chan "[efnetnews_hbold "\[[expr $ctr + 1]\] \[\037EFnet\037\] $::efnetnews_master(headline,$ctr)"]" set string $::efnetnews_master(data,$ctr) incr ctr while {[string compare $string ""] != 0} { if {[string length $string] <= 400} { efnetnews_sendtext $nick $chan "$string" ; break } efnetnews_sendtext $nick $chan "[string range $string 0 [set lr [string last " " [string range $string 0 400]]]]" set string [string range $string $lr end] } } } proc efnetnews_update {} { global efnetnews_master if {[lsearch -glob [timers] "* efnetnews_update *"] == -1} { timer $::efnetnews_setting(updatetime) efnetnews_update } if {[catch {set tok [::http::geturl $::efnetnews_setting(url)]} error]} { putlog "[efnetnews_dopre]An error occured while connecting to $::efnetnews_setting(url)." ; return } if {[::http::ncode $tok] != 200} { putlog "[efnetnews_dopre]An error occured while connecting to $::efnetnews_setting(url)." ::http::cleanup $tok ; return } set data [::http::data $tok] ::http::cleanup $tok regsub -all -- {( +)\n} [efnetnews_html2text [string range $data [string first "" $data] [expr [string last "" $data] - 1]]] "\n" data regsub -all -- {\n[\n ]+} $data "\n" data foreach {a b} [list ctr -1 read 0] { set $a $b } foreach {a b c d} [split [string trim $data] "\n"] { incr ctr set temp($ctr) "$d" set efnetnews_master(headline,$ctr) "\[$a ($b $c)\]" } if {![info exists temp(0)]} { putlog "[efnetnews_dopre]An error occured while connecting to $::efnetnews_setting(url)." ; return } if {![info exists efnetnews_master(data,0)] || [string compare $efnetnews_master(data,0) $temp(0)] != 0} { set read 1 } foreach a [array names temp] { set efnetnews_master(data,$a) $temp($a) } efnetnews_savearray efnetnews_master $::efnetnews_setting(database) if {$read} { efnetnews_announce_new } } proc efnetnews_announce_new {} { efnetnews_notify "[efnetnews_hbold "\[\037EFnet\037\] $::efnetnews_master(headline,0)"]" set string $::efnetnews_master(data,0) while {[string compare $string ""] != 0} { if {[string length $string] <= 400} { efnetnews_notify "$string" ; return } efnetnews_notify "[string range $string 0 [set lr [string last " " [string range $string 0 400]]]]" set string [string range $string $lr end] } return } putlog "\002EFNETNEWS:\002 EFnetNews.tcl Version 1.1 by Wcc is loaded."