This is the new home of the egghelp.org community forum.
All data has been migrated (including user logins/passwords) to a new phpBB version.


For more information, see this announcement post. Click the X in the top right-corner of this box to dismiss this message.

Not Working 100%

Help for those learning Tcl or writing their own scripts.
User avatar
Dominatez
Halfop
Posts: 50
Joined: Mon Jan 14, 2019 5:08 pm
Location: United Kingdom

Not Working 100%

Post by Dominatez »

Hi,

Updated this script from a friend who is no longer active, but the life of me, i cannot get it to print out the news properly. I think i am doing something wrong possibly with the sort by or latest. News starts with
!news
BBC News: -
-
-

And prints nothing out.

Any help would be appreciated.

Grab a key from newsapi.org

Code: Select all

namespace eval newsy {
   namespace eval news {
    package require http
    package require json
    package require tls
        tls::init -tls1 true -ssl2 false -ssl3 false
    http::register https 443 tls::socket
    bind pub - !news newsy::news::search
	bind pub - !setnews newsy::news::source
    variable version "2.0"
    setudef flag news
    variable key "USE YOUR OWN KEY HERE... GET ONE FROM NEWSAPI.ORG"
    ::http::config -useragent "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"

  # Allow a user to save their choice of news source
  proc source {nick uhost hand chan text} {
      putlog "newsy::news::source nick: $nick, uhost: $uhost, hand: $hand"
      if { [string length $text] <= 0 } {
          puthelp "PRIVMSG $chan :Your source name seemed very short? Pick one from https://newsapi.org/sources"
          return
      }
      set url "https://newsapi.org/v2/sources?&apiKey=$newsy::news::key"
      set ids [getinfo $url]
      set ids [lindex $ids 3]
      set result [lsearch -regexp $ids $text]
      if { $result <= 0 } {
          puthelp "PRIVMSG $chan :Couldn't find source $text. Pick one from https://newsapi.org/sources"
          return
      }

      putlog "RESSULT: $result"
      set spam [lindex $ids $result]
      putlog "Name: [lindex $ids $result 3], Description: [lindex $ids $result 7]"

      if {![validuser $hand]} {
          adduser $nick
          set mask [maskhost [getchanhost $nick $chan]]
          setuser $nick HOSTS $mask
          chattr $nick -hp
          putlog "newsy::news::source added user $nick with host $mask"
      }
      setuser $hand XTRA newsy:news.source $text
      setuser $hand XTRA newsy:news.name [lindex $ids $result 3]
      puthelp "PRIVMSG $chan :set default source to [lindex $ids $result 3]([lindex $ids $result 1]) - [lindex $ids $result 7]"
      putlog "newsy::news::source $nick set their default source to $text."
  }

proc getinfo { url } {
    for { set i 1 } { $i <= 5 } { incr i } {
            set rawpage [::http::data [::http::geturl "$url" -timeout 5000]]
            if {[string length rawpage] > 0} { break }
        }
        putlog "newsy::news::getinfo Rawpage length is: [string length $rawpage]"
        if {[string length $rawpage] == 0} { error "newsapi returned ZERO no data or we could not connect properly." }
        set ids [dict get [json::json2dict $rawpage]]
    return $ids

}

proc search {nick uhost hand chan text} {
        if {![channel get $chan news] } {
                return
        }
    putlog "newsy::news::search is running"
    set source [getuser $hand XTRA newsy:news.source]
  set name [getuser $hand XTRA newsy:news.name]
  if {([string length $source] <= 0) || ([string length $name] <= 0) } {
      puthelp "PRIVMSG $chan :No default news source found for you. Please set one using !setnews"
      return
  }
  putlog "Grabbing news for $nick, with source of $source and name of $name"
    set url "https://newsapi.org/v2/top-headlines?source=$source&sortBy=latest&apiKey=$newsy::news::key"
    set ids [getinfo $url]
    for {set i 0} {$i < 3} {incr i} {
    set title [encoding convertfrom [lindex $ids 7 $i 3]]
        set url [lindex $ids 7 $i 7]
    if { $i == 0 } {
            set output "$name: \002$title\002 - $url"
    } else {
        set output "\002$title\002 - $url"
    }
    puthelp "PRIVMSG $chan :$output"
    }
}
}
}
putlog "newsy::news $newsy::news::version loaded"
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Code: Select all

namespace eval news {
	set news(key) ""

	set news(url) "https://newsapi.org/v2/top-headlines?sources=%source&sortBy=latest&apiKey=%key"
	set news(timeout) 5000

	package require http
	package require json
	package require tls

	proc tls:socket args {
	   set opts [lrange $args 0 end-2]
	   set host [lindex $args end-1]
	   set port [lindex $args end]
	   ::tls::socket -servername $host {*}$opts $host $port
	}

	bind pub * !news [namespace current]::fetch

	proc fetch {nick uhost hand chan text} {
		variable news
		if {[scan $text {%s} source] != 1} {
			puthelp "PRIVMSG $chan :Usage: !news <source> | Pick one from https://newsapi.org/sources"
			return
		}
		::http::register https 443 [namespace current]::tls:socket
		set url [string map [list "%source" "$source" "%key" "$news(key)"] $news(url)]
		set token [::http::geturl $url -timeout $news(timeout)]
		set data [::http::data $token]
		set json [::json::json2dict $data]
		::http::cleanup $token
		::http::unregister https
		if {[lsearch [dict get $json] "articles"] > -1} {
			foreach item [dict get $json articles] {
				dict with item {
					puthelp "PRIVMSG $chan :Ttitle: [encoding convertfrom $title] | desc: [encoding convertfrom $description] | url: $url"
				}
			}
		} else {
			puthelp "PRIVMSG $chan :The specified source is invalid, pick one from https://newsapi.org/sources"
			# To see exact error message uncomment next line
			#puthelp "PRIVMSG $chan: Error: [dict get $json message]"
		}
	}
}
Haven't tested this on a bot, but I can confirm it works nicely on tclsh:

Code: Select all

title: Venezuela's Guaido vows to open aid routes | desc: The opposition leader says he will "do everything possible", and calls for distribution volunteers. | url: http://www.bbc.co.uk/news/world-latin-america-47184755

title: May to ask MPs for more time on Brexit | desc: The PM is expected to promise MPs another vote if she has not secured a revised deal this month. | url: http://www.bbc.co.uk/news/uk-47187491

title: Was Ruskin the most important man of the last 200 years? | desc: In the bicentenary of his birth, itâs time we looked again at the forward-thinking and influential ideas of the great Victorian, writes Daisy Dunn. | url: http://www.bbc.com/culture/story/20190207-was-ruskin-the-most-important-man-of-the-last-200-years

title: IS resists 'final push' in eastern Syria | desc: US-backed guerrillas target what they say is the last pocket of IS resistance near the Iraqi border. | url: http://www.bbc.co.uk/news/world-middle-east-47188355

title: Thousands flee New Zealand wildfire | desc: Thousands of people are evacuated as the blaze rages near Nelson in the country's South Island. | url: http://www.bbc.co.uk/news/world-asia-47187604

title: 'I went vegan to hide my eating disorder' | desc: Veganism is definitely having a moment, and for Rebecca Hills, 20, it was a way of hiding in plain sight. | url: http://www.bbc.co.uk/news/stories-47176759

title: How school yearbooks have the power to destroy lives | desc: It has been a tradition in the US for decades - but recent events have highlighted their dark side. | url: http://www.bbc.co.uk/news/world-us-canada-47145908

title: Shut detention camps, Turkey tells China | desc: The statement follows the reported death in a camp of a prominent musician from the Uighur minority. | url: http://www.bbc.co.uk/news/world-asia-47187170

title: Warren launches White House 2020 bid | desc: Mr Trump's campaign team responds by calling her a fraud and saying her ideas are socialist. | url: http://www.bbc.co.uk/news/world-us-canada-47185724

title: Virginia's painful 'blackface' past and present | desc: A scandal has engulfed the political leadership of the US state. What do the voters make of it? | url: http://www.bbc.co.uk/news/world-us-canada-47175239
Just put in your API key and try it with !news bbc-news for example.

This is just a proof-of-concept that I'm not going to take further, or at least not right now cos I'm a bit busy.

Edit: Fixed missing $ and added unregister for https.

Later edit: Fixed the missing space between $chan and :
Last edited by caesar on Thu Feb 28, 2019 12:04 pm, edited 4 times in total.
Once the game is over, the king and the pawn go back in the same box.
Online
s
simo
Revered One
Posts: 1078
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

ive tried it out and it returned this error:

12:17:45 (simo) : !news
12:17:46 (@Cappuccino) : No default news source found for you. Please set one using !setnews
12:17:51 (simo) : !setnews
12:17:52 (@Cappuccino) : Your source name seemed very short? Pick one from https://newsapi.org/sources
not sure how to add newsource i checked the link but its not clear what to add i tried copying a source link and setnews but it complained about this in PL
<Cappuccino> [12:19:08] newsy::news::getinfo Rawpage length is: 0
<Cappuccino> [12:19:08] Tcl error [newsy::news::source]: newsapi returned ZERO no data or we could not connect properly
also the reason for it not printing anything out for you might be because u didnt enable it in partyline for the channel using .chanset #channel +news


i also tried :
didnt seem to add neither when doing !news abc-news gettin this on PL

[12:33:15] newsy::news::search is running

but no output on channel
User avatar
Dominatez
Halfop
Posts: 50
Joined: Mon Jan 14, 2019 5:08 pm
Location: United Kingdom

Post by Dominatez »

Simo

You use !setnews then the source you want.. for instance

!setnews abc-news

And i did set the channel, and put that it prints the following to channel.

BBC News -
-
-

Where it should be listing the top 3 latest headlines.
Online
s
simo
Revered One
Posts: 1078
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

i did just that

!setnews -abc-news
i get nothing in channel
but get this error in PL
<Cappuccino> [12:12:02] newsy::news::getinfo Rawpage length is: 0

<Cappuccino> [12:12:02] Tcl error [newsy::news::source]: newsapi returned ZERO no data or we could not connect properly.
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

@simo He said to try with !setnews abc-news, notice the missing - that's in front of abc in your example.
Once the game is over, the king and the pawn go back in the same box.
Online
s
simo
Revered One
Posts: 1078
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

it was a typo here but on irc i did !setnews abc-news

im not sure what i did wrong and why it keeps complaining

this is what i got so far

Code: Select all

namespace eval newsy { 
   namespace eval news { 
    package require http 
    package require json 
    package require tls 
        tls::init -tls1 true -ssl2 false -ssl3 false 
    http::register https 443 tls::socket 
    bind pub - !news newsy::news::search 
   bind pub - !setnews newsy::news::source 
    variable version "2.0" 
    setudef flag news 
    variable key "my-key" 
    ::http::config -useragent "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36" 

  # Allow a user to save their choice of news source 
  proc source {nick uhost hand chan text} { 
      putlog "newsy::news::source nick: $nick, uhost: $uhost, hand: $hand" 
      if { [string length $text] <= 0 } { 
          puthelp "PRIVMSG $chan :Your source name seemed very short? Pick one from https://newsapi.org/sources" 
          return 
      } 
      set url "https://newsapi.org/v2/sources?&apiKey=$newsy::news::key" 
      set ids [getinfo $url] 
      set ids [lindex $ids 3] 
      set result [lsearch -regexp $ids $text] 
      if { $result <= 0 } { 
          puthelp "PRIVMSG $chan :Couldn't find source $text. Pick one from https://newsapi.org/sources" 
          return 
      } 

      putlog "RESSULT: $result" 
      set spam [lindex $ids $result] 
      putlog "Name: [lindex $ids $result 3], Description: [lindex $ids $result 7]" 

      if {![validuser $hand]} { 
          adduser $nick 
          set mask [maskhost [getchanhost $nick $chan]] 
          setuser $nick HOSTS $mask 
          chattr $nick -hp 
          putlog "newsy::news::source added user $nick with host $mask" 
      } 
      setuser $hand XTRA newsy:news.source $text 
      setuser $hand XTRA newsy:news.name [lindex $ids $result 3] 
      puthelp "PRIVMSG $chan :set default source to [lindex $ids $result 3]([lindex $ids $result 1]) - [lindex $ids $result 7]" 
      putlog "newsy::news::source $nick set their default source to $text." 
  } 

proc getinfo { url } { 
    for { set i 1 } { $i <= 5 } { incr i } { 
            set rawpage [::http::data [::http::geturl "$url" -timeout 5000]] 
            if {[string length rawpage] > 0} { break } 
        } 
        putlog "newsy::news::getinfo Rawpage length is: [string length $rawpage]" 
        if {[string length $rawpage] == 0} { error "newsapi returned ZERO no data or we could not connect properly." } 
        set ids [dict get [json::json2dict $rawpage]] 
    return $ids 

} 

proc search {nick uhost hand chan text} { 
        if {![channel get $chan news] } { 
                return 
        } 
    putlog "newsy::news::search is running" 
    set source [getuser $hand XTRA newsy:news.source] 
  set name [getuser $hand XTRA newsy:news.name] 
  if {([string length $source] <= 0) || ([string length $name] <= 0) } { 
      puthelp "PRIVMSG $chan :No default news source found for you. Please set one using !setnews" 
      return 
  } 
  putlog "Grabbing news for $nick, with source of $source and name of $name" 
    set url "https://newsapi.org/v2/top-headlines?source=$source&sortBy=latest&apiKey=$newsy::news::key" 
    set ids [getinfo $url] 
    for {set i 0} {$i < 3} {incr i} { 
    set title [encoding convertfrom [lindex $ids 7 $i 3]] 
        set url [lindex $ids 7 $i 7] 
    if { $i == 0 } { 
            set output "$name: \002$title\002 - $url" 
    } else { 
        set output "\002$title\002 - $url" 
    } 
    puthelp "PRIVMSG $chan :$output" 
    } 
} 
} 
} 
putlog "newsy::news $newsy::news::version loaded"
User avatar
Dominatez
Halfop
Posts: 50
Joined: Mon Jan 14, 2019 5:08 pm
Location: United Kingdom

Post by Dominatez »

Hi caeser,

i am getting the following error.

Tcl error [::news::fetch]: Bad value for -timeout (news(timeout)), must be integer
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Missed an $ there. Find news(timeout) and make it $news(timeout) and should work.
Once the game is over, the king and the pawn go back in the same box.
Online
s
simo
Revered One
Posts: 1078
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

hey there caesar i tried your version of the tcl and it returns this on !news abc-news
Tcl error [::news::fetch]: wrong # args: should be "tls::socket ?options? host port"

Code: Select all


namespace eval news { 
   set news(key) "MY-KEY" 

   set news(url) "https://newsapi.org/v2/top-headlines?sources=%source&sortBy=latest&apiKey=%key" 
   set news(timeout) 5000 

   package require http 
   package require json 
   package require tls 

   proc tls:socket args { 
      set opts [lrange $args 0 end-2] 
      set host [lindex $args end-1] 
      set port [lindex $args end] 
      ::tls::socket -servername $host {*}$opts $host $port 
   } 

   bind pub * !news [namespace current]::fetch 

   proc fetch {nick uhost hand chan text} { 
      variable news 
      if {[scan $text {%s} source] != 1} { 
         puthelp "PRIVMSG $chan :Usage: !news <source> | Pick one from https://newsapi.org/sources" 
         return 
      } 
      ::http::register https 443 [namespace current]::tls:socket 
      set url [string map [list "%source" "$source" "%key" "$news(key)"] $news(url)] 
      set token [::http::geturl $url -timeout $news(timeout)] 
      set data [::http::data $token] 
      set json [::json::json2dict $data] 
      ::http::cleanup $token 
      ::http::unregister https 
      if {[lsearch [dict get $json] "articles"] > -1} { 
         foreach item [dict get $json articles] { 
            dict with item { 
               puthelp "PRIVMSG $chan: Ttitle: [encoding convertfrom $title] | desc: [encoding convertfrom $description] | url: $url" 
            } 
         } 
      } else { 
         puthelp "PRIVMSG $chan :The specified source is invalid, pick one from https://newsapi.org/sources" 
         # To see exact error message uncomment next line 
         #puthelp "PRIVMSG $chan: Error: [dict get $json message]" 
      } 
   } 
} 
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

By any chance you have the tls:socket defined in some other place? I'm asking cos the version in my code takes any or no arguments, yet the error "tls::socket ?options? host port" tells me that you do, so be sure you don't.
Once the game is over, the king and the pawn go back in the same box.
Online
s
simo
Revered One
Posts: 1078
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

i checked and unloaded all scripts and checked entire conf and made sure
yet still same error
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Code: Select all

% package require http
2.8.12
% package require tls
1.6.7
% proc tls:socket args {
        set opts [lrange $args 0 end-2]
        set host [lindex $args end-1]
        set port [lindex $args end]
        ::tls::socket -servername $host {*}$opts $host $port
}
% ::http::register https 443 tls:socket
443 tls:socket
%
It's still something on your side. Did you restart the bot after unloading scripts?
Once the game is over, the king and the pawn go back in the same box.
Online
s
simo
Revered One
Posts: 1078
Joined: Sun Mar 22, 2015 2:41 pm

Post by simo »

hm ok yes i restarted not sure where i went wrong as i used it as is
User avatar
caesar
Mint Rubber
Posts: 3776
Joined: Sun Oct 14, 2001 8:00 pm
Location: Mint Factory

Post by caesar »

Should I take it that was right and now it's working?
Once the game is over, the king and the pawn go back in the same box.
Post Reply