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.
s
simo
Revered One
Posts: 1071
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.
s
simo
Revered One
Posts: 1071
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.
s
simo
Revered One
Posts: 1071
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.
s
simo
Revered One
Posts: 1071
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.
s
simo
Revered One
Posts: 1071
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.
s
simo
Revered One
Posts: 1071
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