!feed - RSS reader for your Bot

Platform:  mIRC
Published  Jan 07, 2011
Updated  Jan 07, 2011
This my very old script, from mIRC 6.35. Today I ported this script to mirc7.

Screenshot: http://img403.imageshack.us/img403/753/feedq.png

* autoupdate feeds and post to channel or nicknames
* any message format
* do not remember :)

Commands:
!feed [+|-auto] [^limit (bytes)] [%seconds] [#number] [@alias] [=target] [~[$regex]|mask] [/replace/to] <URL> [message format]

+auto -auto add or remove URL for autoupdate check.
^limit for length of tags: <title>this message length</title>
%seconds - interval for update
#number of items for show
@alias just name for feed
=target channel or *!any*@mask, who will received messages from feed
~$regex or ~*mask* for shows feeds
/replace/to - for example: /<br>/\n for new lines
URL - URL :)
message format - any message format for feed. any tags as: %title %author %description %link etc. \n for new line

!feedupdate - manually update of all feeds


As always, sorry about my english and russian language in snippet. ;) Just see code and screenshot :P alias feed.char {
var %i = 32, %str = $1
while (%i) var %str = $replace(%str,$chr(%i),$chr(32)), %i = %i - 1
return %str
}
alias feed.html {
var %str = $1
while (<![*[*]]> iswm %str) var %str = $mid(%str,$calc($pos(%str,[,2) + 1),-3)
var %str = $regsubex(%str,/<(.*?)>/g,)
;while ($pos(%str,<)) var %str = $remove(%str,$mid(%str,$v1,$calc($pos(%str,>) - $v1 + 1)))
if (*&#*;* iswm %str) var %str = $regsubex(%str,/&#(\d+?);/g,$utfdecode(\1))
return $replacex(%str,&amp;,&,&mdash;,-,&quot;,",&lt;,<,&gt;,>,&laquo;,<<,&raquo;,>>,&nbsp;,$chr(32))
}
alias feed.urlencode {
var %i = 255, %str = $1
while (%i >= 128) var %str = $replace(%str,$chr(%i),$+(%,$base(%i,10,16,2))), %i = %i - 1
return %str
}
alias feed.request {
var %scheme, %user, %pass, %ssl = $false, %address = $2, %request = /
if ($pos(%address,://)) {
var %address = $mid(%address,$calc($v1 + 3))
if ($v1 > 1) {
var %scheme = $mid($2,1,$calc($v1 - 1))
if (*s iswm %scheme) var %ssl = $true, %scheme = $left(%scheme,-1)
}
}
if ($pos(%address,/)) var %request = $gettok($mid(%address,$v1),1,35)
var %address = $gettok(%address,1,47)
if (*?:?*@* iswm %address) {
var %user = $gettok(%address,1,58)
var %pass = $gettok($gettok(%address,2,58),1,64)
}
if ($pos(%address,@)) var %address = $mid(%address,$calc($v1 + 1))
var %host = $gettok(%address,1,58)
var %port = $gettok(%address,2,58)
if ($sock($+(feed.,$1))) sockclose $v1
sockopen $iif(%ssl,-e) $+(feed.,$1) %host $iif(%port isnum,$v1,$iif(%ssl,443,80))
sockmark $+(feed.,$1) $+(%user,:,%pass) %request $3-
}
alias feed.database {
if ($1 == load) {
if ($lof(channels/feed.txt)) {
if ($fopen(feed)) .fclose $v1
.fopen feed channels/feed.txt
while (!$feof) {
var %read = $fread(feed)
if (* iswm %read) {
var %database = $mid($v2,2,-1)
if ($hget(%database)) hdel -w %database *
else hmake %database
}
else hadd %database %read
}
.fclose feed
}
}
elseif ($1 == save) {
if ($fopen(feed)) .fclose $v1
.fopen -no feed channels/feed.txt
var %i = 1
while ($hget(%i)) {
var %database = $v1, %o = 1, %i = %i + 1
if (feed* iswm %database) {
.fwrite -n feed $+(,%database,)
while ($hget(%database,%o).item) {
.fwrite -n feed $v1 $hget(%database,$v1)
inc %o
}
}
}
.fclose feed
}
}
on *:START: {
feed.database load
if ($hget(feed,created)) return
hmake feed
hmake feed.sockets
hmake feed.url
hadd feed created $ctime
feed.database save
}
on *:TEXT:*:#: {
if ($1 == !feed) {
var %auto, %alias, %request, %replace = $+($null,/,$null), %trunc = 250, %number = 2, %mask = *, %regex = .*, %time = 300, %target = #, %format = %title @ %link
while ($0 > 1) {
if ($2 == +auto) || ($2 == -auto) var %auto = $replace($2,+auto,$true,-auto,$false)
elseif (^?* iswm $2) var %trunc = $mid($2,2)
elseif (#?* iswm $2) var %number = $mid($2,2)
elseif (@?* iswm $2) var %alias = $mid($2,2)
elseif (=?* iswm $2) var %target = $mid($2,2)
elseif (~?* iswm $2) var %mask = $mid($2,2)
elseif (~$?* iswm $2) var %regex = $mid($2,2)
elseif (/?*/* iswm $2) var %replace = $mid($2,2)
elseif ($(%?*,) iswm $2) var %time = $mid($2,2)
else break
tokenize 32 $1 $3-
}
var %request = $2
if (%request) {
if ($3-) var %format = $v1
if (%auto == $true) {
if ($hfind(feed.url,%request).data) {
hinc feed id
hadd feed $v1 $hget(feed,$v1) $hget(feed,id)
hadd -m $+(feed.,$hget(feed,id)) trunc %trunc
hadd -m $+(feed.,$hget(feed,id)) mask %mask
hadd -m $+(feed.,$hget(feed,id)) regex %regex
hadd -m $+(feed.,$hget(feed,id)) target %target
hadd -m $+(feed.,$hget(feed,id)) number %number
hadd -m $+(feed.,$hget(feed,id)) alias %alias
hadd -m $+(feed.,$hget(feed,id)) time %time
hadd -m $+(feed.,$hget(feed,id)) replace %replace
hadd -m $+(feed.,$hget(feed,id)) format %format
hadd -m $+(feed.,$hget(feed,id)) ctime $ctime
hadd -m $+(feed.,$hget(feed,id)) nick $nick
hadd -m $+(feed.,$hget(feed,id)) address $address
msg # Лента $+(,%request,) добавлена для $+(,%target,)
}
else {
hinc feed id
hadd feed $hget(feed,id) $hget(feed,id)
hadd feed.url $hget(feed,id) %request
hadd -m $+(feed.,$hget(feed,id)) trunc %trunc
hadd -m $+(feed.,$hget(feed,id)) mask %mask
hadd -m $+(feed.,$hget(feed,id)) regex %regex
hadd -m $+(feed.,$hget(feed,id)) target %target
hadd -m $+(feed.,$hget(feed,id)) number %number
hadd -m $+(feed.,$hget(feed,id)) alias %alias
hadd -m $+(feed.,$hget(feed,id)) time %time
hadd -m $+(feed.,$hget(feed,id)) replace %replace
hadd -m $+(feed.,$hget(feed,id)) format %format
hadd -m $+(feed.,$hget(feed,id)) ctime $ctime
hadd -m $+(feed.,$hget(feed,id)) nick $nick
hadd -m $+(feed.,$hget(feed,id)) address $address
msg # Лента $+(,%request,) добавлена для $+(,%target,)
}
}
elseif (%auto == $false) {

}
else feed.request $ticks %request # %number %mask %target %trunc %regex %replace %format
}
else {
msg # Формат: feed [+|-auto] [^лимит] [%секунды] [#число] [@имя] [=получатель] [~[$регекс]|маска] [/что/на что] <URL> [формат]
msg # Пример: feed http://lenta.ru/rss - Просмотр последних 2-х новостей. :: [+|-auto] вкл./выкл. автосообщение обновлений. [^лимит] обрезания текста. [#число] выводимых новостей. [@имя] ленты. [=получатель] ленты (канал или маска). [~[$регекс]|маска] по которым будут отображены новости. [%секунды] до обновления. [/что/на что] заменить. <URL> адрес ленты. [формат] сообщения (по-умолчанию: %title @ %link).
}
}
elseif ($1 == !feedupdate) {
var %i = 1
while ($hget(feed.url,%i).item) {
feed.request $v1 $hget(feed.url,$v1)
inc %i
}
msg # Обновляю ленты ( $+ $hget(feed.url,0).item $+ )...
}
}
on *:PING: {
var %i = 1
while ($hget(feed.url,%i).item) {
var %id = $v1, %i = %i + 1
if ($calc($hget($+(feed.,%id),time) - ($ctime - $hget($+(feed.,%id),mtime))) > 0) continue
feed.request %id $hget(feed.url,%id)
}
if ($hget(feed,database)) {
hdel feed database
feed.database save
}
}
on *:SOCKOPEN:feed.*: {
tokenize 32 $sock($sockname).mark
if ($sockerr) {
if ($3-) msg $3 $+([,$sock($sockname).addr,:,$sock($sockname).port,]) $sock($sockname).wsmsg
}
else {
sockwrite -n $sockname GET $feed.urlencode($utfencode($2)) HTTP/1.0
sockwrite -n $sockname User-Agent: Mozilla/??
sockwrite -n $sockname Host: $+($sock($sockname).addr,$iif($sock($sockname).port != 80,$+(:,$v1)))
if (*?:?* iswm $1) sockwrite -n $sockname Authorization: Basic $encode($1,m)
sockwrite -n $sockname
if ($hget($sockname)) {
hadd $v1 mtime $ctime
hinc $v1 update
}
}
}
on *:SOCKREAD:feed.*: {
tokenize 32 $sock($sockname).mark
if ($sockerr) {
if ($3-) msg $3 $+([,$sock($sockname).addr,:,$sock($sockname).port,]) $sock($sockname).wsmsg
hdel feed.sockets $sockname
sockclose $sockname
}
else {
sockread $+(&packet.,$sockname)
if ($sockbr = 0) return
bcopy $+(&,$sockname) $calc($hget(feed.sockets,$sockname,$+(&,$sockname)) + 1) $+(&packet.,$sockname) 1 -1
bunset $+(&packet.,$sockname)
hadd -mb feed.sockets $sockname $+(&,$sockname)
}
if ($bvar($+(&,$sockname),0) = 0) return
if ($bfind($+(&,$sockname),1,</item)) {
bcopy $+(&packet.,$sockname) 1 $+(&,$sockname) $calc($v1 + 6) -1
hadd -b feed.sockets $sockname $+(&packet.,$sockname)
if ($3-) {
var %i = $bfind($+(&,$sockname),1,<item)
while ($bfind($+(&,$sockname),%i,<)) {
var %i = $v1 + 1, %> = $bfind($+(&,$sockname),%i,>), %xml = $gettok($bvar($+(&,$sockname),%i,$calc(%> - %i)).text,1,32)
if (%xml == /item) break
elseif (%xml == item) || (/* iswm %xml) continue
var %i = $bfind($+(&,$sockname),%i,</), %> = %> + 1, %data = $replace($bvar($+(&,$sockname),%>,$iif($calc(%i - %>) < 4096,$v1,$v2)).text, [ $replace($9,/,$chr(44)) ] )
hadd feed $+($sockname,.,xml) $hget(feed,$+($sockname,.,xml)) %xml
hadd feed $+($sockname,.,xml,.,%xml) $feed.char(%data)
}
var %i = 1, %sent, %format = $replace($10-,\r,$cr,\n,$lf,\t,$str($chr(160),4))
while ($gettok($hget(feed,$+($sockname,.,xml)),%i,32)) {
var %xml = $v1, %data = $feed.html($hget(feed,$+($sockname,.,xml,.,%xml))), %i = %i + 1
if ($isutf(%data)) var %data = $utfdecode(%data)
if ($5 iswm %data) && ($regex(%data,$8)) var %sent = $true
if ($len(%data) > $7) var %data = $left(%data,$7) ...
var %format = $replace(%format,$+(%,%xml),%data,\r,$cr,\n,$lf,\t,$str($chr(160),4))
hdel feed $+($sockname,.,xml,.,%xml)
}
hdel feed $+($sockname,.,xml)
if (%sent) {
hinc feed $+($sockname,.,sent)
var %crlf = 1
while ($gettok(%format,%crlf,10)) {
msg $6 $remove($v1,$cr)
inc %crlf
}
}
if ($hget(feed,$+($sockname,.,sent)) == $4) {
hdel -w feed $+($sockname,.,*)
hdel feed.sockets $sockname
sockclose $sockname
}
}
else {
var %i = $bfind($+(&,$sockname),1,<item)
if ($bfind($+(&,$sockname),%i,<title)) {
var %> = $bfind($+(&,$sockname),$v1,>) + 1, %hash = $hash($bvar($+(&,$sockname),%>,$iif($calc($bfind($+(&,$sockname),%>,</) - %>) > 4096,$v2,$v1)).text,32)
if ($istok($hget($sockname,hash),%hash,32)) {
hdel -w feed $+($sockname,.,*)
hdel feed.sockets $sockname
sockclose $sockname
}
else {
hadd feed database $ctime
while ($bfind($+(&,$sockname),%i,<)) {
var %i = $v1 + 1, %> = $bfind($+(&,$sockname),%i,>), %xml = $gettok($bvar($+(&,$sockname),%i,$calc(%> - %i)).text,1,32)
if (%xml == /item) break
elseif (%xml == item) || (/* iswm %xml) continue
var %i = $bfind($+(&,$sockname),%i,</), %> = %> + 1, %data = $feed.char($bvar($+(&,$sockname),%>,$iif($calc(%i - %>) < 4096,$v1,$v2)).text)
hadd feed $+($sockname,.,xml) $hget(feed,$+($sockname,.,xml)) %xml
hadd feed $+($sockname,.,xml,.,%xml) %data
}
var %i = 1, %list = $hget(feed,$gettok($sockname,2,46))
while ($gettok(%list,%i,32)) {
var %id = $v1, %i = %i + 1
hadd $+(feed.,%id) hash %hash $gettok($hget($+(feed.,%id),hash),1-16,32)
if ($hget(feed,$+($sockname,.,sent)) == $hget($+(feed.,%id),number)) continue
var %x = 1, %sent, %format = $replace($hget($+(feed.,%id),format),\r,$cr,\n,$lf,\t,$str($chr(160),4))
while ($gettok($hget(feed,$+($sockname,.,xml)),%x,32)) {
var %xml = $v1, %data = $feed.html($hget(feed,$+($sockname,.,xml,.,%xml))), %x = %x + 1
if ($isutf(%data)) var %data = $utfdecode(%data)
if ($hget($+(feed.,%id),mask) iswm %data) && ($regex(%data,$hget($+(feed.,%id),regex))) var %sent = $true
if ($len(%data) > $hget($+(feed.,%id),trunc)) var %data = $left(%data,$hget($+(feed.,%id),trunc)) ...
var %format = $replace(%format,$+(%,%xml),%data)
}
if (%sent) {
hinc feed $+($sockname,.,sent)
var %crlf = 1
while ($gettok(%format,%crlf,10)) {
msg $hget($+(feed.,%id),target) $remove($v1,$cr)
inc %crlf
}
}
}
}
}
}
}
elseif ($bvar($+(&,$sockname),0) > $calc(16 * 1024)) {
hdel -w feed $+($sockname,.,*)
hdel feed.sockets $sockname
sockclose $sockname
}
}
on *:SOCKCLOSE:feed.*: {
hdel -w feed $+($sockname,.,*)
hdel feed.sockets $sockname
}

Comments

Sign in to comment.
cptpan   -  Sep 23, 2012
I tried to add a feed url and it did nothing, then !feedupdate replied with:

Обновляю ленты (0)...
 Respond  
James405   -  Jul 15, 2012
is it me or has the auto update broken in the latest mirc? I can update feeds manually but auto just stopped!
 Respond  
fraguk   -  Mar 27, 2012
Any help with this script please, I cant get it to post the same rss feed url in more than 2 channels.
 Respond  
Pangaea   -  Mar 16, 2012
Hi, this looks promising, but forgive me for being a little confused as to the point of the manual triggering
To display feeds for a link manaly do i have to paste the rss link everytime?.. um what i mean is, is it possible to add an rss link into the script and name the rss feed for example Test1 ... then all ppl in the channel have to do it type !feed Test1 to get the latest news on whatever rss link was used, rather then ppl haveing to go onto the web.. navigate to the rss page, copy the link then do the command to trigger the news feed in chan.. kinda pointless since to get the link in the first place they would be already on the page where the news is, so why not just read the news there. ...

however I do understand the value of the auto feature of this, .. but surely with labling an rss feed for later triggering is kinda pointless for the reasons i stated above... is it possible to lable or name rss feeds with this script?

I did try this to add it:
<Pangaea>!feed @test http://www.physorg.com/rss-feed/physics-news/
<Bot> 'Faster-than-light' particles fade after cross-check @ http://www.physorg.com/news251121097.html

Then attempted to trigger it using only the name i gave it:
<Pangaea> !feed @test
<BOT> ??????: feed [+|-auto] [^?????] [%???????] [#?????] [@???] [=??????????] [~[$??????]|?????] [/???/?? ???] <URL> [??????]
<BOT> ??????: feed http://lenta.ru/rss - ???????? ????????? 2-? ????????. :: [+|-auto] ???./????. ????????????? ??????????. [^?????] ????????? ??????. [#?????] ????????? ????????. [@???] ?????. [=??????????] ????? (????? ??? ?????). [~[$??????]|?????] ?? ??????? ????? ?????????? ???????. [%???????] ?? ??????????. [/???/?? ???] ????????. <URL> ????? ?????.


do you see what i mean? it defeats the whole purpose of the convenience of being able to manually trigger news in channel on demand.

btw.. what is http://lenta.ru/rss? and why did the script show this address?
 Respond  
Lenooox   -  Jan 30, 2012
I added it, but still write it out this error
 Respond  
Jethro   -  Dec 18, 2011
Apparently you copied and pasted the script into your remote directly. Some of the hash tables are not made right before you've restarted your mIRC. To work around the error, locate hadd and hinc (if they don't have the -m switch already) commands and put a -m switch next to them. e.g.

hadd -m
hinc -m

so on and so forth...
 Respond  
Lenooox   -  Dec 18, 2011
i got an error :S
/hadd: insufficient parameters (line 53, rssfeed.mrc)
else hadd %database %read
 Respond  
Jeroenz0r   -  Feb 07, 2011
Feature request: if the name of the feed already is in the database override it.
a remove function also would come in handy, as editing a textfile isn't convenient.

Also, for English translation I made this:

Code

 

Code

 

Code

 

Code

 
 Respond  
jasonh   -  Jan 15, 2011
this worked for me for a little while, now only works manually.
no error msgs, just stopped working automatically
 Respond  
sunslayer   -  Jan 08, 2011
you left commented-out while in $feed.html, and when you have repetitive code like

Code

 
you can shorten it by setting the cmd as a var and just referencing the var, i.e.

Code

 
but thats just so you don't have to type as much.

you only need one -m tag in your hadd's as the table would have been created by the first

rest looks good though.
 Respond  
Are you sure you want to unfollow this person?
Are you sure you want to delete this?
Click "Unsubscribe" to stop receiving notices pertaining to this post.
Click "Subscribe" to resume notices pertaining to this post.