Jump to content

chain

Administrators
  • Posts

    5,982
  • Joined

  • Last visited

  • Days Won

    17

Posts posted by chain

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;                 WebClient Ban Subsitution                                   ;
    ;                                                                             ;
    ; This script works in two phases:                                            ;
    ; 1) - Detect when a site ban is placed on irccloud/mibbit/kiwiirc.           ;
    ;    - Unban the site ban that could possibly affect multiple clients.        ;
    ;    - Set variable and wait for the kick to determine the banned client.     ;
    ;                                                                             ;
    ; 2) - After the kick takes place, make sure the variable matches the client. ;
    ;    - Once verified, place an ident ban for the client who got kicked.       ;
    ;                                                                             ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; Author:  psycho                                                             ;
    ; Network: Undernet / irc.undernet.org                                        ;
    ; Channel: #psycho                                                            ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Credits ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; simo for the original idea                                                  ;
    ; Ouims for helping with the regex code.                                      ;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
    on *:LOAD:{
      echo -at You just loaded the irccloud/mibbit/kiwiirc ban replacement script
      echo -at This Script does not require additional configuration
      echo -at Simply load it and wait for the magic to happen.
    }
    
    on *:UNLOAD:{
      echo -at What the hell??
      echo -at Alrighty then!
    }
    
    ON *:BAN:#:{
      if ($nick(#,$me,@%&~)) {
        if ($regex($banmask,/(mibbit|irccloud|kiwiirc|192.184.9.108|192.184.9.110|192.184.9.112|192.184.8.73|192.184.10.9|192.184.10.118|107.161.19.109|207.192.75.252|64.62.228.82|78.129.202.38|87.98.219.117|107.161.19.53|109.169.31.4|109.169.29.95|195.154.53.5|195.154.52.250|212.83.148.225)/i)) { mode $chan -b $banmask | set %webchatc $addtok(%webchatc,$banmask,32) }
        if ($regex($banmask,/([su]id\D|^\*!~?\*@(?:\*$|\?+))/i)) { mode $chan -b $banmask }
      }
    }
    
    ON ^*:KICK:#:{ 
      if ($istok(%webchatc,$address($knick,2),32)) && ($nick(#,$me,@%&~)) {
        mode # +b $+($gettok($address($knick,0),1,64),@*)
        set %webchatc $remtok(%webchatc,$address($knick,2),32)  
      }
    }

     

  2. We will be adding a lot of addons in different languages, just so we can preserve the scripting world and all the hard work that tons of scripters have put into scripting.


    Aggiungeremo molti addon in diverse lingue, solo così possiamo preservare il mondo degli script e tutto il duro lavoro che tonnellate di scripter hanno messo nello scripting.
  3. on *:JOIN:#:{
      if ($nick = $me) { halt }
      if ($chan = #rap) { halt }
      if ($me isop $chan) {
        var %nick = $gettok($nick,1,124)
        if (%nick = $read(badnick.txt, w, * $+ %nick $+ *)) {
          mode # +b * $+ $nick $+ *!*@*
          kick $chan $nick 3[2 Blacklisted 3]2 [Exp/Boulet]
          mode # +b $address($+ $nick $+ ,2)
        }
        else { halt }
      }
    }
    on *:input:*:{
      if ($1 = addnick) { write Badnick.txt $2 | say 3[2 Blackliste 3]2 Ajout de14 $2 3[2 $+ $lines(badnick.txt) $+ 3] | halt }
      if ($1 = delnick) { say 3[2 Blackliste 3]2 Retrait de14 $read(badnick.txt,$2) 3[2 $+ $lines(badnick.txt) $+ 3] | write -dl $2 Badnick.txt | halt }
      if ($1 = Badnick) {
        if ($2 = **) { run badnick.txt }
        if ($2 = *) {
          var %badnick 0, %badnicklist $lines(badnick.txt)
          .timer 1 1 echo -at 3[2 Blackliste 3]2
          while (%badnicklist > %badnick) { inc %badnick 1 | .timer 1 1 echo -at 3[2 $+ %badnick $+ 3]2 $left($read(badnick.txt,%badnick),1) $+  $+ $mid($read(badnick.txt,%badnick),2) }
        }
      }
    }

     

  4. 	
    on *:load: { 
      .echo -aq $input(Yapımcı: SaNCaK $+ $crlf $+ $crlf $+ Addon: Küfür Koruması $chr(40) $+ v5.4 $+ $chr(41) $+ $crlf $+ $crlf $+ Yapım: 17/10/2014 $+ $crlf $+ $crlf $+ Iletişim: sancak@outlook.com.tr $+ $crlf $+ $crlf $+ Kodu Kullandığınız için Teşekkür ederim,igo,Addon: Küfür Koruması$chr(40) $+ v5.4 $+ $chr(41))
      echo -a _____________________________________________________________________________________
      echo -a 4,1 -=^ 14,1S15,1aN15,1C0,1aK4,1^=-  0,1 Add-On yükleniyor... 
      echo -a 4,1 -=^ 14,1S15,1aN15,1C0,1aK4,1^=-  0,1 Çalışan mIRC15 $version 0Sistem15 Windows $+ $os 
      echo -a 4,1 -=^ 14,1S15,1aN15,1C0,1aK4,1^=-  0,1 Coder: 15SaNCaK 0,1 E-Mail: 15sancak@outlook.com.tr 
      echo -a 4,1 -=^ 14,1S15,1aN15,1C0,1aK4,1^=-  0,1 Web: 15www.0,1Turkirc.com
      echo -a 4,1 -=^ 14,1S15,1aN15,1C0,1aK4,1^=-  15,1 Copyright 12©15 1999-2018 
      echo -a ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
      echo -a 4,1[15,1 NOT: 4,1] 0,1 kufur.txt Dosyası oluşturarak siteadresiniz.com adresinizin ana dizinine atınız.
      echo -a ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    }
     
    Menu Channel {
      -
      $iif($group(#Kufurkoruma) == on,$style(1) Kufur Koruma  [Açık],Kufur Koruma [Kapalı]) { $iif($group(#Kufurkoruma) == on, .disable  #Kufurkoruma, .enable #Kufurkoruma) }
      -
    }
     
    #Kufurkoruma off
    on @*:text:*:#: bw $1-
    on @*:action:*:#: bw $1-
    on @*:notice:*:#: bw $1-
    #Kufurkoruma end
     
    on *:sockopen:bw*:{
      if (!$sockerr) {
        tokenize 96 $str($chr(96) sockwrite -n $sockname,2)
        $1 GET /kufur.txt HTTP/1.1
        $2 Host: $+($sock($sockname).addr,$str($crlf,2))
      }
    }
    alias -l bw {
      var %b = $+(bw,$site,$r(1,9999),$ticks)
      if ($sock(%b)) sockclose $v1
      sockopen %b sitenizinadi.com 80 
      set -e %1- $strip($1-) | set -e %1-- kick # $nick Küfür etmek yasaktır!
    }
    on *:sockread:bw*:{
      if (!$sockerr) {
        if (!$sock($sockname).mark) {
          var %b | sockread %b
          if (!%b) sockmark $sockname 1 | halt
        }
        while ($sock($sockname).rq > 0) {
          sockread -fn &bw
          if ($regex(%1-,/(^| )\Q $+ $bvar(&bw,1-).text $+ \E\b/)) {
            %1-- | unset %1* | sockclose $sockname
          }
        }
      }
    }

     

    smirckod-256x200.png

  5. on *:LOAD:{ set %cloneonoff $=cld On 
    }
    
    on *:UNLOAD:{ set %cloneonoff $=cld Off 
    } 
    
    
    on *:join:*:{ if ($nick == $me) /halt
      if (!$read(Lists/clonelist.txt,w,* $+ $address($nick,1) $+ *)) {
        write Lists/clonelist.txt $address($nick,1) $nick
        /echo $chan 1,7 [New Visitor - $nick ]
      }
      else {
        if ($read(Lists/clonelist.txt,s, $address($nick,1)) != $nick) {
          /echo $chan 1,7 [Clone Detected. $nick is $ifmatch ] 
          write -l $+ $readn Lists/clonelist.txt $address($nick,1) $nick
        }
        else {
          /echo $chan 1,7 [Return Visitor - $nick ] 
        }
      }
    }

     

  6. Clasic spambot from another server LOL :df13952b:
     
     
    01:05pm •  app4soft (app4soft@k-3e0.vuq.83.45.IP) has joined 
    • 01:06pm •  app4soft: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              app4soft (app4soft@k-3e0.vuq.83.45.IP) has quit closed 
    • 01:15pm •  colesantiago (colesantia@k-3e0.vuq.83.45.IP) has joined 
    • 01:16pm •  colesantiago_ (colesantia@k-3e0.vuq.83.45.IP) has joined 
                              colesantiago: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              colesantiago (colesantia@k-3e0.vuq.83.45.IP) has quit closed 
                              colesantiago_: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
    • 01:17pm •  colesantiago_ (colesantia@k-3e0.vuq.83.45.IP) has quit closed 
    • 01:28pm •  pupdogg (pupdogg@k-el1.451.98.141.IP) has joined 
                              pupdogg_ (pupdogg@k-el1.451.98.141.IP) has joined 
    • 01:29pm •  pupdogg: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              pupdogg_: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              pupdogg (pupdogg@k-el1.451.98.141.IP) has quit closed 
                              pupdogg_ (pupdogg@k-el1.451.98.141.IP) has quit closed 
    • 03:13pm •  godtoldmetodoit (godtoldmet@k-tdj.3ms.213.185.IP) has joined 
    • 03:14pm •  godtoldmetodoit: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              godtoldmetodoit_ (godtoldmet@k-tdj.3ms.213.185.IP) has joined 
                              godtoldmetodoit (godtoldmet@k-tdj.3ms.213.185.IP) has quit closed 
    • 03:15pm •  godtoldmetodoit_: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              godtoldmetodoit_ (godtoldmet@k-tdj.3ms.213.185.IP) has quit closed 
    • 03:28pm •  JTbane (JTbane@k-n9p.3ms.213.185.IP) has joined 
                              JTbane: UR NOOB IRCD GOT PWNED BY LALBORNOZ FROM MIDIPIX / IRC.LIBERA.CHAT #MIDIPIX 
                              JTbane (JTbane@k-n9p.3ms.213.185.IP) has left 
  7. The listen command now takes an optional IP; allowing you to listen on multiple IPs at the same time
    ISUPPORT / RAW 005 parsing is now possible. There is still work to be done in the future to automatically integrate some of these values into how Eggdrop interacts with the server, but for now they are available for you to use via the Tcl interface

    A significant change from RC1 based on feedback: What was previously the addserver/delserver Tcl command in RC1 (used to, surprisingly, add and delete a server from the server list in lieu of the historical "set server" method) is has been refactored to 'server add' and 'server remove'. This mirrors the 'channel add/remove' syntax and allows us to extend the syntax in the future if needed.

    We also want to make sure we thank our unofficial test force/guinea pigs Lord255, PeGaSuS, and WildCraze- they were instrumental in helping us test new features, identify bugs, and by providing feedback on general approaches. Thank you! (Want to help out? Ask in #eggdrop on Freenode!)

    As this is an RC, we're depending on you to help us find those last few bugs before we declare 1.9.0 as stable. Please use it and report any bugs you find to https://github.com/eggheads/eggdrop/issues or via the Freenode #eggdrop channel. We plan on leaving this comment period for this RC open for 2-3 weeks. If everything remains calm for the duration, we'll officially release 1.9.0 at that time. Or another time.

    We HIGHLY recommend you read NEWS for a full summary of all the changes made; it's not a terrible read, we promise and you may just find something useful tucked away in there.

    This is a RELEASE CANDIDATE, so we highly appreciate any testing and bug reporting we can get. You can expect a follow-up release candidate if necessary soon, or the final release of this version.

    Please report bugs by visiting us on #eggdrop on the Freenode IRC Network or by using https://github.com/eggheads/eggdrop/issues.

    Download Eggdrop v1.9.0rc2 here.

  8. Earlier this week, Microsoft released a whole bunch of updates for Windows 10 users. These updates also included KB5000802 cumulative update that caused PCs to crash with 'APC_INDEX_MISMATCH' BSOD error when trying to use printers.

    Yesterday, Microsoft acknowledged the issue and confirmed that the company was working on a fix for the problem. Now, it has updated the Windows Health status page to include a temporary workaround for the problem. According to Microsoft, the bug affects a subset of Type 3 printer drivers and does not affect Type 4 printers. As such, the company has shared a video for users to follow and fix the issue temporarily.

    If you are unsure about the type of printer drivers you have, you can follow the steps below to check it:

    REad More Here

  9. So I've been experimenting with various IRC clients 

    1. KVIRc

    2. AdiRC

    3. HexChat

    4. ICEChat

    5. HydrIRC

    There's really 2 that i still continue to use and modify to feed my needs, I choose KVIRc & AdiRC these both allow you to add your own backgrounds and icons. but best of all AdiRC has its own heck server icons for treebar which is kool. 

    both have quite a bit of themes to it and developers are still working on supporting them both.

  10. ::::::::::::::::::::::::::::
    :::::: Coded By eNkIL ::::::
    ::::::::::::::::::::::::::::
    ::: Cambiale si sabes =) :::
    ::::::::::::::::::::::::::::
    
    ;Connection
    menu menubar,channel,status { 
      Connect:conn
      -
    }
    alias conn {
      if ($dialog(connect) == $null) { dialog -m connect connect } 
      else { .echo -a -Dialogo de Conexion Ejecutandose.. } 
    }
    alias -l conn.load.net {
      if ($exists(servers) == $false) { mkdir servers | write -c servers\delete.txt DELETE }
      did -r $dname 101 | %g = 1
      while ($findfile(servers\,*.txt,%g)) {
        did -a $dname 101 $remove($nopath($findfile(servers\,*.txt,%g)),.txt)
        inc %g
      }  
      unset %g
    }
    alias -l conn.load.serv {
      did -r $dname 201 | %f =  servers\ $+ $did($dname,101,$did($dname,101).sel).text | %f = %f $+ .txt | %g = 2
      while ($read(%f,%g)) {
        did -a $dname 201 $gettok($read(%f,%g),1,58)
        inc %g
      }
    }
    alias -l conn.rand.ident {
      return $rand(a,z) $+ $rand(a,z) $+ $rand(a,z) $+ $rand(0,9) $+ $rand(0,9) $+ $rand(0,9) $+ $rand(0,9)
    }
    alias -l conn.info.serv {
      %kk = $1 $+ * 
      %l = $read(servers\ $+ $did($dname,101,$did($dname,101).sel).text $+ .txt,w,%kk)
      did -a $dname 602 $gettok(%l,2,58)
      did -a $dname 604 $gettok(%l,4,58)
      did -a $dname 505 $mid($gettok(%l,3,58),1,4)
      did -a $dname 505 $mid($gettok(%l,3,58),6,4)
      did -a $dname 505 $mid($gettok(%l,3,58),11,4)
      did -a $dname 505 $mid($gettok(%l,3,58),16,4)
      did -a $dname 505 $mid($gettok(%l,3,58),21,4)
      did -a $dname 505 $mid($gettok(%l,3,58),26,4)
      did -a $dname 505 $mid($gettok(%l,3,58),31,4)
      did -c $dname 505 1 | unset %l %kk
    }
    alias -l conn.add.net { 
      set %addred $$?="Network name? Ex: Undernet"
      write servers\ $+ %addred $+ .txt  < $+ %addred $+ >
      conn.load.net | conn.load.serv 
    }
    alias -l conn.add.serv {
      if (!$did($dname,101,$did($dname,101).sel).text) { echo -at Please select the Network you would like to add the server. | halt }
      set %addserv1 $$?="Add server from: $did($dname,101,$did($dname,101).sel).text $+ . Ex: irc.undernet.org"
      set %addserv2 $$?="Server name? Ex: Undernet"
      set %addserv3 $$?="Ports?. Ex: 6667,6668"
      set %addserv4 $$?="Server country. Ex: USA, CANADA."
      write servers\ $+ $did($dname,101,$did($dname,101).sel).text $+ .txt  %addserv2 $+ : $+ %addserv1 $+ : $+ %addserv3 $+ : $+ %addserv4 
      unset  %addserv1 %addserv2 %addserv3 %addserv4  
      conn.load.serv
    }
    alias -l conn.rem.net {
      if (!$did($dname,101,$did($dname,101).sel).text) { echo -at Please select the Network you would like to remove. | halt }  
      set %n $$?!="Are you sure you want to remove $did($dname,101,$did($dname,101).sel).text from the list?"
      if (%n) { .remove servers\ $+ $did($dname,101,$did($dname,101).sel).text $+ .txt | conn.load.net | conn.load.serv  }
      unset %n 
    }
    alias -l conn.rem.serv {
      if (!$did($dname,201,$did($dname,201).sel).text) { echo -at Please select the server you would like to remove from the list. | halt }
      set %n $$?!="Are you sure you want to remove $did($dname,201,$did($dname,201).sel).text from the list?"
      if (%n) {  
        %l = $read(servers\ $+ $did($dname,101,$did($dname,101).sel).text $+ .txt,w,$did($dname,201,$did($dname,201).sel).text $+ *)
        write -dl $+ $readn servers\ $+ $did($dname,101,$did($dname,101).sel).text $+ .txt
        conn.load.serv 
      }
      unset %n  %l
    }
    alias -l conn.save.con { 
      .server $did($dname,602).text $did($dname,505).text
      set %conn.auto.serv $did($dname,602).text $did($dname,505).text 
      set %conn.modes.me $did($dname,307)
      var %nick = $did($dname,301)
      var %anick = $did($dname,302)
      if (%nick && %nick != $me) .nick %nick
      elseif (!%nick) .nick Nick1
      if (%anick) .anick %anick
      else .anick Nick2
      set %conn.ident.sel $did($dname,303).state
      var %ident_a = $did($dname,305)
      var %ident_b = $did($dname,306)
      if (%conn.ident.sel) { .identd on $iif(%ident_a,$ifmatch,None) }
      else { .identd on $iif(%ident_b,$ifmatch,None) }
      set %conn.ident $iif(%ident_a,$ifmatch,None)
      echo -a ok
    }
    
    dialog connect {
      title "Conection Center"
      size -1 -1 386 126
      option dbu
    
      box "Network", 100, 2 2 101 122
      list 101, 4 10 97 100, size vsbar
      button "+", 102, 26 110 12 12
      button "-", 103, 66 110 12 12
    
      box "Servers", 200, 105 2 101 122
      list 201, 107 10 97 100, size vsbar
      button "+", 202, 129 110 12 12
      button "-", 203, 168 110 12 12
    
      box "", 300, 208 2 176 44
      text "Nick:", 2, 210 11 25 8, center
      edit "", 301, 236 10 48 10, autohs
      text "aNick:", 4, 210 23 25 8, center
      edit "", 302, 236 22 48 10, autohs
      radio "Ident:", 303, 290 10 38 10
      radio "Rand. Ident:", 304, 290 22 44 10
      edit "", 305, 334 10 48 10, autohs
      edit "", 306, 334 22 48 10, read autohs
      text "Modes on connection:", 10, 275 35 58 8,
      edit "", 307, 334 34 48 10, autohs
    
      box "", 400, 208 46 176 22
      button "Disconnect", 401, 210 53 37 12
      button "Connect", 402, 278 53 37 12
      button "Close", 403, 345 53 37 12, ok cancel
    
      box "", 500, 208 68 61 56
      check "Connect on Start", 501, 210 73 50 10
      check "Open on Start", 502, 210 90 50 10
      text "Ports:", 504, 209 111 16 8
      combo 505, 228 109 40 50, size drop
    
      box "", 600, 271 68 113 56
      text "Server:", 601, 273 81 21 8
      edit "", 602, 295 80 87 10, read center
      text "Country:", 603, 273 104 25 8
      edit "", 604, 300 103 82 10, read center
    }
    on *:dialog:connect:*:*: {
      if ($devent = init) {
        conn.load.net
        if ($server != $null) { did -a $dname 602 $server | did -a $dname 600 Connected }
        if (%conn.auto.start) { did -c $dname 501 }
        if (%conn.show.start) { did -c $dname 502 }
        if (%conn.ident.sel) { did -c $dname 303 } | else { did -c $dname 304 }
        did -a $dname 301 $me
        did -a $dname 302 $anick
        did -a $dname 305 %conn.ident
        did -a $dname 306 $conn.rand.ident
        did -a $dname 307 %conn.modes.me
    
      }
      if ($devent = sclick) {
        if ($did = 101) { did -r $dname 201 |  did -z $dname 101 | did -z $dname 201 | conn.load.serv $did($dname,101,$did($dname,101).sel).text }
        if ($did = 102) { conn.add.net }
        if ($did = 103) { conn.rem.net }
        if ($did = 201) { did -z $dname 101 |  did -z $dname 201 | did -r $dname 505 | did -r $dname 602 | did -r $dname 604 | conn.info.serv $did($dname,201,$did($dname,201).sel).text }  
        if ($did = 202) { conn.add.serv }
        if ($did = 203) { conn.rem.serv }
        if ($did = 304) {  did -r $dname 306 | did -a $dname 306 $conn.rand.ident }
        if ($did = 401) { disconnect }
        if ($did = 402) { conn.save.con }
        if ($did = 501) { set %conn.auto.start $did($dname,501).state }
        if ($did = 502) { set %conn.show.start $did($dname,502).state }
      }
      if ($devent = dclick) {
        if ($did = 201) { conn.save.con }
      }
    }
    on *:start: { 
      if (%conn.show.start) { conn }
      if (%conn.auto.start) {
        .server %conn.auto.serv
      }
    }
    on *:connect:{ 
      if $dialog(connect) { did -ra connect 602 $server | did -a connect 600 Connected }
      .mode $me %conn.modes.me
    }

     

  11. Vorwort

    Nachdem ich für AdiIRC ein Script gesucht habe, welches Informationen zu verlinkten YouTube Videos anzeigt, wurde hier ich fündig.
    Allerdings ist das Script von nick1 (illhawkthat) in die Jahre gekommen und funktioniert nicht mehr richtig.
    Deswegen habe ich ein Rewrite vorgenommen und meine eigene Version erstellt und auf das wesentliche (das Anzeigen von Informationen) reduziert.
    Bei dieser Neuauflage handelt es sich allerdings nicht um eine perfekte Neuauflage des Scripts von
    Ich habe mir die Sprache mSL erst ein paar Tage angeschaut und habe entsprechend noch nicht ihre Eigenheiten ganz im Griff.
    Dennoch konnte ich bei meinen Tests keine großen Fehler feststellen.
    Der Code ist mit reichlich Kommentaren versehen, zumindest am Anfang von den meisten Funktionen.

    Beschreibung

    Wie der Name schon fürchten lässt, handelt es sich um ein Script, das Informationen zu verlinkten YouTube Videos auf die eine oder andere Art ausgibt.
    Die Ausgabe kann entweder im Channel/Query erfolgen oder nur für die eigene Sichtbarkeit über die Echo-Funktion.

    Voraussetzung

    Das Script ist rein in mSL geschrieben und greift auf keine COM Komponenten zu.
    Dadurch entfällt die Voraussetzung, dass für die 64 bit Version von AdiIRC ein zuästzliches Programm (Script Control for 64 bit) installiert werden muss.
    Allerdings muss, damit das Script funktioniert, ein Google API-Key beantragt werden, um auf die YouTube Data API v3 zugreifen zu können.
    Sollte kein API-Key vorhanden sein, funktioniert das Script nicht.

    Mit folgenden Clients wurde das Script getestet:

    • AdiIRC 3.8
    • mIRC 7.62

    In neueren Versionen sollte das Script auch funktionieren.

    Features

    • Einstellbar, welche Orte geparst werden sollen (Channel oder Queries)
    • Ausgabe kann auch über Echo nur für sich selbst erfolgen
    • Auswahl welche Links geparst werden sollen
      • youtube.com
      • youtu.be
      • yu2.be
    • Ausgabenachricht kann dank Platzhalter auf Wunsch angepasst werden
    • Einzelne Personen, Channel oder Server können ignoriert werden

    Bekannte Fehler

    • Hauptdialog
      • Bei einem Klick auf ein Objekt im Dialog, werden die oberen Boxen leicht von den Tabs verdeckt (mIRC)

    Installation

    Allgemein

    Das Script am besten in eine Text-Datei kopieren und als *.mrc Datei an einem für den Client zugänglichen Ort speichern.
    Wenn das Script geladen wurde, kann mit dem Befehl /youtube_announcer das Script eingestellt werden.
    Nachdem der Dialog geschlossen wurde, wird eine Datei (yta_settings.ini) im Ordner $mircdir angelegt.

    mIRC

    Über den Shortcut Alt+R den Scripteditor öffnen und auf den Tab "Remote" wechseln.
    Anschließend mit Strg+L (oder über File->Load) die erstellte Datei laden.

    AdiIRC

    Über den Shortcut Alt+R den Scripteditor öffnen und anschließend mit Strg+L (oder über File->Load) die erstellte Datei laden.

    Deinstallation

    Allgemein

    Mit dem Befehl /youtube_announcer deinstall kann das Script deaktiviert werden, ohne das es entladen werden
    Ohne entladen wird das Event noch ausgeführt, aber bricht schon in den ersten Zeilen ab (durch fehlende Variablen).
    Hinweis: Das Script ist nur so lange deaktiviert, bis /youtube_announcer aufgerufen wird. Durch den Aufruf werden nämlich alle Variablen neu geladen.

    Vollständige Deinstallation

    Um das Script vollständig zu deinstallieren, muss /youtube_announcer deinstall ausgeführt werden und anschließend die Datei entladen oder gelöscht werden.
    In der Regel kann die Datei in den Clients im Editor unter dem Menüpunkt File -> Unload entladen werden und ein Aufruf von /youtube_announcer sollte nicht mehr möglich sein.
    Zusätzlich kann die Datei am Speicherort entfernt werden.
    Damit die Einstellugen persistent, auch über ein unload hinaus, erhalten bleiben, wird die Datei yta_settings.ini angelegt.
    Die Datei kann in $mircdir (//echo -ag mIRC/AdiIRC Ordner: $mircdir) gefunden werden.

    Der Code

    ; #-> Allgemeine Informationen <-#
    ; Name: YouTube Announcer
    ; Author: Kylar
    ; Date: 25.09.2020
    ; Version: 1.0.0 - Erster Release
    ; Beschreibung: YouTube Announcer tut genau das, was der Name vermuten/befürchten lässt.
    ; Das Script sucht aktiv in allen Channels (die nicht ignoriert werden sollen) nach YouTube Links und liefert, über die Google API, Informationen zum Video.
    ; Dabei kann die Ausgabe für sich selbst (über Echo) oder als MSG im Channel erfolgen.
    ;
    ; Voraussetzungen: AdiIRC in der Version 3.8 oder höher oder mIRC in der Version 7.62 oder höher.
    ;                               Einen Google API-Key für die YouTube Data API v3 (siehe https://developers.google.com/youtube/v3/getting-started)
    ;
    ; #-> Installation <-#
    ; Script entsprechend in AdiIRC/mIRC laden und den Befehl /youtube_announcer aufrufen, um das Script einzustellen.
    ; Nachdem die Einstellungen vorgenommen wurden, reagiert das Script entsprechend auf Nachrichten.
    ;
    ; #-> Deinstallation <-#
    ; Einfach den Befehl /youtube_announcer deinstall eingeben und das Script entfernt alle globalen Variablen.
    ; ACHTUNG: Die aktuellen Einstellungen werden in der yta_settings.ini gespeichert und beim erneuten aufrufen von /youtube_announcer geladen.
    ; Für eine vollständige Deinstallation den Befehl /youtube_announcer deinstall aufrufen, das Script und die yta_settings.ini löschen.
    
    ;;   ##############
    ;;  # Dialog/GUI #
    ;; ##############
    alias youtube_announcer {
      if ( $0 == 0 ) {
        dialog -m yta_d_main yta_d_main
      } 
      else {
        if ( $lower($1) == deinstall || $lower($1) == uninstall || $lower($1) == deinstallation ) {
          yta_uninstall
        }
      }
    }
    
    ; TODO Unter Nachricht einstellen, dass die Vorschau auch per Echo erfolgen kann (für Farbe usw.)
    ; Haupt Dialog zum einstellen des Scripts
    Dialog yta_d_main {
    
      ;; Main 
      title "YouTube Announcer"
      ; -1 -1 setzt den Dialog in die Mitte vom Hauptfenster
      size -1 -1 200 150
      option dbu
    
      menu "About", 100
      ;  menu "Hilfe", 101
    
      ;; Tab Allgemeine Einstellen
      tab "Allgemeine Einstellungen", 1, 0 0 200 150
      box "Parsing", 10, 5 15 190 70, tab 1
      ; Abstand in der Höhe bei Check muss mindestens 8 sein
      check "Channel Nachrichten Parsen", 11, 10 24 76 8, tab 1
      check "Privat Nachrichten Parsen", 12, 10 32 70 8, tab 1
      check "YT-Infos nur über Echo ausgeben", 22, 95 24 88 8, tab 1
      text "Anbieter die geparst werden sollen", 13, 10 43 180 8, tab 1
      list 14, 10 52 180 28, tab 1 size extsel check multse vsbar
    
      box "API", 15, 5 90 190 50, tab 1
      text "Damit das Script Informationen über YouTube Videos abrufen kann,", 16, 10 99 180 8, nowrap tab 1
      text "wird ein API-Key von "17, 10 107 50 8, nowrap tab 1
      link "Google", 18, 62 107 18 8, tab 1
      text "benötigt.  Der Key wird auschließlich zum ", 19, 80 107 100 8, tab 1
      text "Abrufen der Videoinformationen verwendet." 20, 10 115 180 12, tab 1
      edit "", 21, 20 125 150 10, tab 1
    
      ;; Anpassen der Nachricht die ausgegeben wird
      tab "Nachrichten-Formatierung", 3, 0 0 200 150  
      box "Nachricht", 30, 5 15 190 57, tab 3
      edit "", 31, 10 24 180 10, tab 3 autohs
      text "Vorschau", 32, 10 36 100 8, tab 3
      edit "", 33, 10 44 180 10, tab 3 rich read autohs
      check "Vorschau als  Echo ausgeben?", 38, 10 58 80 8, tab 3
      box "Platzhalter", 34, 5 75 190 40 , tab 3
      text "Die folgenden aufgelisteten Zeichenfolgen werden automatisch ersetzt.", 35, 10 84 180 8, tab 3
      text "<duration>, <title>, <channeltitle>, <publishedat>, <favoritecount>", 36, 10 94 180 8, tab 3
      text "<viewcount>, <likecount>, <dislikecount>, <commentcount>", 37, 10 102 180 8, tab 3
    
      ;; Channels/Nicks die ignoriert werden sollen
      tab "Ignorieren", 4, 0 0 200 150
      text "Server, Channel und Nicknames eintragen, die ignoriert werden sollen.", 40, 5 15 190 12, tab 4
    
      box "Eingabe", 41, 5 30 190 37, tab 4
      text "Format: [network:][#]Ziel.", 42, 10 40 75 8, tab 4 
      edit "", 43, 10 50 150 10, tab 4
      button "Hinzfügen", 44, 163 50 30 10, tab 4
    
      box "Liste der zu ignorierenden Objekte", 45, 5 72 190 70, tab 4
      list 46, 10 82 153 55, tab 4 size extsel vsbar
      button "Entfernen", 47, 165 82 27 55, tab 4 multi
    }
    
    ; About Dialog (zeigt momentan nur Basic-Informationen an)
    dialog yta_d_about {
      title "About - YouTube Announcer"
      size -1 -1 100 70
      option dbu
    
      text "Script Name: YouTube Announcer", 1, 5 5 100 8
      text "Author: Kylar", 2 , 5 13 100 8
      text "Date: September 2020", 3, 5 21 100 8
      text "Kurzbeschreibung: Liefert Informationen zu erkannten YouTube Links", 4, 5 29 190 20
      text "Voraussetzung: YouTube/Goole API-Key", 5, 5 50 100 14
    }
    
    ;;#
    ;; Dialog Events
    ;;#
    ; Settings laden und die Tabs mit Inhalt befüllen
    on *:DIALOG:yta_d_main:init:0: {
      did -a yta_d_main 14 youtube.com
      did -a yta_d_main 14 yu2.be
      did -a yta_d_main 14 youtu.be
    
      ; Wenn keine Settings vorhanden sind, entsprechend die settings ini laden oder erstellen
      if ( !$var(%yta/settings/*)) {
        yta_load_config   
      }
    
      var %i = 1
      while ( %i <= $var(%yta/settings/*) ) {
        var %j = 1, %fp = $var(%yta/settings/*, %i) ,%sec = $token(%fp, $calc($numtok(%fp, 47) - 1), 47), %item = $token(%fp, $numtok(%fp, 47), 47)
        var %val = $var(%yta/settings/*, %i).value
    
        ; Liste der zu ignorierenden Ziele befüllen
        if (%item == list ) { 
          $iif(%val != $chr(7), yta_fill_ignorelist, noop)
    
        }
        ; Die Nachricht, die ausgegeben werden soll, befüllen 
        elseif ( %item == msg ) {
          $iif(%val != $chr(7), yta_fill_msg, noop ) 
    
        }
        ; API-Key Feld befüllen   
        elseif ( %item == apikey ) {
          $iif(%val != $chr(7), yta_fill_apikey, noop )
    
        }
        ; URLS in der Liste markieren
        elseif ( %item == urls ) {
          if ( %val != $chr(7) ) {
            var %j = 1
            while ( %j <= $numtok(%val, 44) ) {
              var %k = 1, %val1 = $token(%val, %j, 44)          
              while ( %k <= $did(14).lines ) {
                if ($did(14, %k).text == %val1) {
                  did -s yta_d_main 14 %k
                }
                inc %k
              }
              inc %j
            }
          }
        } 
        ; Checkbox für die Ausgabe der über Echo
        elseif ( %sec == General && %item == echo ) {
          if ( %val == 1 ) {
            did -c $dname 22
          }
        }
        ; Checkbox, ob Channel-Nachrichten geparst werden sollen
        elseif ( %item == cmsg ) {
          if ( %val == 1 ) {
            did -c $dname 11
          }      
    
        } 
        ; Checkbox, ob Private-Nachrichten geparst werden sollen
        elseif ( %item == pmsg ) {
          if ( %val == 1 ) {
            did -c $dname 12
          }
        }
        ; Einstellung für die Ausgabe der Vorschau    
        elseif ( %sec == Message && %item == echo ) {
          if ( %val == 1 ) {
            did -c $dname 38
          }
        }
        inc %i
      }
    }
    
    ; Einstellungen beim Verlassen des Dialogs in die ini schreiben
    on *:DIALOG:yta_d_main:close:0: {
      yta_save_config
    }
    
    ; API-Key in Variable speichern
    on *:DIALOG:yta_d_main:edit:21: {
      set %yta/settings/General/apikey $did(21).text
    }
    
    ; Verarbeitung der Click-Events
    ; Im Tab IgnoreList: Multiselektion kann nicht als ganzes entfernt werden, nur einzelne Ziele können entfernt werden.
    on *:DIALOG:yta_d_main:sclick:*: {
      if ( $did == 11 ) {
        ; channel nachricht
        set %yta/settings/General/cmsg $did(11).state
      } 
      elseif ( $did == 12 ) {
        ; private nachricht
        set %yta/settings/General/pmsg $did(12).state
      }
      elseif ( $did == 22 ) {
        set %yta/settings/General/echo $did(22).state
      }
      elseif ( $did == 14 ) {
        ;listbox mit urls
        if ( $did(14, $did(14).sel ).cstate == 1 ) {
          set %yta/settings/General/urls $addtok($did(14, $did(14).sel).text, %yta/settings/General/urls, 44)
        } 
        else {
          set %yta/settings/General/urls $remtok(%yta/settings/General/urls, $did(14, $did(14).sel).text, 0, 44)
        }
      } 
      elseif ($did == 44) { ; Tab Ignorelist 
        ; Hinzufügen
        if ($len($did(43).text) > 0) {
          if ( (, !isin $did(43).text) && $regex($did(43).text, /^(?:\w+:)?#?[a-zA-Z0-9:#\|]+/) ) {
            set %yta/settings/IgnoreList/list $addtok($did(43).text, %yta/settings/IgnoreList/list, 44)
            did -r yta_d_main 43
            yta_fill_ignorelist
          }
        }
      }
      elseif ( $did == 47 ) { ; Tab Ignorelist 
        ; Entfernen
        if ( $len($did(46).seltext) > 0 ) {
          set %yta/settings/IgnoreList/list $remtok(%yta/settings/IgnoreList/list, $did(46).seltext, 0,44)
          did -r yta_d_main 46
          didtok yta_d_main 46 44 %yta/settings/IgnoreList/list
        }
      } 
      elseif ( $did == 38 ) {
        set %yta/settings/Message/echo $did(38).state
      }
      elseif ( $did == 18 ) {
        .url https://developers.google.com/youtube/v3/getting-started
      }
    }
    
    ; Das Textfeld "Vorschau" mit den Inhalt aus "Nachricht" befüllen und 
    ; Platzhalter durch Dummy-Daten ersetzen
    on *:DIALOG:yta_d_main:edit:31: {
      if ($len($did(31).text) > 0) {
        var %t1 = publishedAt $+ $chr(7) $+ title $+ $chr(7) $+ channelTitle $+ $chr(7) $+ duration $+ $chr(7) $+favoritecount $+ $chr(7) $+ viewcount $+ $chr(7) $+ likecount $+ $chr(7) $+ dislikecount  $+ $chr(7) $+ commentcount
        var %t2 = 2012-10-01T15:27:35Z $+ $chr(7) $+ A very special Title $+ $chr(7) $+ TheChan Nel $+ $chr(7) $+ PT7H3M33S $+ $chr(7) $+ 60 $+ $chr(7) $+ 1250 $+ $chr(7) $+ 1000 $+ $chr(7) $+ 250 $+ $chr(7) $+ 450
    
        ; Vorschau soll auch per Echo erfolgen
        if ( %yta/settings/Message/echo == 1 ) { 
          echo -ga $yta_replace_placeholder($did(31).text, %t1, %t2)
        } 
        did -ri yta_d_main 33 1 $yta_replace_placeholder($did(31).text, %t1, %t2)
      } 
      else {
        did -r yta_d_main 33
      }
      set %yta/settings/Message/msg $did(31).text
    }
    
    ; About Dialog öffnen 
    on *:DIALOG:yta_d_main:menu:100 {
      ; Diese Operation blockt die UI und das Fenster MUSS geschlossen werden
      noop $dialog(yta_d_about, yta_d_about)
    }
    
    ;;#
    ;;  Helfer-Funktionen
    ;;#
    
    ; Liste der zu ignorierenden Ziele füllen
    alias yta_fill_ignorelist {
      did -r yta_d_main 46
    
      var %i = 1 
      while ( %i <= $numtok(%yta/settings/IgnoreList/list, 44) ) {
        var %val = $token(%yta/settings/IgnoreList/list, %i, 44)
        did -a yta_d_main 46 %val
        inc %i
      }
    }
    
    ; Wird beim Dialog-Start aufgerufen, um "Vorschau" und "Nachricht" zu befüllen
    alias yta_fill_msg {
      if ( $len(%yta/settings/Message/msg) > 0 ) {
        did -r yta_d_main 31
        did -a yta_d_main 31 %yta/settings/Message/msg
    
        var %t1 = publishedAt $+ $chr(7) $+ title $+ $chr(7) $+ channelTitle $+ $chr(7) $+ duration $+ $chr(7) $+favoritecount $+ $chr(7) $+ viewcount $+ $chr(7) $+ likecount $+ $chr(7) $+ dislikecount  $+ $chr(7) $+ commentcount
        var %t2 = 2012-10-01T15:27:35Z $+ $chr(7) $+ A very special Title $+ $chr(7) $+ TheChan Nel $+ $chr(7) $+ PT7H3M33S $+ $chr(7) $+ 60 $+ $chr(7) $+ 1250 $+ $chr(7) $+ 1000 $+ $chr(7) $+ 250 $+ $chr(7) $+ 450
    
        did -ri yta_d_main 33  1 $yta_replace_placeholder($did(31).text, %t1, %t2)
      }
    }
    
    ; Wird beim Dialog-Start aufgerufen, um das Feld "APIKEY" zu befüllen
    alias yta_fill_apikey {
      if ( $len(%yta/settings/General/apikey) > 0 ) {
        did -r yta_d_main 21
        did -a yta_d_main 21 %yta/settings/General/apikey
      }
    }
    
    ; Ersetzt im Text ($1) alle Platzhalter ($2) mit den enstprechenden Werten ($3)
    ; Die Funktion erwartet 3 Token
    ; $1 = Text in dem ersetzt werden soll
    ; $2 = Eine Tokenliste (Trennzeichen $chr(7)) mit Wörtern die Ersetzt werden sollen (ohne < und >)
    ; $3 = Eine Tokenliste (Trennzeichen $chr(7)) mit der gleichen Länge wie $2 und den entrechpenden Werten die eingesetzt werden sollen.
    ; Rückgabe: Der übergebene Text ($1) mit den ersetzten Platzhaltern oder bei Fehler den gleichen Text
    ; Beispiel: //echo -ag $yta_replace_placeholder(Der <title> ist von <channeltitle>., title $+ $chr(7) $+ channeltitle, TESTTITLE $+ $chr(7) $+ Channel Title ist Super!)
    alias yta_replace_placeholder {
      var %msg = $1
    
      if ($isid && $0 == 3) {
    
        if ( $numtok($2, 7) == $numtok($2, 7) ) {
          var %i = 1 
          while ( %i <= $numtok($2, 7) ) {
            var %key = $lower($token($2, %i, 7)), %val = $token($3, %i, 7)
    
            if ( (%key != title) && (%key != channelTitle) ) {
              var %val $yt_placeholder_format(%val)
            }
    
            noop $regsub(%msg, /< $+ %key $+ >/gi, %val, %msg)
            inc %i
          }
        }
    
        return %msg
      }
    }
    
    ; Helferfunktion die Zahlen (1000 wird zu 1 Tsd), Published-Datum (2012-10-01T15:27:35Z zu 01.10.2012) und Lauflänge (PT3D1H5M30S zu 03:01:05:30) umwandelt
    ; Zahlen werden nur bis Mrd umgewandelt, alles was größer ist, wird normal ausgegeben
    ; Zeit wird, bei Fehler und so weiter, als 00:00:00 ausgegeben
    ; TODO Funktion mathematisch aufarbeiten und nicht so einen Quark nutzen :P aber so lange es funktioniert?
    alias yt_placeholder_format {
      if ($isid && $0 == 1) {
        if ( $1 isnum ) {
          var %i = 3, %j = 1, %suff = Tsd.Mio.Mrd
    
          while ( %i <= 9 ) {
            var %v = $round($calc($1 / (10^%i)), 2)
    
            if ( $len($int(%v)) <= 3 && $int(%v) > 0  ) {
              return %v $token(%suff, %j, 46)
            }
    
            inc %i 3
            inc %j
          }
    
        }
        elseif ( $lower($left($1, 2)) == $lower(PT) ) {
          var %t = $lower($mid($1, 3, $len($1)))
          var %d = 00, %h = 00, %m = 00, %s = 00
    
          while ( $len(%t) >= 1 ) {
            if ( $left(%t, 1) isnum ) {
              var %tmp = %tmp $+ $left(%t, 1)
            } 
            else {
              var  % $+ $left(%t, 1) $iif($len(%tmp) == 1, 0) $+ %tmp
              unset %tmp
            }
            var %t = $mid(%t, 2, $len(%t))
          }
    
          return $iif(%d != 00, %d $+ :) $+ $iif(%h != 00, %h $+ :, 00:) $+ $iif(%m != 00, %m $+ :, 00:) $+ %s
        }
        elseif ( $numtok($1, 84) == 2  ) {
          var %date = $token($1, 1, 84)
          return $token(%date, 3, 45) $+ . $+ $token(%date, 2, 45) $+ . $+ $token(%date, 1, 45)
        } 
      }
    
      return $1
    }
    
    ; Überprüft, ob eines der angegebenen Argumente in der Ignorelist ist
    ; Folgende Angaben sind möglich:
    ; Wenn nur $1: $1 = Channel/Nickname/Server der geprüft wird
    ; Wenn $1 und $2: $1 = Server, $2 = Nickname/Channel der in Kombination geprüft werden soll
    ; Wenn $1, $2, und $3: $1 = Server, $2 = Channel und $3 = Nickname
    ; Rückgabe: $true wenn eins der übergebenen Argumente in der Liste gefunden wird, ansonsten $false
    alias yta_is_in_ignorelist {
      if ( $isid ) {
        if ( $0 >= 1 ) {
          var %i = 1, %1 = $lower($1), %2 = $lower($2), %3 = $lower($3)
          while ( %i <=  $numtok(%yta/settings/IgnoreList/list, 44) ) {
            var %target = $lower($token(%yta/settings/IgnoreList/list, %i, 44))
    
            if ( %1 $+ : == %target || %1 == %target ) { 
              return $true
            } 
            elseif ( %2 != $null && ( %2 == %target || %1 $+ : $+ %2 == %target ) ) {
              return $true
    
            }
            elseif ( %3 != $null && (%3 == %target || %1 $+ : $+ %3 == %target) ) {
              return $true
            }
            inc %i
          }
        }  
        return $false
      }
    }
    
    ; Testet, ob in $1 der Text nach möglichen URLS geparst werden soll.
    ; $1 muss entweder chan oder priv sein
    ; Rückgabe: $true wenn parsing aktiv sein soll, ansonsten $false
    alias yta_is_parsing_active {
      if ( $isid ) {
        if ( ($1 == chan && %yta/settings/General/cmsg == 1) || ($1 == priv && %yta/settings/General/pmsg == 1) ) {
          return $true
        }
        return $false
      }
    }
    
    ; Testet, ob $1 eine URL ist die aktiv abgefragt werden soll
    ; Rückgabe: $true wenn sie aktiv ist, ansonsten $false
    alias yta_is_active_url {
      if ( $isid ) {
        var %i 1 
        while ( %i <= $numtok(%yta/settings/General/urls, 44) ) {
          if ( $1 == $token(%yta/settings/General/urls, %i, 44) ) {
            return $true
          }
          inc %i
        }
        return $false
      }
    }
    
    ;; #
    ;; Konfiguration laden/speichern
    ;; Nur über das Dialog Event Init aufrufen!
    ;; #
    alias yta_load_config {
      var %settings/General = cmsg pmsg echo urls apikey
      var %settings/Message = msg echo
      var %settings/IgnoreList = list
    
      var %i = 1
      while (%i <= $var(%settings/*)) {
        var %tmpk = $token($var(%settings/*, %i), 2, 47) 
        var %tmpv =  %settings/ [ $+ [ %tmpk ] ]
        var %j = 1
    
        while (%j <= $numtok(%tmpv, 32)) {
          var %item = $token(%tmpv, %j, 32)
          var %val = $readini($mircdir $+ yta_settings.ini, n, %tmpk, %item)
    
          set %yta/settings/ $+ %tmpk $+  / $+ %item $iif(%val == $chr(7), $null, %val)
          inc %j
        }
    
        inc %i
      }
    }
    
    alias yta_save_config {
      var %i = 1
    
      while ( %i <= $var(%yta/settings/*) ) {
        var %fp = $var(%yta/settings/*, %i)
        var %val = $var(%yta/settings/*, %i).value
        var %key = $token(%fp, $calc($numtok(%fp, 47) - 1), 47)
        var %item = $token(%fp, $numtok(%fp, 47), 47)
    
        ; Damit kein Fehler geworfen wird, representiert 7 (BEL) keinen Inhalt
        writeini $mircdir $+ yta_settings.ini  %key  %item  $iif(%val == $null, $chr(7), %val)
    
        inc %i
      }
    }
    
    ;;   ######################################
    ;;  # Nachrichtenverarbeitung und Socket #
    ;; ######################################
    ;; <# Haupt-Event
    ; Reagiert auf Texte (Channel/Privat) die 
    ; https?://(www)?youtu(.be|be.com) oder https?://(www)?yu2.be beinhalten
    ; Abbruch des Events passiert in mehreren Stufen, weil nicht Daten
    ; sofort vorhanden sind (z.B. der tatsächliche URL wird erst im Regex ermittelt).
    ;; #>
    on $*:TEXT:$(/https? $+ $chr(58) $+ \/{2}(w{3}\.)?(youtu\.?be(\.com)?|yu2.be)/Si):*: {
      ; Überprüfen, ob überhaupt parsing erlaubt ist
      if ( $chan != $null && !$yta_is_parsing_active(chan) ) {
        return $false
      }
      elseif ( $chan == $null && !$yta_is_parsing_active(priv) ) {
        return $false
      }
    
      ; Wenn das bearbeiten erlaubt ist, überprüfen dass auch kein Ziel (Server, Chan, Nick) ingoriert werden soll
      if ( !$yta_is_in_ignorelist($network, $iif($chan != $null, $chan, $nick), $iif($chan != $null, $nick)) ) {
        ; Folgendes regex soll die Video-ID suchen und das 1. Ergebnis speichern
        ; Den Regex kann man bestimmt schöner machen, aber er hat in meinen Tests funktioniert
        var %re = https?:\/{2}(?:w{3}\.)?((?:youtu\.?be(?:\.com)?|yu2.be))\/(?=watch\?v\=([a-zA-Z0-9_-]+)|([a-zA-Z0-9_-]+))
        if ( $regex(yta_re_match, $1-, / $+ %re $+ /Si) > 0 ) {
          var %vid = $regml(yta_re_match, 2), %host = $regml(yta_re_match, 1)
          ; Host/URL kann erst ab hier geprüft werden
          ; Ist die URL nicht Aktiv (Checkbox im UI) dann wird das Event hier beendet
          if ( !$yta_is_active_url(%host) ) {
            return $false
          }
          ; Ticks sind ms seit systemstart
          var %tick $ticks
    
          ; Um Spam zu verhindern, nur alle 30 Sekunden ein Video für Chan/Nick abfragen
          if ( $calc(%tick -  [ % $+ yta/spamprot/ $+ [ $network ]  $+  [ $iif($chan != $null, $chan, $nick) ] $+ /tick ] ) >= 30000 ) {
            set %yta/spamprot/ $+ $network $+ $iif($chan != $null, $chan, $nick) $+ /tick %tick
    
            ; Spamprot und request Variablen nach 30 Sekunden entfernen
            .timer $+ yta/timers/ $+ $network $+ $iif($chan != $null, $chan, $nick) 1 30  yta_request_cleanup $network $+ $iif($chan != $null, $chan, $nick)
    
            ; Socket öffnen und Informationen als mark speichern
            sockopen -e yta/sockets/ $+ %tick googleapis.com 443
            sockmark yta/sockets/ $+ %tick $network $+ , $+ $iif($chan != $null, $chan, $nick) $+ , $+ %vid
    
          }
        } 
      }
    }
    
    ;; <# Socket Logik
    ; Im folgendem Abschnitt befindet sich die Logik für den Umgang mit den geöffneten Sockets.
    ; Dabei gibt es zwei Hauptevents die bearbeitet werden.
    ; Beim öffnen wird eine HTTP Anfrage an den googleapis Server geschickt und die Markierung vom Socket in die Request-Variable geschrieben.
    ; Im Lesevorgang werden die erhaltenen Daten verarbeitet, in die Request-Variable geschrieben und die Ticknummer an die Funktion yta_send_message übergeben
    ;; #>
    on *:SOCKOPEN:yta/sockets/*: {
      ; Daten für das GET  Request zusammen tragen
      var %apikey %yta/settings/General/apikey
      var %vid $token($sock($sockname, 1).mark, 3, 44)
    
      var %tick $token($sockname, $numtok($sockname, 47), 47)
    
      ; Wenn eines von beiden nicht abgerufen werden kann, socket schließen
      if ( %apikey == $null || %vid == $null) {
        unset %yta/ytrequests/ $+ %tick $+ /*
        sockclose $sockname
        return $false
      }
    
      ; GET Request zusammensetzen
      var %get /youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics $+ &id= $+ %vid $+ &key= $+ %apikey
    
      ; HTTP Anfrage senden
      sockwrite -n $sockname GET %get HTTP/1.1
      sockwrite -n $sockname Host: www.googleapis.com
      sockwrite -n $sockname User-Agent: mSL YouTube Announcer
      sockwrite -n $sockname Accept: application/json
      sockwrite -n $sockname
    
      set %yta/ytrequests/ $+ %tick $+ / $+ network $token($sock($sockname, 1).mark, 1, 44)
      set %yta/ytrequests/ $+ %tick $+ / $+ dest $token($sock($sockname, 1).mark, 2, 44)
      set %yta/ytrequests/ $+ %tick $+ / $+ vid  $token($sock($sockname, 1).mark, 3, 44)
    
    }
    
    ; TODO Eventlogik umschreiben, so das Hashtables verwendet werde
    ; Durch filtern von Elementen die ersetzt werden, ensteht ein Chaos aus IF/ELSIF Verzweigungen.
    ; Deswegen wäre ein Rewrite mit Hashtables vielleicht sinnvoll, um alle Elemente vom JSON zu speichern.
    on *:SOCKREAD:yta/sockets/*: {
      var %tick $token($sockname, $numtok($sockname, 47), 47)
      var %line
    
      sockread %line
    
      ; HTTP Status-Code abfragen und entsprechend fortfahren oder abbrechen  
      if ( HTTP/1.1 isin %line ) {
        if ( $token(%line, 2, 32) != 200 ) {
          unset %yta/ytrequests/ $+ %tick $+ /*
          sockclose $sockname
          return $false
        }
    
      }
      elseif ( "publishedAt" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ publishedat %val
    
      } 
      elseif ( "title" isin %line && %yta/ytrequests/ [ $+ [ %tick ] $+ /title ] == $null ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ title %val
    
      } 
      elseif ( "channeltitle" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ channeltitle %val
    
      } 
      elseif ( "duration" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ duration %val    
    
      } 
      elseif ( "viewcount" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ viewcount %val    
    
      } 
      elseif ( "likecount" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ likecount %val    
    
      } 
      elseif ( "dislikecount" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ dislikecount %val    
    
      } 
      elseif ( "favoritecount" isin %line ) {
        var %val $token($yta_json_keyval_token(%line), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ favoritecount %val
    
      } 
      elseif ( "commentCount" isin %line ) {
        ; Quick and Dirty: Einfach ein Komma am Ende hinzufügen, weil sonst das Regex nicht greift
        var %val $token($yta_json_keyval_token(%line $+ $chr(44)), 2, 7)
        set %yta/ytrequests/ $+ %tick $+ / $+ commentcount %val    
    
        ; Comment Count ist das letzte Element das interessant ist für dieses Script
        sockclose $sockname
        yta_send_msg %tick
      } 
    }
    
    ; Wird ausgeführt, wenn die Gegenseite ein Socket beendet
    ; Entsprechend, damit sich nicht zu viele globale Variablen ansammeln, ein unset versuchen
    on *:SOCKCLOSE:yta/sockets/*: {
      var %tick $token($sockname, $numtok($sockname, 47), 47)
      unset %yta/ytrequests/ $+ %tick $+ /*
    }
    
    ;; <#
    ;; Helfer Funktionen und Events
    ;; #>
    
    ; Parst die Zeichenfolge und teilt diese in Key:Val auf (Token, Trennzeichen 7) (Quick and Dirty Version)
    ; Argument $1: Zeichenfolge im Format \s+"<Key>":\s"<Val>",
    ; Rückgabe: Key und Val als Token oder nichts bei Fehler
    ; TODO Regex umschreiben, so das es auch greift, wenn kein Komma am Ende ist (letzte Element in einer Liste in JSON)
    alias yta_json_keyval_token {
      if ( $isid ) {
        if ( $regex(yta_test, $1, /^\s+"(.*?)": "(.*?)" $+ $chr(44)$/) == 1 ) {
          var %key $regml(yta_test,1)
          var %val $regml(yta_test,2)
          return %key $+ $chr(7) $+ %val
        }
    
        return $null
      }
    }
    
    ; Wraper, um einfacher auf die Request-Variable zugreifen zu können
    ; Argument $1: Tick Nummer vom Request
    ; Rückgabe: Inhalt der Request-Variable oder $null
    ; Beispiel: echo -ga Title: $yta_request_result(<tick>).title
    alias yta_request_result {
      if ( $isid ) {
        if ( $var(%yta/ytrequests/ [ $+ [ $1 ] $+ ] /*) > 0 ) {
          return %yta/ytrequests/ [ $+ [ $1 ] $+ / $+ [ $prop ] ]
        }
        return $null
      }
    }
    
    ; Gibt die eingestellte Nachricht am Abfrageort aus oder per Echo im aktiven Fenster
    ; Argument $1: yta request Tick Nummer
    ; Die Funktion erwartet als 1. Argument den Namen der globalen Variable 
    ; für den Request der ausgegeben werden soll
    alias yta_send_msg {
      var %placeholders publishedAt $+ $chr(7) $+ title $+ $chr(7) $+ channelTitle $+ $chr(7) $+ duration $+ $chr(7) $+ favoritecount
      var %placeholders %placeholders $+ $chr(7) $+ viewcount $+ $chr(7) $+ likecount $+ $chr(7) $+ dislikecount  $+ $chr(7) $+ commentcount
    
      ; Replace mit dem Wraper befüllen
      var %replace $yta_request_result($1).publishedat $+ $chr(7) $+ $yta_request_result($1).title $+ $chr(7) $+ $yta_request_result($1).channeltitle 
      var %replace %replace $+ $chr(7) $+ $yta_request_result($1).duration $+ $chr(7) $+ $yta_request_result($1).favoritecount $+ $chr(7) $+ $yta_request_result($1).viewcount
      var %replace %replace $+ $chr(7) $+ $yta_request_result($1).likecount $+ $chr(7) $+ $yta_request_result($1).dislikecount $+ $chr(7) $+ $yta_request_result($1).commentcount
    
      var %dst $yta_request_result($1).dest
      var %net $yta_request_result($1).network
      if ( %yta/settings/General/echo == 1 ) {
        echo -gf %dst $yta_replace_placeholder(%yta/settings/Message/msg, %placeholders, %replace)
      } 
      else {
        .msg %dst $yta_replace_placeholder(%yta/settings/Message/msg, %placeholders, %replace)
      }
    }
    
    ; Entfernt die Spamprotect Variable und Request Variable
    ; Spamprotect ist fest auf 30 Sekunden einprogrammiert und wenn in der Zeit keine Rückmeldung gekommen ist, 
    ; kann auch die requests Variable verworfen werden
    ; Argument $1: Spamprotect Variable Identifikation
    alias yta_request_cleanup {
      var %tick %yta/spamprot/ [ $+ [ $1 ]  $+ /tick ]
    
      unset %yta/spamprot/ [ $+ [ $1 ] $+ /* ]
      unset %yta/ytrequests/ [ $+ [ %tick ] $+ /* ]
    }
    
    ; Settings in die INI schreiben, Timer und Sockets anhalten und globale Variables löschen
    alias yta_uninstall {
      yta_save_config
      sockclose yta/sockets/*
    
      var %i 1
    
      while ( %i <= $timer(0) ) {
        var %tname $timer(%i)
    
        if ( yta/timers/ isin %tname ) {
          .timer $+ %tname off
        }
    
        inc %i
      }
    
      unset %yta/*
    
      echo -ag - YouTube Announcer - Das Script ist nun deaktiviert und sollte auf keine YouTube Links mehr reagieren.
    }
    
    ; Wenn das Script entladen wird, uninstall ausführen
    on *:UNLOAD: {
      yta_uninstall
    }

     

  12. ;=====================================================
    ; ChatToIRC
    ; DIVERSE ZAKEN VOOR ChatToIRC
    ;=====================================================
    ;=====================================================
    ; Auteur: JamesBond
    ; Homepagina: https://chatplezier.com/
    ; Netwerk: ChatPlezier 
    ; Server: irc.chatplezier.com
    ; Email: jamesbond@chatplezier.com
    ;=====================================================
    
    on ^*:notice:*:?: { if ($nick == BotServ) || ($nick == ChanServ) || ($nick == HostServ) || ($nick == MemoServ) || ($nick == NickServ) || ($nick == OperServ) || ($nick == StatServ) {
        if (!$window($+(@Notice.ChatBot.,$network,.,$cid))) window -ng @Notice.ChatBot. [ $+ [ $network ] ] $+ . [ $+ [ $cid ] ]
        echo @Notice.ChatBot. $+ $network $+ . $+ $cid $timestamp 08,1[11,01NOTICE08,01.11,01 $+ $nick $+ 08,01] $1- 
        haltdef
      }
      else { 
        if ($nick == *status) {
          if (!$window($+(@Notice.status.,$network,.,$cid))) window -n @Notice.status. [ $+ [ $network ] ] $+ . [ $+ [ $cid ] ]
          echo -te $+(@Notice.status.,$network,.,$cid) $1-
          haltdef
        }
        else { 
          if (!$window($+(@Notice.,$network,.,$cid))) window -n @Notice. [ $+ [ $network ] ] $+ . [ $+ [ $cid ] ]
          echo -te $+(@Notice.,$network,.,$cid) 08,1[11,01NOTICE08,01.11,01 $+ $nick $+ 08,01] $1-
        haltdef }
      }
    }
    on ^*:notice:*:#: {
      if (!$window($+(@Notice.,$network,.,$cid))) window -n @Notice. [ $+ [ $network ] ] $+ . [ $+ [ $cid ] ]
      echo @Notice. $+ $network $+ . $+ $cid $timestamp 08,01[11,01NOTICE08,01.11,01 $+ $chan $+ 08,01.11,01 $+ $nick $+ 08,01] $1-
      haltdef
    }

    ederlandse/Dutch uitleg/explanation

    dit is een simpel notice script dat ik heb gemaakt,

    dit script
    zet alle texten van BotServ, ChanServ, HostServ, MemoServ, NickServ, OperServ en StatServ in het venster: Notice.ChatBot.NetWerkNaam

    als u bvb /bs help typ of /cs help, dan zal het uitleg daarvan op die pagina belanden.
    ook als u een Commando uitvoert en als hij u iets aangeeft, (dan zal het daar ook belanden).
    de gewone notice van andere ChatBots komen in een ander venster terecht: Notice.NetWerkNaam

    ik wens jullie alvast veel plezier met het script

    mvg Jamesbond

    ENGELS/English uitleg/explanation

    this is a simple notice script I made,

    this script
    put all text from BotServ, ChanServ, HostServ, MemoServ, NickServ, OperServ and StatServ in the window: Notice.ChatBot.NetWerkName

    For example, if you type / bs help or / cs help, the explanation will end up on that page.
    even if you execute a Command and if he tells you something, (it will also end up there)
    the normal notice from other ChatBots ends up in another window: Notice.NetWerkName

  13. In early November, a developer contributing to Google's open-source Chromium project reported a problem with Oilpan, the garbage collector for the browser's Blink rendering engine: it can be used to break a memory defense known as address space layout randomization (ASLR).

    About two weeks later, Google software security engineer Chris Palmer marked the bug "WontFix" because Google has resigned itself to the fact that ASLR can't be saved – Spectre and Spectre-like processor-level flaws can defeat it anyway, whether or not Oilpan can be exploited.

    Or as Palmer put it, "we already have to plan for a world in which ASLR is bypassable."

    On Wednesday, Chromium's bug tracking bot lifted the curtain on the previously private discussion and made it publicly accessible.

    Security researchers have been warning about the shortcomings of ASLR for years. The defense mechanism works by placing parts of software in randomly selected regions of the code's memory address space, and these positions change every time the software is started. This makes life hard for those writing malware that exploits vulnerabilities in applications and operating systems: the miscreants can't be sure where components needed to attack the code are located in memory, and their exploits will fail to work.

    But, as we said, ASLR is not bombproof. It simply increases the barrier miscreants have to jump over before they can hack a victim's system. In a 2017 paper, Vrije Universiteit Amsterdam researchers wrote, "ASLR is fundamentally flawed in sandboxed environments such as JavaScript and future defenses should not rely on randomized virtual addresses as a building block."

  14. YouTube has long had a version of its mobile app called YouTube Kids that provides a limited experience for kids in terms of videos they can watch on the platform. The app is meant to ensure that children aged four years and above watch only age-appropriate content and set a limit to their screen time.

    For teens and preadolescents, YouTube acknowledges they have a different kind of need for learning and creativity. That is why the service is introducing a new capability that will allow parents to control the type of content teens and tweens can watch through a supervised account.

    The new experience will launch in beta over the next few months and parents will have the option to choose from any of three different levels of access to YouTube: Explore, Explore more, and Most of YouTube. "Explore" is for children aged nine and above who are ready to use the main YouTube app and discover various types of content such as tutorials, gaming videos, music clips, news, and educational videos, among others. The second level allows kids aged 13 years and above to watch a broader set of content and live streams similar to those available under Explore. "Most of YouTube" provides access to almost every type of content, save for age-inappropriate videos.

     

    More Here

  15. We already know that Bill Gates made the jump to Android back in 2017, presumably from Windows phones. At that time, Gates just stated that he uses an Android device with "lots of Microsoft software", and does not use an iOS handset. Now, the business magnate has revealed why he prefers Android over iOS.

    In an interview with journalist Andrew Ross Sorkin on Clubhouse, Gates went on to say that:

    I actually use an Android phone, because I want to keep track of everything, I'll often play around with iPhones, but the one I carry around happens to be Android.

    [...] Some of the Android manufacturers pre-install Microsoft software in a way that makes it easy for me. They're more flexible about how the software connects up with the operating system. So that's what I ended up getting used to. You know, a lot of my friends have ‌iPhone‌, so there's no purity.

    While Gates may prefer Android because of the flexibility it offers and the ecosystem, Clubhouse is still currently an invite-only app currently available just on iPhones.

    Although Bill Gates has been using Android phones for the past several years, he has previously expressed disappointment at how Microsoft missed the mobile race, calling it his "greatest mistake".

    Source: MacRumors


  16. Microsoft is almost as keen to kill off Legacy Edge, Windows 10's original great browser hope, as it is to stomp on the ancient Internet Explorer – because it looks like it'll be sticking around on the Surface Hub.

    Ostensibly a celebration of the fact that the Windows 10 Team 2020 update would finally go worldwide (for Surface Hub 2S devices at least) on 23 February, the announcement seemed to hold hope for users still clinging to the obsolete browser.

    Earlier this month the company warned Windows 10 users that Legacy Edge would drop out of support in March and eventually be stripped from the operating system in favour of Chromium Edge as part of the April update. Although the company insisted that "Microsoft Edge Legacy will no longer be on devices" after the update is applied, the rendering engine behind the scenes – EdgeHTML – will linger on.

    It seems that users of Microsoft's fancy whiteboard will be given a little extra time with the browser. While users are encouraged to install Chromium Edge, "the Microsoft Edge Legacy browser will remain the default browser on Surface Hubs until its replacement in a future update

    More Here

     

  17. More HereThe U.S. Department of Justice (DoJ) on Wednesday indicted three suspected North Korean hackers for allegedly conspiring to steal and extort over $1.3 billion in cash and cryptocurrencies from financial institutions and businesses.

    The three defendants — Jon Chang Hyok, 31; Kim Il, 27; and Park Jin Hyok, 36 — are said to be members of the Reconnaissance General Bureau, a military intelligence division of North Korea, also known as the Lazarus groupHidden Cobra, or Advanced Persistent Threat 38 (APT 38).

    Accusing them of creating and deploying multiple malicious cryptocurrency applications, developing and fraudulently marketing a blockchain platform, the indictment expands on the 2018 charges brought against Park, one of the alleged nation-state hackers previously charged in connection with the 2014 cyberattack on Sony Pictures Entertainment.

    A Wide-Ranging Scheme to Commit Cyberattacks and Financial Crimes

    "North Korea's operatives, using keyboards rather than guns, stealing digital wallets of cryptocurrency instead of sacks of cash, are the world's leading bank robbers," said Assistant Attorney General John C. Demers of the Justice Department's National Security Division.

  18. The PC industry is expected to release 40 new Chromebook models this year, according to Google. This is almost certainly driven by sky-high demand for the basic computing devices, which are especially popular in classrooms home schooling.

    For context, Chromium.org lists just 20 new Chromebook releases during 2020. During 2019, 39 new releases were listed, although may of these were effectively different permutations of the same device, with only minor differences in terms of processor used, etc.

    Google said it plans to issue a major overhaul of Chrome OS in March, with the main focus on education users. Users will be able to natively record their screens without having to rely on a third-party plugin, such as Screencastify. Parental controls will be a focus, allowing students to link their personal accounts (which may have restrictions on usage) to their education workspace. Separately, the Chocolate Factory said is launching an admin console designed for the speedy provision and management of new Chromebook devices.

    This follows an earlier promise made by Google in 2020 to provide new Chromebook devices with at least eight years of software updates. Support was previously something of a mixed bag, with machines typically getting between five and six years of updates.

    While you can use a Chromebook after its EOL point, security patches and site compatibility will be a major concern (although this can be minimised somewhat by using Linux in a chroot environment, like Crouton). You may also encounter issues using Android apps, should they require a newer version of the Android API than the one supported on your particular device.

    As previously noted, 2020 was a bumper year for Chromebook sales, with pent-up demand from personal and education customers sending the segment soaring past the Mac. In terms of purchasing activity, it is now the second-largest traditional computing category.

    Analyst data bears this out, with Canalys reporting 287 per cent year-on-year growth during Q4 2020, with shipments hitting 11.2 million.

     

    More Here

  19. oday, Microsoft announced its next big Long-Term Servicing Channel (LTSC) releases, which means that they're supported for longer. Both Office and Windows 10 are typically on the Semi-Annual Channel (SAC), which gets feature updates every six months. LTSC releases come every few years.

    Essentially, both Office and Windows 10 are getting their LTSC releases later on this year. That's what it all adds up to, so for Windows 10, it's going to be the 21H2 release of the OS. There's also a new perpetual license version of Office coming, something that we've known since September, but now we know that it's going to be called Office 2021.

    The difference with a perpetual license version is that if you buy Office 2021, you own it forever, as opposed to a subscription model where you lose it if you stop paying. Of course, with Office 2021, you don't get new features over time. Office 2021 replaces Office 2019, and it's the first time that the name has increased by any amount of years instead of three in about a decade and a half.

    Read More Here

     

×
×
  • Create New...