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
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:
@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,&,&,—,-,",",<,<,>,>,«,<<,»,>>, ,$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
}
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?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...
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,)
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.