Administrators chain Posted December 21, 2022 Administrators Report Share Posted December 21, 2022 Now as I loaded it into my bot, the first thing I noticed was its all aliases so i changed them to on TEXT's then I noticed that you can't view a specific feed on request. So I wrote my own function which does just that. It may be slightly buggy considering the amount of feeds you use but nothing that cant be fixed with these commands "!rehashrss" and "!rsslist". Installation: Copy and paste into Remote. Don't forget to change the channel from #rss to whatever channel you want it to display in. I would write a function to do this through an alias but I'm kinda tired right now... Creators Notes: ;================================================== ; RSS Poster ; by Cobi ;================================================== ; Commands: ; /rss Starts the rss poster (shortcut for /loadrsshist and /rsscfg) ; /addrss name host webfile channel count interval -- adds feed to rss.cfg (Implies /rsstimer) ; /showrss name host webfile channel count -- shows rss feed in channel (Implies /getrss and /parserss) ; ; ----- The following are internal commands and should only be used if messing around with the code. ----- ; /loadrsshist Loads the history file so as not to post the same stuff over and over ; /closersshist Unloads the history file... ; /reloadrsshist Shortcut for /closersshist and /loadrsshist ; /rsscfg Loads rss.cfg file and parses it (Implies /rsstimer on every rss feed listed) ; /rsstimer name host webfile channel count interval starts a rss timer for the specified settings ; (Implies /showrss each interval) ; /getrss name host webfile file done -- downloades an rss feed then runs done when it is done (Implies /fixrss) ; /fixrss file -- fixes rss feed format. This is done automatically, and should only be done when debugging. ; /parserss file name channel count -- parses rss file and displays it in a channel ; ; Arguements: ; name = Name of feed (used for displaying purposes) ; host = Where to get the feed ( http://hostwebfile e.g. http://example.com/test.xml example.com is the host and /test.xml is the webfile.. ) ; webfile = file on host ; file = local rss file ; channel = channel to show rss postings in ; count = how many rss posts to show at once ; interval = how often (in seconds) to show rss posts ; done = what to do when done downloading file ; ; Examples: ; ; Add a few rss feeds: ; /addrss mirc.net mirc.net /rss.php?type=news #rss 6 600 ; /addrss SourceForge images.feedstermedia.com /feedcache/ostg/sourceforge/rss_sfnews.xml #rss 6 600 ; /addrss NPR www.npr.org /rss/rss.php?topicId=1001 #rss 6 600 ; /addrss Moreover p.moreover.com /page?o=rss002&c=Top%20stories&wiz=230176 #rss 6 600 ; /addrss Copyright www.copyright.gov /rss.xml #rss 6 600 ; /addrss podcastingnews www.podcastingnews.com /index.xml #rss 6 600 ; /addrss Infoworld www.infoworld.com /rss/news.xml #rss 6 600 ; /addrss BarkerJr.Net barkerjr.net /rss?c=2;f=5 #RSS 2 600 ; /addrss Linux-Security www.linuxsecurity.com /static-content/linuxsecurity_hybrid.rdf #rss 6 600 ; /addrss Planet-Source-Code www.planet-source-code.com /vb/channel/NewCode/channel.cdf #rss 6 600 ; /addrss /. slashdot.org /rss/index.rss #rss 6 600 ; /addrss ZDnet news.zdnet.com /2509-1_22-0-20.xml #rss 6 600 ; /addrss IRC101 www.irc101.org /tier2.xml #rss 6 600 ; /addrss MSDN msdn.microsoft.com /msdnmag/rss/recent.xml #rss 6 600 ; /addrss Microsoft www.microsoft.com /communities/rss.aspx?&Title=Recent+Posts&CMTYSvcSource=MSCOMBlogPosts&CMTYRawShape=list&Params=%7eCMTYDataSvcParams%5e%7eArg+Name%3d'DateFormat'+Value%3d'MMM+d%2c+yyyy'%2f%5e%7e%2fCMTYDataSvcParams%5e&NumberOfItems=50 #rss 6 600 ; /addrss &color;01,00W&color;00,01I&color;01,00R&color;00,01E&color;01,00D&color; wired.com /news/feeds/rss2/0,2610,,00.xml #rss 6 600 ; /addrss RTCW ict.mcast.edu.mt /ictweb/davidmica/web/rss.xml #rss 6 600 ; /addrss jaos software.jaos.org /cgi-bin/rss #rss 6 600 ; ; Reload the config file: ; /rehashrss ; ; Edit the config file: ; /run notepad rss.cfg ; ; Load the config file and start posting news: ; /rss ; ; Contact: ; Cobi@winbots.org ; Cobi on Undernet (#phase, #rss, #game-trivia) ; Cobi on Winbots (#winbots) ; Cobi-Wan-Kenobi on Quakenet (#icechat) ; Cobi on SearchIRC Forums ; Winbots on UnrealIRCd Forums ; Cobi on mirc.net ; ; ChangeLog: ; v1.3 -- fixed memory bug ; v1.2 -- fixed the issue when the tags are not one word ( blah) ; v1.1 -- fixed rss.performance issue ; v1.0 -- Initial Release My Notes: Changed !list to !rsslist so it doesnt interfere with service bots. Added an on TEXT for the following aliases incase your loading it through a bot: /rehashrss = !rehashrss /rss = !rss /rssoff = !rssoff Added a "!show " command. Put the title of the feed (the ones mentioned in !rsslist) in the parameter and all the news from that feed will be posted into the rss channel. Added a !help command which displays the commands. Added an on JOIN notice to users welcoming them with a tip to get them started. on *:TEXT:!rss:#rss: { loadrsshist | rsscfg } alias rss { loadrsshist | rsscfg } alias closersshist { window -c @rss.hist | window -c @rss.performance } alias reloadrsshist { closersshist | loadrsshist } alias rsscfg { var %time = $ticks var %lcv2 = 0 var %lcv = 1 var %lines = $lines(rss.cfg) unset %list while (%lcv <= %lines) { if ($read(rss.cfg,%lcv)) { bunset &line bset -t &line 1 $read(rss.cfg,%lcv) if ($regex(RSS,$bvar(&line,1,$bvar(&line,0)).text,<(.+)>(.+)</.+>)) { bunset &rss. $+ $regml(RSS,1) bset -t &rss. $+ $regml(RSS,1) 1 $regml(RSS,2) } elseif ($regex(RSS,$bvar(&line,1,$bvar(&line,0)).text,</item>)) { rsstimer $bvar(&rss.feed,1,$bvar(&rss.feed,0)).text $bvar(&rss.host,1,$bvar(&rss.host,0)).text $bvar(&rss.file,1,$bvar(&rss.file,0)).text $bvar(&rss.channel,1,$bvar(&rss.channel,0)).text $bvar(&rss.feeds,1,$bvar(&rss.feeds,0)).text $bvar(&rss.interval,1,$bvar(&rss.interval,0)).text set %list %list $replacex($bvar(&rss.feed,1,$bvar(&rss.feed,0)).text,&,&,",", ,$chr(32),&color;,,&bold;,,&underline,) bunset &line &rss.* inc %Lcv2 } } inc %lcv } if ($window(@rss.performance)) { aline @rss.performance --- aline @rss.performance Parsed %lcv Config Lines ( $+ %lcv2 rss entries) (rss.cfg) in $calc(($ticks - %time)/1000) Seconds } } alias rsstimer { ;$1 = feed name ;$2 = host ;$3 = file ;$4 = channel ;$5 = max ;$6 = interval showrss $1 $2 $3 $4 $5 .timerrss. $+ $1 0 $6 showrss $1 $2 $3 $4 $5 } alias showrss { ;$1 = feed name ;$2 = host ;$3 = file ;$4 = channel ;$5 = max set %time. $+ $1 $ticks .remove " $+ $1 $+ .rss $+ " getrss $1 $2 $3 $replace($1 $+ .rss,$chr(32),_) parserss $replace($1 $+ .rss,$chr(32),_) $1 $4 $5 } alias getrss { ;$1 = feed name ;$2 = host ;$3 = file ;$4 = save ;$5- = done set %rss. $+ $1 $+ .file $3 set %rss. $+ $1 $+ .host $2 set %rss. $+ $1 $+ .save $4 set %rss. $+ $1 $+ .done $5- sockopen rss. $+ $1 $2 80 } on *:SOCKOPEN:rss.*:{ sockwrite -tn $sockname GET % [ $+ [ $sockname $+ .file ] ] HTTP/1.1 sockwrite -tn $sockname Host: % [ $+ [ $sockname $+ .host ] ] sockwrite -tn $sockname Accept: *.*, */* sockwrite -tn $sockname Connection: close sockwrite -tn $sockname $crlf } on *:sockclose:rss.*:{ fixrss % [ $+ [ $sockname $+ .save ] ] | % [ $+ [ $sockname $+ .done ] ] | unset % $+ $sockname $+ .* } on *:sockread:rss.*:{ if ($sockerr) { echo 1 -a ERROR | return } if (% [ $+ [ $sockname $+ .status ] ] != downloading) { var %1 | sockread %1 | tokenize 32 %1 if ($1 == HTTP/1.1) { if ($2 != 200 && $2 != 206) { echo 1 -a ERROR } } elseif ($1 == Content-Range:) { set % [ $+ [ $sockname $+ .size ] ] $gettok($3,-1,47) } elseif ($1 == Content-Type:) { return } elseif (!$1) { set % [ $+ [ $sockname $+ .status ] ] Downloading return } } else { var %1 = % [ $+ [ $sockname $+ .save ] ] :sockread sockread &1 if (!$sockbr) { return } bwrite $+(",%1,") -1 &1 unset % [ $+ [ $sockname $+ .resume ] ] } } alias fixrss { ;$1 = rss file var %file = $1 bread $1 0 $file($1).size &file breplace &file 10 32 13 32 write -c $1 var %lcv = 1 var %size = $bvar(&file,0) while (%lcv <= %size) { parserss2 $1 $bvar(&file,%lcv,500).text inc %lcv 500 } } alias parserss { ;$1 = rss file ;$2 = feed name ;$3 = channel ;$4 = max var %time = $ticks | var %lcv = 1 | var %lcv2 = 0 | var %lines = $file($1).size bread $1 0 %lines &file1 while ((%lcv <= %lines) && (%lcv2 < $4)) { bunset &line | bcopy -c &line 1 &file1 %lcv $calc($iif($bfind(&file1,%lcv,$crlf),$bfind(&file1,%lcv,$crlf),$calc(%lines + 1)) - %lcv) | var %lcv = $calc($iif($bfind(&file1,%lcv,$crlf),$bfind(&file1,%lcv,$crlf),$calc(%lines + 1)) + 2) if (($bvar(&line,0) < 300) && ($regex(RSS,$bvar(&line,1,$bvar(&line,0)).text,<(.+)>(.+)</.+>))) { if (($regml(RSS,1)) && ($regml(RSS,2))) { bunset &rss. $+ $gettok($regml(RSS,1),1,32) | bset -t &rss. $+ $gettok($regml(RSS,1),1,32) 1 $regml(RSS,2) } } elseif (($bvar(&line,0) < 300) && ($regex(RSS,$bvar(&line,1,$bvar(&line,0)).text,</item>))) { checkalreadyrss $3 [[ $+ $2 $+ ]] $+ 10 $bvar(&rss.title,1,$bvar(&rss.title,0)).text $+ (14 $bvar(&rss.link,1,$bvar(&rss.link,0)).text ) | inc %lcv2 | bunset &line &rss.* } } if ($window(@rss.performance)) { aline @rss.performance --- aline @rss.performance Parsed %lcv Bytes ( $+ %lcv2 rss entries) ( $+ $1 $+ ) in $calc(($ticks - %time)/1000) Seconds } if (%time. [ $+ [ $2 ] ]) { if ($window(@rss.performance)) { aline @rss.performance Downloaded and Parsed %lcv Bytes ( $+ %lcv2 rss entries) ( $+ $1 $+ ) in $calc(($ticks - %time. [ $+ [ $2 ] ] )/1000) Seconds } | unset %time. $+ $2 } } alias addrss { ;$1 = feed name ;$2 = host ;$3 = file ;$4 = channel ;$5 = max ;$6 = interval write rss.cfg <item> write rss.cfg $chr(32) $+ $chr(32) $+ <feed> $+ $1 $+ </feed> write rss.cfg $chr(32) $+ $chr(32) $+ <host> $+ $2 $+ </host> write rss.cfg $chr(32) $+ $chr(32) $+ <file> $+ $3 $+ </file> write rss.cfg $chr(32) $+ $chr(32) $+ <channel> $+ $4 $+ </channel> write rss.cfg $chr(32) $+ $chr(32) $+ <feeds> $+ $5 $+ </feeds> write rss.cfg $chr(32) $+ $chr(32) $+ <interval> $+ $6 $+ </interval> write rss.cfg </item> rsstimer $1 $2 $3 $4 $5 $6 } on *:TEXT:!rehashrss:#rss: { timerrss.* off rsscfg } alias rehashrss { timerrss.* off rsscfg } on *:TEXT:!rssoff:#rss: { timerrss.* off closersshist } alias rssoff { timerrss.* off closersshist } on 100:TEXT:!addrss * * * * * *:{ addrss $2 $3 $4 $5 $6 $7 } alias checkalreadyrss { if (sponsored isin $1-) { goto done } if ($file(rss.hist.tmp)) { .remove rss.hist.tmp } filter -ffc rss.hist rss.hist.tmp * $+ $strip($1-) $+ * if ($file(rss.hist.tmp)) { .remove rss.hist.tmp } if ($filtered > 0) { goto done } write rss.hist $strip($1-) ; if (!$window(@rss.hist)) { echo 4 -a $nopath($script) $+ : ERROR: no history loaded... (try /loadrsshist) | halt } ; aline @rss.hist $strip($1-) msg $replacex($1-,&,&,",", ,$chr(32),&color;,,&bold;,,&underline,) :done } alias loadrsshist { if (!$file(rss.hist).size) { write rss.hist History File } ; .window -k0lh @rss.hist ; .loadbuf @rss.hist rss.hist ; .window -k0 @rss.performance } alias parserss2 { ;$1 = File ;$2- = XML data var %file = $1 ;[Code by FiberOPtics] Thanks.. :P var %a, %b = $regsub($2-,/(?<=>)(?=s*<)/g,$lf,%a) tokenize 10 %a ;[/Code by FiberOPtics] var %lcv = 1 while (%lcv <= $0) { bset -t &tmp $calc($bvar(&tmp,0) +1) $ [ $+ [ %lcv ] ] $+ $crlf inc %lcv } bwrite %file -1 $calc($bvar(&tmp,0) -2) &tmp bunset &tmp } on *:TEXT:!rsslist:#rss:{ msg $chan I syndicate the following: | msg $chan %list } alias rsslist { msg $chan I syndicate the following: | msg $chan %list } on *:TEXT:!show *:#rss: { if ($2) { %rssin = $replace($2-,$, ) %rssinput = * $+ %rssin $+ * if (%rssin isin %list) { while $read(rss.hist, w, %rssinput) != $null { write -dw * $+ $2- $+ * rss.hist } rehashrss } else { msg # Sorry, I do not syndicate that feed. } } else { msg # What feed would you like to see? rsslist } } on *:JOIN:#RSS: { notice $nick Welcome to #RSS! I will be delivering the news here. Say "!help" to get started. } on *:TEXT:!help:#RSS: { msg # To see a list of feeds use "!rsslist" msg # To check for any updates use "!rehashrss" msg # To view a specific feed use "!show <feed>" } Quote Link to comment Share on other sites More sharing options...