Jump to content
chain

youtube.tcl

Recommended Posts

  • Administrators
Posted
# +-------------------------------------------------------------------------------------+
# |                                                                                     |
# |                         YouTUBE Script v2.0.0                                       |
# |                                                                                     |
# +-------------------------------------------------------------------------------------+
# |                                                                                     |
# | *** Website             @  http://www.EggdropTCL.com                                |
# | *** GitHub              @  http://github.com/MadaliNTCL/eggdrop-tcl                 |
# |                                                                                     |
# +-------------------------------------------------------------------------------------+
# | *** IRC Support:                                                                    |
# |                    #EggdropTCL     @ QuakeNET                                       |
# |                    #EggdropTCL     @ UnderNET                                       |
# |                    #EggdropTCL     @ EfNET                                          |
# |                                                                                     |
# | *** Contact:                                                                        |
# |                    Yahoo Messenger/Mail: madalinmen28@yahoo.com                     |
# |                    Google Mail         : madalinmen28@gmail.com                     |
# |                    Skype Messenger     : madalinmen28                               |
# |                                                                                     |
# +-------------------------------------------------------------------------------------+
# + *** Commands ***                                                                    |
# |     +---------------+                                                               |
# |     [ OP - PUBLIC]                                                                  |
# |     +---------------+                                                               |
# |                                                                                     |
# |     +++ !youtube on                                                                 |
# |     +++ !youtube off                                                                |
# |                                                                                     |
# | IMPORTANT:                                                                          |
# |                                                                                     |
# | 500 requests per day                                                                |
# | You need Google Api Key                                                             |
# |                                                                                     |
# | Updates:                                                                            |
# | * v2                                                                                |
# | -- It now catches the youtube link from /me and /ame                                |
# +-------------------------------------------------------------------------------------+

bind PUBM - * youtube
bind PUBM - * youtube:pubm
bind CTCP - ACTION youtube:act

package require json
package require http
package require tls

set youtube(api) "youtube api key"
set youtube(version) "2.0"

setudef flag youtube

proc youtube:pubm {nick uhost hand chan arg} {
	global temp

	if {[string index $arg 0] in {! . `}} {
		set temp(cmd) [string range $arg 1 end]
		set temp(cmd) [lindex [split $temp(cmd)] 0]
		set arg [join [lrange [split $arg] 1 end]]
	} elseif {[isbotnick [lindex [split $arg] 0]]} {
		set temp(cmd) [lindex [split $arg] 1]
		set arg [join [lrange [split $arg] 2 end]]
	} else { return 0 }

	if {[info commands ytpubm:$temp(cmd)] ne ""} { ytpubm:$temp(cmd) $nick $uhost $hand $chan $arg }
}

proc ytpubm:youtube {nick uhost hand chan arg} {
	global youtube tempYT

	switch -exact -- [lindex [split $arg] 0] {
		on {
			if {[isop $nick $chan] || [matchattr $hand n]} {
				channel set $chan +youtube

				putserv "PRIVMSG $chan :\002$nick\002 - \00302Set channel mode \00306+youtube\0032 on \00304$chan"
				return
			}
		}
		off {
			if {[isop $nick $chan] || [matchattr $hand n]} {
				channel set $chan -youtube

				putserv "PRIVMSG $chan :\002$nick\002 - \00302Set channel mode \00306-youtube\0032 on \00304$chan"
				return
			}
		}
		top {}
		search {
			::http::register https 443 [list ::tls::socket -tls1 1]

			if {[catch {http::geturl "https://www.googleapis.com/youtube/v3/videos?[http::formatQuery key $youtube(api) maxresults 5 part id,snippet type video order viewCount q [lindex [split $arg] 1]]"} tok]} {
				putlog "Socket error: $tok"
				return 0
			}
			if {[http::status $tok] ne "ok"} {
				set status [http::status $tok]

				putlog "TCP error: $status"
				return 0
			}
			if {[http::ncode $tok] != 200} {
				set code [http::code $tok]
				http::cleanup $tok

				putlog "HTTP Error: $code"
				return 0
			}

			set data [http::data $tok]

			set parse [::json::json2dict $data]

			set tempYT(video1) "[lindex [dict get [lindex [dict get $parse items] 0] id] 3] [lindex [dict get [lindex [dict get $parse items] 0] snippet] 5]"
			set tempYT(video2) "[lindex [dict get [lindex [dict get $parse items] 1] id] 3] [lindex [dict get [lindex [dict get $parse items] 1] snippet] 5]"
			set tempYT(video3) "[lindex [dict get [lindex [dict get $parse items] 2] id] 3] [lindex [dict get [lindex [dict get $parse items] 2] snippet] 5]"
			set tempYT(video4) "[lindex [dict get [lindex [dict get $parse items] 3] id] 3] [lindex [dict get [lindex [dict get $parse items] 3] snippet] 5]"			
			set tempYT(video5) "[lindex [dict get [lindex [dict get $parse items] 4] id] 3] [lindex [dict get [lindex [dict get $parse items] 4] snippet] 5]"
			
			putserv "PRIVMSG $chan :\002\00301,00You\00300,04Tube\002\017 - \00304Top 5\00302 videos based on \00303viewCount\003"

			set number 0
			foreach line [array names tempYT] {
				if {[llength $line]} {
					incr number
					
					set id "[lindex $tempYT($line) 0]"
					set title "[join [lrange $tempYT($line) 1 end]]"
					
					putserv "PRIVMSG $chan :$number. \00302Title - \00312$title\003 \037\002/\037\002 \00302Link\003: \00304https://www.youtube.com/watch?v=$id"
				}
			}
		}
	}
}

proc youtube:act {nick uhost hand dest key arg} {
	global ytignore youtube

	if {![channel get $dest youtube]} { return 0 }
	if {![string match -nocase *yout* $arg]} { return 0 }

	## ++
	set floodtime 10

	## ++
	if {![info exists ytignore($nick)]} {
		set ytignore($nick) [unixtime]
		utimer $floodtime [list unset -nocomplain ytignore($nick)]
	}

	## ++
	if {[expr [unixtime]-$ytignore($nick)]>$floodtime} { putlog "ignoram"; return 0 }

	set youtubecheck [regexp -all -nocase {(?:\/watch\?v=|youtu\.be\/)([\d\w-]{11})} $arg match youtubeid]

	youtube:parse $youtubecheck $match $youtubeid $dest
}

proc youtube {nick uhost hand chan arg} {
	global ytignore youtube

	if {![channel get $chan youtube]} { return 0 }
	if {![string match -nocase *yout* $arg]} { return 0 }

	## ++
	set floodtime 10

	## ++
	if {![info exists ytignore($nick)]} {
		set ytignore($nick) [unixtime]
		utimer $floodtime [list unset -nocomplain ytignore($nick)]
	}

	## ++
	if {[expr [unixtime]-$ytignore($nick)]>$floodtime} { putlog "ignoram"; return 0 }

	set youtubecheck [regexp -all -nocase {(?:\/watch\?v=|youtu\.be\/)([\d\w-]{11})} $arg match youtubeid]

	youtube:parse $youtubecheck $match $youtubeid $chan
}

proc youtube:parse {youtubecheck match youtubeid dest} {
	global ytignore youtube

	::http::register https 443 [list ::tls::socket -tls1 1]

	if {[catch {http::geturl "https://www.googleapis.com/youtube/v3/videos?[http::formatQuery id $youtubeid key $youtube(api) part snippet,contentDetails,statistics,status]"} tok]} {
		putlog "Socket error: $tok"
		return 0
	}
	if {[http::status $tok] ne "ok"} {
		set status [http::status $tok]

		putlog "TCP error: $status"
		return 0
	}
	if {[http::ncode $tok] != 200} {
		set code [http::code $tok]
		http::cleanup $tok

		putlog "HTTP Error: $code"
		return 0
	}	

	set data [http::data $tok]
	set parse [::json::json2dict $data]

	set playtime [lindex [dict get [lindex [dict get $parse items] 0] snippet] 1]
	set title [lindex [dict get [lindex [dict get $parse items] 0] snippet] 5]
	set viewCount [lindex [dict get [lindex [dict get $parse items] 0] statistics] 1]
	set likeCount [lindex [dict get [lindex [dict get $parse items] 0] statistics] 3]
	set dislikeCount [lindex [dict get [lindex [dict get $parse items] 0] statistics] 5]
	set commentCount [lindex [dict get [lindex [dict get $parse items] 0] statistics] 9]
	set publishedAt [lindex [dict get [lindex [dict get $parse items] 0] snippet] 1]
	set publishedAt [string map [list "T" " " ".000Z" ""] $publishedAt]
	set channelTitle [lindex [dict get [lindex [dict get $parse items] 0] snippet] 11]
	set duration [lindex [dict get [lindex [dict get $parse items] 0] contentDetails] 1]
	set duration [string map [list "PT" "" "M" "m " "S" "s"] $duration]
	set definition [string toupper [lindex [dict get [lindex [dict get $parse items] 0] contentDetails] 5]]

	putserv "PRIVMSG $dest :\002\00301,00You\00300,04Tube\002\017 \00312$title\003 \002\00304$definition\003\002 \037\002/\002\037 \00302Views\003: \00303[youtube:convert $viewCount]\003 \037\002/\002\037 \00302Likes\003: \00310[youtube:convert $likeCount]\003 \037\002/\002\037 \00302Dislikes\003: \00304[youtube:convert $dislikeCount]\003 \037\002/\002\037 \00302Comments\003: \00304[youtube:convert $commentCount]\003 \037\002/\002\037 \00302Duration: \00304$duration\003 \037\002/\002\037 \00302Published at: \00304$publishedAt\003 by \00312$channelTitle"
}

proc youtube:convert {num} { while {[regsub {^([-+]?\d+)(\d\d\d)} $num "\\1.\\2" num]} {}; return $num }

putlog "++ \[ - \00304PUBLIC\003 - \00306loaded\003 * \00303YouTUBE\003 \]"

 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...


×
×
  • Create New...