!feed - RSS reader for your Bot

By Spoofing on 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] [message format]

+auto -auto add or remove URL for autoupdate check.
^limit for length of tags:

this message length
%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: /
/\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:

!feed @test http://www.physorg.com/rss-feed/physics-news/ '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: !feed @test ??????: feed [+|-auto] [^?????] [%???????] [#?????] [@???] [=??????????] [~[$??????]|?????] [/???/?? ???] [??????] ??????: feed http://lenta.ru/rss - ???????? ????????? 2-? ????????. :: [+|-auto] ???./????. ????????????? ??????????. [^?????] ????????? ??????. [#?????] ????????? ????????. [@???] ?????. [=??????????] ????? (????? ??? ?????). [~[$??????]|?????] ?? ??????? ????? ?????????? ???????. [%???????] ?? ??????????. [/???/?? ???] ????????. ????? ?????. 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:

Line 146:       msg # Format: feed [+|-auto] [^limit] [%seconds] [#number] [@name] [=target] [~[$regex]|mask] [/replace/to] <URL> [Message format]
Line 147:      msg # Example: feed http://lenta.ru/rss - View latest 2 articles :: [+|-auto] On/Off. automatic updates. [^limit] maximum length. [%seconds] update interval. [#number] Number of items for show. [@name] name of feed. [=target] target (channel mask). [~[$regex]|mask] who will received messages from feed. [/replace/to] replace. <URL> address of the feed. [Message format] Message format for the feed. Any tags as: %title %author %description %link etc.
Line 156:     msg # Updating feed ( $+ $hget(feed.url,0).item $+ )...
Line 119/137: msg # Feed $+(,%request,) added to $+(,%target,)
 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

hadd -m $+(feed.,$hget(feed,id)) trunc %trunc

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

var %variable .hadd -m
%variable trunc %trunc

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.