본문 바로가기

Data

privite irc script

기존 냐옹이 스크립트와 이것저것 짜집기하였습니다.

on *:text:*:#leaveret,#test,#leaveret_semi: {
  if ( ( 나가 isin $1- || 나가 isin $2- ) && ( !냐옹이 isin $1- || !봇나가 isin $1- ) ) {
    if ( $nick == 냐옹이컨벤션센터 ) { halt }
    /msg $chan $nick : bot leaving attempt was detected. Dominator system activated.
    if ( $nick isin cd80 ) {
      /msg $chan Is not execution target. 04Trigger locks.
      if ( $address($nick,2) == *!*@218.147.156.208 ) { halt }
      /msg $chan but usermask 00,04mismatch 01,00, plz auth..
      /invite 냐옹이컨벤션센터 #leaveret
      halt
    }
    elseif ( $2 == $null || $address($nick,2) == *!*@218.147.156.208 ) {
      /msg $chan Execution mode, 04Non-lethal Paralyzer
      if ( $nick isop $chan ) {
        /mode $chan -v-o $nick $nick
      }
      else {
        /msg $chan The judgment of the target has been updated. Execution mode, 04Lethal Eliminator
        /mode $chan +o $nick
        /kick $chan $nick execution complete.
      }
    }
    else {
      /msg $chan Execution mode, 04Lethal Eliminator
      if ( $nick isop $chan ) { /kick $chan $nick Leaving [by p0p0pret] }
      else { /mode $chan -v+o $nick $nick }
      /kick $chan $nick execution complete.
      /invite 냐옹이컨벤션센터 $chan
    }
    halt
  }
  elseif ( !언셋 isin $9 && 카운트는 isin $3 ) { /msg $chan !언셋 $nick }
  elseif ( $1 == !회의모드 ) {
    if ( $2 == $null ) { /msg $chan 회의모드 : Beta 사용법 : !회의모드 on/off, 인가된 사용자가 아닌경우 킥처리 합니다. | halt }
    elseif ( !@119.192.143 isin $address($nick,2) || @218.147.156 isin $address($nick,2) ) {
      /msg $chan 인증 성공
    }
    elseif ( $me isop $chan && $nick isop $chan ) {
      /msg $chan 1차 인증에 실패하였으므로 2차인증에 들어갑니다. 옵레벨을 1이하로 만들어 주세요. (남은시간 6초)
      halt
    }
    else {
      /msg $chan 인증자와 제가 옵을 가진 상태에서 진행해 주세요.
      halt
    }

    /msg $chan $nick 관리자님 환영합니다.

    if ( $2 == on ) {
      mdop
      /mode $chan +m
      /mode $chan +o $nick
      halt
    }
    elseif ( $2 == off ) {
      mop
      /mode $chan -m
      halt
    }
    else {
      /msg $chan 존재하지 않는 옵션이거나 옵이 없습니다. | halt
    }
  }
  else { halt }
}

사소하지만 자동 언셋기능을 추가하였습니다.
회의모드가 추가되었지만 2차인증과 올디보이스 아직 미구현 mirc 스크립트 특성상 딜레이 주는 방법을 찾기가 힘듭니다.




따라서 참고될만한 alias를 찾으러 http://irc-script.ly.lv 를 돌아다녀보니...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Alias Allmode {
  if (!$2) ap_echo 사용법이 틀렸습니다.
  elseif ($me !ison $1) ap_echo 해당 채널에 제가 접속되어 있지 않습니다.
  elseif ($me !isop $1) ap_echo 해당 채널에서 제가 옵을 소유하고 있지 않습니다.
  else {
    var %human = $iif($2 == +o,$nopnick($1,0),$iif($2 == -o,$opnick($1,0),$iif($2 == +v,$nvnick($1,0),$iif($2 == -v,$vnick($1,0),null))))
    if (%human == null) ap_echo 잘못된 모드 입니다. (지원모드: +o -o +v -v)
    elseif ((%human == 0) && ($2 == +o)) ap_echo 모든 사용자가 옵을 가지고 있습니다.
    elseif ((%human == 1) && ($2 == -o)) ap_echo 옵을 소지한 사용자가 존재하지 않습니다.
    elseif ((%human == 0) && ($2 == +v)) ap_echo 모든 사용자가 보이스를 가지고 있습니다.
    elseif ((%human == 0) && ($2 == -v)) ap_echo 보이스를 소지한 사용자가 존재하지 않습니다.
    else {
      var %mode = $right($2,1) , %i = 1
      while (%i <= %human) {
        :mode
        var %nick[tmp] = $iif($2 == +o,$nopnick($1,%i),$iif($2 == -o,$opnick($1,%i),$iif($2 == +v,$nvnick($1,%i),$vnick($1,%i))))
        if ((%nick[tmp] == ^^) || (%nick[tmp] == Chanserv) || (%nick[tmp] == $me)) {
          inc %i
          Goto mode
        }
        elseif ($count(%nick,$chr(32)) == $calc($modespl - 3)) {
          var %nick = %nick %nick[tmp]
          mode $1 $left($2,1) $+ $str(%mode,$calc($v2 + 2)) %nick
          var %nick = $null
        }
        else var %nick = %nick %nick[tmp]
        inc %i
      }
      if (%nick != $null) mode $1 $left($2,1) $+ $str(%mode,$calc($count(%nick,$chr(32)) + 1)) %nick
    }
  }
}
제외 대상도 명확하게 명시하고 꽤 효율적으로 코딩한듯한데 주석도 없고 문법도 익숙하지 않아서 일단 스킵


Goto 미사용, 주석있는 스크립트.

mass {
   if ($me !isop #) echo -a $pattern $+ $chan 채널에서 옵을 가지고 있지 않습니다.
   ;자신이 채널에서 옵을 가지고 있지 않다면 에코 메세지를 출력하는겁니다. $pattern 은 로고 같은거니깐 신경쓰지 마세요 ^^
   else {
   ;옵을 가지고 있다면
     var %mode $1 $+ $2
     ;/mass + o 이렇게 올옵을 했다면 %mode 변수는 +o 가 됩니다.
     if (%mode == +o) {
       if ($nopnick(#,0) == 0) { echo -a $pattern $+ $chan 채널에는 모든 유저가 옵을 가지고 있습니다. | halt }
       ;$nopnick 함수는 채널에서 옵을 가지고 있지 않은 닉이나 인원을 확인할때 쓰는 함수입니다. 값이 0이라면 다 옵을 가지고 있다는 거니 halt로 끝내면 되겠죠.
       var %nickmode nopnick
       ;%nickmode 변수는 나중에 while 반복문에서 어떤 용도로 쓰이는지 알게 될겁니다.
     }
     if (%mode == -o) {
       if ($opnick(#,0) == 1) { echo -a $pattern $+ $chan 채널에는 옵을 가진 유저가 없습니다. | halt }
       ;$opnick 함수는 채널에서 옵을 가지고 있는 닉이나 인원을 확인할때 쓰는 함수입니다. 위에서 옵이 있을때만 반응하게 했고 옵을 가지고 있는 사람이 1명이라는건 자기자신만 옵을 가지고 있는거니깐 halt
       var %nickmode opnick
     }
     if (%mode == +v) {
       if ($nvnick(#,0) == 0) { echo -a $pattern $+ $chan 채널에는 모든 유저가 보이스를 가지고 있습니다.(오퍼 무시) | halt }
       ;위의 내용이랑 비슷하니 생략. 아래 $vnick 역시 생략.
       var %nickmode nvnick
     }
     if (%mode == -v) {
       if ($vnick(#,0) == 0) { echo -a $pattern $+ $chan 채널에는 보이스를 가진 유저가 없습니다. | halt }
       var %nickmode vnick
     }
     if ($3) var %nickmode snick
     ;$snick 이 뭘까요? +_+ 닉리스트에서 선택된 닉이나 인원을 확인할 때 쓰는 함수입니다.
     ;여기서 부터가 제일 핵심부분이죠.
     var %i 1
     while (%i <= $ [ $+ [ %nickmode $+ (#,0) ] ]) {
     ;아까 %nickmode 에는 nopnick 이런게 들어있겠죠.
     ;$ [ $+ [ %nickmode $+ (#,0) ] ] = $nopnick(#,0) 은 옵을가지고 있지 않은 인원이 되겠죠. %i 가 $nopnick(#,0) 보다 작거나 같다면 이 반복문은 계속 실행됩니다.
       if (!$3) {
       ;$3가 없다는건 올옵, 올디옵 같은거겠죠.
         if ($ [ $+ [ %nickmode $+ (#,%i) ] ] != $me) set %nick.temp %nick.temp $ [ $+ [ %nickmode $+ (#,%i) ] ]
         ;여기서 %i = 1 이고 %nickmode = nopnick 이라면 $nopnick(#,1) 이 되고, 옵을 가지고 있지 않은 첫번째 닉이 %nick.temp 변수에 들어가겠죠. %nick.temp %nick.temp 이걸 보면 아시겠지만 %nick.temp 변수는 닉1 닉2 닉3 ... 이런식으로 값이 들어갑니다.
       }
       else set %nick.temp %nick.temp $ [ $+ [ %nickmode $+ (#,%i) ] ]
       ;$3(닉리스트)에서 선택된 닉의 모드 변경을 하는거죠. 자신의 닉까지 %nick.temp 에 들어가는걸 뺀다면 위의 내용과 같습니다.
       if ($count(%nick.temp,$chr(32)) == $calc($modespl -1)) {
       ;$modespl 은 한번에 몇개의 옵을 줄수 있는지 확인을 하는 함수입니다.(대게 $modespl = 6)
       ;간혹 $modespl 값이 이상하게 나올때도 있지만 대게 그 서버에서 설정되어 있는 수 만큼 나옵니다. 이의 값을 초과할 경우는 무시되니 유의하시기 바랍니다. ;;
       ;$count(%nick.temp,$chr(32)) 는 %nick.temp 에서 몇개의 공백( $chr(32) ) 있는지 수를 세리는겁니다.
       ;닉1 닉2 닉3 이렇게 값이 들어있다면 이 $count 의 값은 2겠죠. 이 카운트 함수의 값이 $modespl 에서 1을 뺀 수와 같다면 반응합니다.
       ;$modespl 수 만큼 %nick.temp 닉들이 들어있다면 아래와 같이 하면 됩니다.
         mode # $1 $+ $str($2,$modespl) %nick.temp
         ;mode #irc-script +oooooo 닉1 닉2 닉3 닉4 닉5 닉6 이런식으로 옵을 주겠죠.
         ;$str은 문자를 반복시킬때 사용하는 함수입니다. $str(1,5) 이렇게 한다면 55555 이렇게 나오겠죠.
         unset %nick.temp
         ;이렇게 옵을 주거나면 %nick.temp의 값들은 더이상 필요없게 되니 unset(변수 지우는 명령어)을 하면 됩니다.
       }
       if (%i == $ [ $+ [ %nickmode $+ (#,0) ] ]) {
       ;%nickmode 가 nopnick 일때 %i == $nopnick(#,0) 이 된다면 옵을 가지고 있지 않은 닉 중에서 마지막닉이라는 말이 됩니다.
       ;그러니 여기서 mode 명령을 내리면 되겠죠.
         mode # $1 $+ $str($2,$modespl) %nick.temp
         unset %nick.temp
       }
       inc %i
       ;어떻게 보면 전혀 필요없을거 같지만 while문에서는 아주 중요한 명령어죠. 수를 증가시키는 명렁입니다.
       ;형식: /inc 변수 값 <ㅡ 값을 적지 않는다면 1씩 증가됩니다. %i = 1 이었다면 inc %i 하고나면 %i = 2 가 되겠죠.
       ;while문은 조건에 만족하면 계속 반복하게 되어있습니다.
       ;같은 while문이라도 어떤 조건을 하냐에 따라 반복되는게 틀려지겠지만 이 스크립 같은경우는 1부터 $ [ $+ [ %nickmode $+ (#,0) ] ]) 만큼 순차적으로 돌려야 합니다.
       ;그래서 /inc 명령을 쓰게 되는겁니다. 그리고 %i 값이 계속 증가하면서 while문 조건에 맞지 않으면 멈추게 되죠.
     }
   }
}

이건 길어서 스킵. 생각해보니 간단하게 뜯어볼만한 스크립트가 이미 로컬에 있습니다.
zeroirc 올디옵 스크립트
if ([ %Mdop. [ $+ [ $site ] ] ] == $null) { set %Mdop. [ $+ [ $site ] ] 1 | .timerd9_ $+ $rand(a,Z) $+ $rand(1,9) 1 20 /unset %Mdop. [ $+ [ $site ] ] }
이런게 있고 스크립트 내에서도 mdop 라는 한단어로 올디옵이 되길래 mirc.ini파일 을보니
아리까리한 줄표시로 작성된 문구가 나옵니다. zeroirc의 화려한 광고문구(?)도 마침 저기 저장되있길래 지웠습니다.
n0="mdop"
n1="mdo["
n2="leaveret"
n3="나가"
n4=""
n5=""
n6="quit"
n10=""
[afiles]
n0=xsystem\aliases.ini

저 변수(줄표시?)에 해당되는 파일이 있어서 가보니 goto로된 스크립트가 나옵니다.

n81=mdop  {
n82=  if ($me !isop #) echo -a  0,1 $chan에 옵을 가지고 있지 않습니다.
n83=  else {
n84=    set %i 0
n85=    unset %nicks
n86=    set %j 0
n87=    unset %tmp.mdop
n88=    :start
n89=    inc %i
n90=    if ($opnick(#,%i) == $null) {
n91=      if ((%nicks) || (%tmp.mdop)) {
n92=        if (%nicks) set %tmp.mdop %tmp.mdop $+ mode # - $+ $str(o,6) %nicks
n93=        .quote %tmp.mdop
n94=        unset %nicks %tmp.mdop
n95=      }
n96=      else echo -a  0,1 더이상 옵을 가진 유저가 없습니다.
n97=    }
n98=    else {
n99=      if ($opnick(#,%i) == $me) goto start
n100=      set %nicks %nicks $opnick(#,%i)
n101=      inc %j
n102=      if (%j == 6) {
n103=        set %tmp.mdop %tmp.mdop $+ mode # - $+ $str(o,6) %nicks $+ $lf
n104=        set %j 0
n105=        unset %nicks
n106=      }
n107=      goto start
n108=    }
n109=  }
n110=}
n111=mdv {
n112=  if ($me !isop #) echo -a  0,1 $chan에 옵을 가지고 있지 않습니다.
n113=  else {
n114=    set %i 0
n115=    set %nicks
n116=    set %j 0
n117=    :start
n118=    inc %i
n119=    if ($vnick(#,%i) == $me) goto start
n120=    elseif ($vnick(#,%i) == $null) {
n121=      mode # - $+ $str(v,6) %nicks
n122=      unset %nicks
n123=    }
n124=    else {
n125=      set %nicks %nicks $vnick(#,%i)
n126=      inc %j
n127=      if (%j == 6) {
n128=        mode # - $+ $str(v,6) %nicks
n129=        set %j 0
n130=        set %nicks
n131=      }
n132=      goto start
n133=    }
n134=  }
n135=}


결론 : 찾아보니 mdv가 있습니다. 며칠 삽질한 것은 고자;

ps : 2차인증은 저번에 나갔다 들어오는 스크립트 작성한거 뺀것과같이 그냥 옵레벨 1로 만들라고 할예정입니다.