Advertisement
illpastethat

YouTube Script (Parse Vids and Search) v4.4

Mar 17th, 2012
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 16.86 KB | None | 0 0
  1. ;YouTube Script (Parse Vids and Search) v4.4
  2. ;Made by nick1
  3. ;Last edit March 18 2012
  4. ;For help type /YouTube in mIRC
  5. ;2D0 -- Download videos in a few formats [[possible?]], anything else?
  6. ;EDITS -- Improved the searching speed and reliability by 340%, added a nick settings tab to dialog, added option to send without formatting, removed channel settings management via bot (only dialog now)
  7.  
  8. menu status,channel,query {
  9.   YouTube:youtube
  10. }
  11. alias YouTube {
  12.   dialog -m YouTube YouTube
  13. }
  14.  
  15. dialog Youtube {
  16.   title "YouTube Script (Parse Vids and Search) v4.5"
  17.   size -1 -1 226 138
  18.   option dbu
  19.   icon $mircdir $+ Youtube.ico, 0
  20.   link "View Script On Hawkee -- Report Bugs Here", 1, 58 3 105 8
  21.   button "Exit", 7, 77 125 72 12, cancel
  22.   tab "About", 10, 0 11 225 110
  23.   button "On", 15, 38 97 37 12, tab 10
  24.   button "Off", 16, 148 97 37 12, tab 10
  25.   text "This script was created by nick1 (Rizon Network)", 18, 2 26 116 8, tab 10
  26.   text "Last updated on March 18, 2012", 19, 3 34 104 11, tab 10
  27.   text "Please post suggestions, complaints, or bugs on the hawkee link (or in chat)", 20, 3 43 195 8, tab 10
  28.   text "The script automatically will attempt to protect itself from spam", 21, 3 52 174 8, tab 10
  29.   text "!commands will notice the user; @commands will be public to the channel", 13, 3 78 175 8, tab 10
  30.   text "On/Off Buttons will Enable/Disable the entire script", 17, 48 111 125 7, tab 10
  31.   text "By default the script will run on every channel. To disable for a channel use the Channel Settings tab. Nick Settings tab to disable for a certain nick. (useful for other bots)", 65, 3 61 217 15, tab 10
  32.   link "Click here to chat (leave a message for nick1)", 66, 108 34 110 8, tab 10
  33.   check "Do *NOT* Format (colorize//bold) the output (red and blue) (if checked is plain)", 67, 2 88 218 9, tab 10
  34.   tab "Parse", 11
  35.   button "On", 111, 38 97 37 12, tab 11
  36.   button "Off", 9, 148 97 37 12, tab 11
  37.   text "This part of the script will automatically find youtube links that other people post and message the channel with info about the video.", 22, 4 29 205 14, tab 11
  38.   text "The script will return the following information: Title, Views, and User. ", 23, 22 54 174 10, tab 11
  39.   text "There is automatic flood protection enabled so the script will not process the same link twice in a row", 24, 3 74 201 13, tab 11
  40.   text "On/Off Buttons will Enable/Disable the parsing section of the script", 25, 32 110 162 7, tab 11
  41.   tab "Search", 2
  42.   button "On", 5, 38 97 37 12, tab 2
  43.   button "Off", 14, 148 97 37 12, tab 2
  44.   text "This part of the script will automatically find the most relevant YouTube video to the provided search terms.", 57, 3 26 207 13, tab 2
  45.   text "The script will return the following information: Link, Title, Views, and User.", 58, 19 42 182 13, tab 2
  46.   text "Commands may be prefixed with an ! or an @; with !commands private and @commands public to the channel.", 59, 3 56 201 13, tab 2
  47.   box "Search Commands -- Prefix With ! or @ --", 60, 21 72 175 22, tab 2
  48.   text "On/Off Buttons will Enable/Disable the search section of the script", 61, 32 109 159 7, tab 2
  49.   text "ysearch <search terms>; ytsearch <search terms>;youtube <search terms>", 62, 31 79 156 13, tab 2
  50.   tab "Channel Settings", 3
  51.   list 6, 6 58 202 54, tab 3 sort size extsel vsbar
  52.   edit "", 8, 7 28 155 25, tab 3 multi autohs autovs
  53.   text "List of channels the script will NOT run on", 12, 46 52 101 6, tab 3
  54.   button "Add", 4, 170 29 37 12, tab 3
  55.   button "Remove", 63, 170 44 37 12, tab 3
  56.   button "Click here to enter #channels ...", 64, 8 29 153 23, tab 3
  57.   tab "Nick Settings", 26
  58.   text "List of nicks the script will NOT run for", 70, 46 52 101 6, tab 26
  59.   list 71, 6 58 202 54, tab 26 sort size extsel vsbar
  60.   button "Remove", 72, 170 44 37 12, tab 26
  61.   button "Add", 73, 170 29 37 12, tab 26
  62.   edit "", 69, 7 28 155 25, tab 26 multi autohs autovs
  63.   button "Click here to enter Nicks ...", 74, 8 29 153 23, tab 26
  64.   tab "Just For Fun", 68
  65.   text "See if you can check all the checkboxes! Warning: there might not be a reward.", 27, 23 54 144 17, tab 68
  66.   check "Check Box", 44, 121 26 50 10, tab 68
  67.   check "Check Box", 43, 128 34 50 10, tab 68
  68.   check "Check Box", 53, 133 44 50 10, tab 68
  69.   check "Check Box", 42, 126 60 50 10, tab 68
  70.   check "Check Box", 51, 128 75 50 10, tab 68
  71.   check "Check Box", 41, 110 69 50 10, tab 68
  72.   check "Check Box", 35, 85 75 50 10, tab 68
  73.   check "Check Box", 34, 74 84 50 10, tab 68
  74.   check "Check Box", 39, 80 94 50 10, tab 68
  75.   check "Check Box", 55, 88 100 50 10, tab 68
  76.   check "Check Box", 38, 130 102 50 10, tab 68
  77.   check "Check Box", 47, 129 92 50 10, tab 68
  78.   check "Check Box", 37, 123 84 50 10, tab 68
  79.   check "Check Box", 54, 46 101 50 10, tab 68
  80.   check "Check Box", 49, 24 103 50 10, tab 68
  81.   check "Check Box", 40, 27 95 50 10, tab 68
  82.   check "Check Box", 56, 31 85 50 10, tab 68
  83.   check "Check Box", 33, 16 82 50 10, tab 68
  84.   check "Check Box", 48, 12 70 50 10, tab 68
  85.   check "Check Box", 50, 37 71 50 10, tab 68
  86.   check "Check Box", 52, 77 65 50 10, tab 68
  87.   check "Check Box", 46, 79 43 50 10, tab 68
  88.   check "Check Box", 36, 92 33 50 10, tab 68
  89.   check "Check Box", 45, 45 39 50 10, tab 68
  90.   check "Check Box", 31, 25 35 50 10, tab 68
  91.   check "Check Box", 30, 40 27 50 10, tab 68
  92.   check "Check Box", 28, 5 27 50 10, tab 68
  93.   check "Check Box", 29, 6 37 50 10, tab 68
  94.   check "Check Box", 32, 4 45 50 10, tab 68
  95.   check "Check Box", 75, 150 78 50 10, tab 68
  96.   check "Check Box", 76, 160 39 50 10, tab 68
  97.   check "Check Box", 77, 168 26 50 10, tab 68
  98.   check "Check Box", 78, 162 58 50 10, tab 68
  99.   check "Check Box", 79, 163 88 50 10, tab 68
  100.   check "Check Box", 80, 175 99 50 10, tab 68
  101.   check "Check Box", 81, 145 107 50 10, tab 68
  102.   check "Check Box", 82, 164 66 50 10, tab 68
  103.   check "Check Box", 83, 171 75 50 10, tab 68
  104.   check "Check Box", 84, 172 47 50 10, tab 68
  105.   check "Check Box", 85, 166 34 50 10, tab 68
  106.   check "Check Box", 86, 74 108 50 10, tab 68
  107.   check "Check Box", 87, 4 91 50 10, tab 68
  108. }
  109.  
  110. on *:dialog:youtube:init:0: {
  111.   FillChannelBox
  112.   FillNickBox
  113.   if (%youtubenocolor == true) {
  114.     did -c youtube 67
  115.   }
  116. }
  117.  
  118. alias FillChannelBox {
  119.   did -r youtube 6
  120.   var %y 1
  121.   while (%y <= $numtok(%youtubefetch,44)) {
  122.     did -a youtube 6 $gettok(%youtubefetch,%y,44)
  123.     inc %y
  124.   }
  125. }
  126.  
  127. alias FillNickBox {
  128.   did -r youtube 71
  129.   var %y 1
  130.   while (%y <= $numtok(%nolinks,44)) {
  131.     did -a youtube 71 $gettok(%nolinks,%y,44)
  132.     inc %y
  133.   }
  134. }
  135.  
  136. on *:dialog:youtube:sclick:*: {
  137.   if ($did == 1) {
  138.     run http://www.hawkee.com/snippet/8577/
  139.   }
  140.   elseif ($did == 66) {
  141.     run https://qchat.rizon.net/?&channels=#rsbot_help&nick=YouTube..
  142.   }
  143.   elseif ($did == 67) {
  144.     set %youtubenocolor $iif($did(67).state,true,false)
  145.   }
  146.   elseif ($did == 15) {
  147.     enable #search
  148.     enable #parse
  149.   }
  150.   elseif ($did == 16) {
  151.     disable #search
  152.     disable #parse
  153.   }
  154.   elseif ($did == 111) {
  155.     enable #parse
  156.   }
  157.   elseif ($did == 9) {
  158.     disable #parse
  159.   }
  160.   elseif ($did == 5) {
  161.     enable #search
  162.   }
  163.   elseif ($did == 14) {
  164.     disable #search
  165.   }
  166.   elseif ($did == 4) {
  167.     set %youtubefetch $addtok(%youtubefetch,$iif(($left($did(8),1) == $chr(35)),$did(8),$+($chr(35),$did(8))),44)
  168.     did -r youtube 8
  169.     FillChannelBox
  170.   }
  171.   elseif ($did == 73) {
  172.     set %nolinks $addtok(%nolinks,$did(69),44)
  173.     did -r youtube 69
  174.     FillNickBox
  175.   }
  176.   elseif ($did == 63) {
  177.     if ($did(8) != $null) {
  178.       set %youtubefetch $remtok(%youtubefetch,$iif(($left($did(8),1) == $chr(35)),$did(8),$+($chr(35),$did(8))),44)
  179.       did -r youtube 8
  180.     }
  181.     if ($did(6).seltext != $null) {
  182.       set %youtubefetch $remtok(%youtubefetch,$did(6).seltext,44)
  183.     }
  184.     FillChannelBox
  185.   }
  186.   elseif ($did == 3) {
  187.     did -t youtube 4
  188.   }
  189.   elseif ($did == 26) {
  190.     did -t youtube 73
  191.   }
  192.   elseif ($did == 72) {
  193.     if ($did(69) != $null) {
  194.       set %nolinks $remtok(%nolinks,$did(69),44)
  195.       did -r youtube 69
  196.     }
  197.     if ($did(71).seltext != $null) {
  198.       set %nolinks $remtok(%nolinks,$did(71).seltext,44)
  199.     }
  200.     FillNickBox
  201.   }
  202.   elseif ($did isnum 28-56) {
  203.     var %r $r(1,2)
  204.     if (%r == 1) {
  205.       $iif(($r(1,3) == 1),.timercheck -m 1 13 did -c youtube $r(75,87),.timeruncheck -m 1 13 did -u youtube $r(75,87))
  206.     }
  207.     else {
  208.       $iif(($r(1,3) == 1),.timercheck -m 1 13 did -c youtube $r(28,56),.timeruncheck -m 1 13 did -u youtube $r(28,56))
  209.     }
  210.   }
  211.   elseif ($did isnum 75-87) {
  212.     var %r $r(1,2)
  213.     if (%r == 1) {
  214.       $iif(($r(1,3) == 1),.timercheck -m 1 13 did -c youtube $r(75,87),.timeruncheck -m 1 13 did -u youtube $r(75,87))
  215.     }
  216.     else {
  217.       $iif(($r(1,3) == 1),.timercheck -m 1 13 did -c youtube $r(28,56),.timeruncheck -m 1 13 did -u youtube $r(28,56))
  218.     }
  219.   }
  220. }
  221.  
  222. raw 408:*: msg $2 $remove($strip($13-),$chr(9))
  223.  
  224. alias urlencode {
  225.   return $replacex($regsubex($$1-,/([^\w\s])/Sg,$+(%,$base($asc(\t),10,16,2))),$chr(32),+,$chr(43),%2B)
  226. }
  227.  
  228. #search on
  229. on $*:text:/^[!@]y(outube|t|tsearch|search|ousearch|outubesearch)/Si:*: {
  230.   $iif($istok(%youtubefetch,$chan,44),halt,noop)
  231.   $iif($istok(%nolinks,$nick,44),halt,noop)
  232.   if ($($+(%,botflood.,$nick),2)) {
  233.     if ($($+(%,botflood.,$nick),2) >= 50) {
  234.       ignore -u60 $address($nick,2)
  235.       msg $chan $+($nick,$chr(44)) You have been put on ignore for 60secs for abusing the bot.
  236.       halt
  237.     }
  238.     elseif ($($+(%,botflood.,$nick),2) >= 40) {
  239.       msg $chan $+($nick,$chr(44)) Please do not flood the bot.
  240.       inc -z $+(%,botflood.,$nick) 20
  241.       halt
  242.     }
  243.     else {
  244.       inc -z $+(%,botflood.,$nick) 25
  245.     }
  246.   }
  247.   else {
  248.     inc -z $+(%,botflood.,$nick) 25
  249.   }
  250.   var %ticks $ticks
  251.   if ($2) {
  252.     set $+(%,ysearch.,%ticks,.msgtype) $iif($chan,$iif($left($strip($1),1) == @,msg $chan,notice $nick),msg $nick)
  253.     set $+(%,ysearch.,%ticks,.search) $2-
  254.     set $+(%,ysearch.,%ticks,.search) $urlencode($2-)
  255.     sockopen $+(ysearch.,%ticks) gdata.youtube.com 80
  256.   }
  257.   elseif ($2 == $null) {
  258.     notice $nick 4Incorrect Syntax - Use10 $1 <search term>
  259.   }
  260. }
  261.  
  262. on *:input:*:{
  263.   $iif($istok(%nolinks,$active,44),return,noop)
  264.   $iif($istok(%youtubefetch,$active,44),return,noop)
  265.   var %ticks $ticks
  266.   if (($remove($1,$left($strip($1),1)) == ysearch) || ($remove($1,$left($strip($1),1)) == ytsearch) || ($remove($1,$left($strip($1),1)) == youtube) || ($remove($1,$left($strip($1),1)) == yt) || ($remove($1,$left($strip($1),1)) == youtubesearch)) {
  267.     if ($left($1,1) != /) {
  268.       if ($2 != $null) {
  269.         set $+(%,ysearch.,%ticks,.msgtype) msg $active
  270.         set $+(%,ysearch.,%ticks,.search) $2-
  271.         set $+(%,ysearch.,%ticks,.query) $urlencode($2-)
  272.         sockopen $+(ysearch.,%ticks) gdata.youtube.com 80
  273.       }
  274.       elseif ($2 == $null) {
  275.         .timerYTInputSyntax -m 1 100 echo -at 4Incorrect Syntax - Use10 $1 <search term>
  276.       }
  277.     }
  278.   }
  279.   elseif ((*youtube.com* iswm $1-) || (*youtu.be* iswm $1-)) {
  280.     if ($left($1,1) != /) {
  281.       var %i 1
  282.       while (%i <= $numtok($1-,32)) {
  283.         if ((*youtube.com* iswm $($+($,%i),2)) || (*youtu.be* iswm $($+($,%i),2))) {
  284.           set $+(%,youtube.,%ticks,.url) $strip($($+($,%i),2))
  285.           var %tag $($+(%,youtube.,%ticks,.url),2)
  286.           var %tag $iif($matchtok(%tag,v=,1,38),$v1,%tag)
  287.           var %tag $deltok($deltok(%tag,2,35),2,38)
  288.           set $+(%,youtube.,%ticks,.tag) $remove(%tag,?,m.,v=,/watch?src_vid=,https://,http://,www.,/v/,youtube.com,youtu.be,youtu.be/,/watch?v=,/watch,?v=,$chr(31),#!,/)
  289.         }
  290.         inc %i
  291.       }
  292.       if ($($+(%,youtube.,%ticks,.tag),2) == $null) {
  293.         unset $+(%,youtube.,%ticks,.*)
  294.       }
  295.       else {
  296.         set $+(%,youtube.,%ticks,.msgtype) msg $active
  297.         set $+(%,youtube.,%ticks,.nick) $nick
  298.         set $+(%,youtube.,%ticks,.chan) $chan
  299.         set $+(%,youtube.,%ticks,.network) $network
  300.         sockopen $+(youtube.,%ticks) gdata.youtube.com 80
  301.       }
  302.     }
  303.   }
  304. }
  305.  
  306. on *:sockopen:ysearch*: {  
  307.   sockwrite -nt $sockname GET $+(/feeds/api/videos?q=,$($+(%,ysearch.,$remove($sockname,ysearch.),.query),2),&v=2&prettyprint=true&max-results=1) HTTP/1.1
  308.   sockwrite -nt $sockname Host: gdata.youtube.com
  309.   sockwrite -nt $sockname $crlf
  310. }
  311.  
  312. alias nohtml { return $regsubex($$1-,/^[^<]*>|<[^>]*>|<[^>]*$/g,) }
  313.  
  314. on *:SOCKREAD:ysearch*: {
  315.   if ($sockerr) { echo -a SOCKET ERROR: $sockerr | halt }
  316.   sockread %sockreader
  317.   if (*<title>* iswm %sockreader) {
  318.     set $+(%,ysearch.,$remove($sockname,ysearch.),.title) $replace($nohtml(%sockreader),&amp;quot;,",&amp;#39;,',&quot;,",&amp;,&,&#39;,',&quot;,")
  319.     var %i 0
  320.     while (%i <= $numtok($($+(%,ysearch.,$remove($sockname,ysearch.),.search),2),32)) {
  321.       inc %i
  322.       set $+(%,ysearch.,$remove($sockname,ysearch.),.title) $regsubex($($+(%,ysearch.,$remove($sockname,ysearch.),.title),2), /\b( $gettok($($+(%,ysearch.,$remove($sockname,ysearch.),.search),2),%i,32) )\b/gix, $+($chr(2), \1, $chr(2)))
  323.     }
  324.   }
  325.   elseif (*<id>* iswm %sockreader) {
  326.     set $+(%,ysearch.,$remove($sockname,ysearch.),.tag) $gettok($nohtml(%sockreader),4,58)
  327.   }
  328.   elseif (*<name>* iswm %sockreader) {
  329.     set $+(%,ysearch.,$remove($sockname,ysearch.),.user) $nohtml(%sockreader)
  330.   }
  331.   elseif (*<yt:statistics* iswm %sockreader) {
  332.     set $+(%,ysearch.,$remove($sockname,ysearch.),.viewcount) $bytes($gettok(%sockreader,4,39),bd)
  333.     var %msg 1,0You0,4Tube 10Link:4 http://youtu.be/ $+ $($+(%,ysearch.,$remove($sockname,ysearch.),.tag),2) 10Title:4 $($+(%,ysearch.,$remove($sockname,ysearch.),.title),2) 10Views:4 $($+(%,ysearch.,$remove($sockname,ysearch.),.viewcount),2) 10User:4 $($+(%,ysearch.,$remove($sockname,ysearch.),.user),2)
  334.     $($+(%,ysearch.,$remove($sockname,ysearch.),.msgtype),2) $iif(%youtubenocolor == true,$strip(%msg),%msg)
  335.     unset $+(%,ysearch.,$remove($sockname,ysearch.),*)
  336.     sockclose $sockname
  337.   }
  338. }
  339.  
  340. #search end
  341.  
  342. #parse on
  343. on $*:text:/youtu(.be|be.com)/Si:*: {
  344.   $iif($istok(%youtubefetch,$chan,44),halt,noop)
  345.   $iif($istok(%nolinks,$nick,44),halt,noop)
  346.   if ($($+(%,botflood.,$nick),2)) {
  347.     if ($($+(%,botflood.,$nick),2) >= 50) {
  348.       ignore -u60 $address($nick,2)
  349.       msg $chan $+($nick,$chr(44)) You have been put on ignore for 60secs for abusing the bot.
  350.       halt
  351.     }
  352.     elseif ($($+(%,botflood.,$nick),2) >= 40) {
  353.       msg $chan $+($nick,$chr(44)) Please do not flood the bot.  
  354.       inc -z $+(%,botflood.,$nick) 20
  355.       halt
  356.     }
  357.     else {
  358.       inc -z $+(%,botflood.,$nick) 10
  359.     }
  360.   }
  361.   else { inc -z $+(%,botflood.,$nick) 10 }
  362.   var %i 1
  363.   var %ticks $ticks
  364.   while (%i <= $numtok($1-,32)) {
  365.     if ((*youtube.com* iswm $($+($,%i),2)) || (*youtu.be* iswm $($+($,%i),2))) {
  366.       set $+(%,youtube.,%ticks,.url) $strip($($+($,%i),2))
  367.       var %tag $($+(%,youtube.,%ticks,.url),2)
  368.       var %tag $iif($matchtok(%tag,v=,1,38),$v1,%tag)
  369.       var %tag $deltok($deltok(%tag,2,35),2,38)
  370.       set $+(%,youtube.,%ticks,.tag) $remove(%tag,?,m.,v=,/watch?src_vid=,https://,http://,www.,/v/,youtube.com,youtu.be,youtu.be/,/watch?v=,/watch,?v=,$chr(31),#!,/)
  371.     }
  372.     inc %i
  373.   }
  374.   set $+(%,youtube.,%ticks,.msgtype) msg $iif($chan,$v1,$nick)
  375.   if (($($+(%,youtube.,%ticks,.tag),2) != %_youtube.last) && ($($+(%,youtube.,%ticks,.tag),2) != $null)) {
  376.     set $+(%,youtube.,%ticks,.nick) $nick
  377.     set $+(%,youtube.,%ticks,.chan) $chan
  378.     set $+(%,youtube.,%ticks,.network) $network
  379.     sockopen $+(youtube.,%ticks) gdata.youtube.com 80
  380.   }
  381. }
  382.  
  383. on *:sockopen:youtube*: {
  384.   sockwrite -nt $sockname GET $+(/feeds/api/videos/,$($+(%,youtube.,$remove($sockname,youtube.),.tag),2),?v=2&prettyprint=true) HTTP/1.1
  385.   sockwrite -nt $sockname Host: gdata.youtube.com
  386.   sockwrite -nt $sockname $crlf
  387. }
  388.  
  389. on *:SOCKREAD:youtube*: {
  390.   if ($sockerr) { echo -a SOCKET ERROR: $sockerr | halt }
  391.   else {
  392.     var %sockreader
  393.     sockread %sockreader
  394.     if (*<title>* iswm %sockreader) {
  395.       set $+(%,youtube.,$remove($sockname,youtube.),.title) $replace($nohtml(%sockreader),&amp;quot;,",&amp;#39;,',&quot;,",&amp;,&,&#39;,',&quot;,")
  396.     }
  397.     elseif (*<name>* iswm %sockreader) {
  398.       set $+(%,youtube.,$remove($sockname,youtube.),.user) $nohtml(%sockreader)
  399.     }
  400.     elseif (*viewCount='* iswm %sockreader) {
  401.       set $+(%,youtube.,$remove($sockname,youtube.),.viewcount) $bytes($gettok(%sockreader,4,39),bd)
  402.       set %_youtube.last $($+(%,youtube.,$remove($sockname,youtube.),.tag),2)
  403.       var %msg 1,0You0,4Tube 10Title:4 $($+(%,youtube.,$remove($sockname,youtube.),.title),2) 10Views:4 $($+(%,youtube.,$remove($sockname,youtube.),.viewcount),2) 10User:4 $($+(%,youtube.,$remove($sockname,youtube.),.user),2)
  404.       $($+(%,youtube.,$remove($sockname,youtube.),.msgtype),2) $iif(%youtubenocolor == true,$strip(%msg),%msg)
  405.       unset $+(%,youtube.,$remove($sockname,youtube.),*)
  406.       sockclose $sockname
  407.     }
  408.   }
  409. }
  410. #parse end
  411.  
  412. on *:sockclose:youtube*: {
  413.   unset $+(%,youtube.,$remove($sockname,youtube.),*)
  414.   sockclose $sockname
  415. }
  416.  
  417. on *:sockclose:ysearch*: {
  418.   unset $+(%,ysearch.,$remove($sockname,ysearch.),*)
  419.   sockclose $sockname
  420. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement