aIRC — File Browser

aIRCv0.8.69 / aIRCv0.8.69 / script / partyline2.mrc

partyline2.mrc — 20.87 KB — Download this file

;/**********************************************************************
; *
; * aIRC
; * Partyline (commands)
; *
; **********************************************************************/

;;
;
; -( ASSOC )-
;
;;

;_
; assoc
; assoc

;;
;
; -( CHANINFO )-
;
;;

; chaninfo +m|m
; chaninfo <channel>
alias chaninfo { _useredit.echocode chaninfo $1 }
alias _cmd.chaninfo {
  if ($1 != $null) {
    if ($_not($_ischan($2))) { tokenize 32 $1 %~plparse.cchan }
    if ($_not($_ismaster($1,$2,mn))) { return 999 chaninfo }
  }
  elseif ($_not($_ischan($2))) { tokenize 32 $2 $chan }
  if ($_not($_ischan($2))) { return 531 }
  var %win1 = @__chaninfotmp,%win2 = @__chaninfo,%file = $_tmpfile
  _openwins %win1 %win2
  clear %win1
  aline %win1 Settings for channel $2
  aline %win1 Protect modes (chanmode): $iif($_rchini(chanmode,$2) != $null,$_rchini(chanmode,$2),None)
  ;  aline %win1 Idle Kick after (idle-kick): $iif($_rchini(idle-kick,$2) != $null,$_rchini(idle-kick,$2),DONT!)
  if ($1 == $null) || ($_ismaster($1,0,n)) {
    ;    if ($_rchini(need-op,$2) != $null) {
    ;      aline %win1 To regain op's (need-op):
    ;      aline %win1  $ifmatch
    ;    }
    ;    if ($_rchini(need-invite,$2) != $null) {
    ;      aline %win1 To get invite (need-invite):
    ;      aline %win1  $ifmatch
    ;    }
    ;    if ($_rchini(need-key,$2) != $null) {
    ;      aline %win1 To get key (need-key):
    ;      aline %win1  $ifmatch
    ;    }
    ;    if ($_rchini(need-unban,$2) != $null) {
    ;      aline %win1 If Im banned (need-unban):
    ;      aline %win1  $ifmatch
    ;    }
    ;    if ($_rchini(need-limit,$2) != $null) {
    ;      aline %win1 When channel full (need-limit):
    ;      aline %win1  $ifmatch
    ;    }
  }
  if ($1 == $null) || ($_ismaster($1,$2,mn)) {
    %chaninfouser = $2
    aline %win1 Other modes:
    aline %win1 % $+ {cols=4/70}
    var %i = 1,%t
    while ($gettok($_partyline.chansetflags,%i,32) != $null) {
      %t = $ifmatch
      aline %win1 $iif($_rchini(%t,$2),+,-) $+ %t
      inc %i
    }
    aline %win1 % $+ {end}
    unset %chaninfouser
  }
  _remove %file
  _eggtext.parse $1 1 %win1 %file
  loadbuf %win2 $"(%file)
  .timer -o 1 0 _cmdlog $iif($1,$1,$me) chaninfo $2
  return 222 %win2 %win1 $+ , $+  %win2
}
;;
;
; -( CHANNELS )-
;
;;

;
; +ban +o|o
; +ban <hostmask> [channel] [%bantime<XdXhXm>] [reason]
alias +ban { _useredit.echocode +ban $1- }
alias _cmd.+ban {
  if ($1 != $null) {
    if ($_ischan($3)) { var %~flags = $_nickflags($1,$3) }
    else { var %~flags = $_nickflags($1) }
  }
  if ($1 != $null) && (o !isincs %~flags) && (m !isincs %~flags) && (n !isincs %~flags) { return 999 +ban }
  var %~handle = $1,%~hostmask = $2,%~chan = global,%~bantime = 0,%~sticky = 0
  if (%~handle == $null) { %~handle = $me }
  tokenize 32 $3-
  if (%~hostmask == $null) { return 524 }
  %~hostmask = $_fixmask(%~hostmask)
  if ($_not($_ismask(%~hostmask))) { return 470 }
  if ($_ischan($1)) {
    %~chan = $1
    tokenize 32 $2-
  }
  var %~var = % $+ bantime
  if ($left($1,8) == %~var) {
    if ($remove($1,%~var) isnum) && ($remove($1,%~var) > 0) { %~bantime = $remove($1,%~var) }
    else { %~bantime = $_dhm2secs($remove($1,%~var)) }
    tokenize 32 $2-
  }
  if ($left($1-,1) == *) {
    %~sticky = 1
    tokenize 32 $right($1-,-1)
  }
  tokenize 32 $iif($1- != $null,$1-,requested)
  ; %~handle
  ; %~flags
  ; %~hostmask
  ; %~chan
  ; %~bantime
  ; $1- = reason
  if (%~hostmask iswm %.myaddress) {
    .timer -o 1 0 _cmdlog $iif($1,$1,$me) attemped +ban %~hostmask
    return 525 %~hostmask
  }
  var %~line = %~chan %~hostmask %~handle $ctime %~bantime 0 %~sticky $1-
  __cmd.+ban.setban %~line
  _cmdlog %~handle ( $+ $iif(%~chan == global,GLOBAL,%~chan) $+ ) +ban %~hostmask $iif(%~chan != global,%~chan) ( $+ $1- $+ ) $iif(%~sticky,$_nospaces($chr(40),sticky,$chr(41)))
  if ($1- != $null) { _recent.add banreason 20 $iif($_ischan(%~chan),$replace($1-,%~chan,<CHAN>) },$1-) }
  return 213 %~line
}
; __cmd.+ban.setban channel hostmask handle $ctime bantime duration sticky reason
alias __cmd.+ban.setban {
  var %~file = $_baninifile,%~index = $1 $2,%~line,%last = 0,%fl
  %fl = $read -ns" $+ %~index $+ " %~file
  if ($_not($readn)) { hadd _aircinternalbanlist $calc($hget(_aircinternalbanlist,0).item + 1) %~index }
  if ($gettok(%fl,5,32)) { %last = $ifmatch }
  %~line = $1 $2 $3 $ctime $5 %last $7 $8-
  write -s" $+ %~index $+ " " $+ %~file $+ " %~line
  if ($_connected) {
    if ($5 > 0) { .timer_-ban $+ $1 $+ , $+ $2 1 $5 $iif($show,-ban,.-ban) $2 $iif($_ischan($1),$1) }
    else { .timer_-ban $+ $1 $+ , $+ $2 off }
    if ($1 == global) {
      var %i = $chan(0),%chan
      while (%i) {
        %chan = $chan(%i)
        if ($me isop %chan) { _addbaninchanbutcheckdynamic $iif($_rchini(dynamicbans,%chan),1,0) %chan $2 0 $8- }
        dec %i
      }
    }
    elseif ($_ischan($1)) && ($me isop $1) { _addbaninchanbutcheckdynamic $iif($_rchini(dynamicbans,$1),1,0) $1 $2 0 $8- }
  }
}

;_
; +exempt +o|o
; +exempt <hostmask> [channel] [%exempttime<XdXhXm>] [comment]


;_
; +invite +o|o
; +invite <hostmask> [channel] [%invitetime<XdXhXm>] [comment]

; +chan +n
; +chan <channel>
alias +chan { _useredit.echocode +chan $1- }
alias _cmd.+chan {
  if ($1 != $null) && ($_not($_ismaster($1,0,n))) { return 999 +chan }
  if ($_not($_ischan($2))) { return 522 }
  if ($readini -n " $+ $_chaninifile $+ " $2 chan) { return 523 }
  var %i = 1,%t
  _wchini $2 chan $2
  while ($gettok($_partyline.chansetflags,%i,32) != $null) {
    %t = $ifmatch
    _wchini $2 %t $_getsetup(chan,%t)
    inc %i
  }
  _cmdlog $iif($1,$1,$me) +chan $2
  return 225 $2
}


; +chrec +m|m
; +chrec <User> <channel>
alias +chrec { _useredit.echocode +chrec $1- }
alias _cmd.+chrec {
  if ($2 != $null) && ($3 == $null) { tokenize 32 $1 $2 $_ruini($2,console-chan) }
  if ($1 != $null) && ($_not($_ismaster($1,$3,mn))) { return 999 +chrec }
  if ($2 == $null) || ($_not($_ischan($3))) { return 511 }
  if ($_validateuser(4,$2,$null)) { return $ifmatch $2 }
  if ($_partyline.chlevels($1,$2,$3)) { return 998 }
  if ($istok($_ruini($2,channels),$3,32)) { return 512 $2 $3 }
  _wuini $2 channels $addtok($_ruini($2,channels),$3,32)
  _cmdlog $iif($1,$1,$me) +chrec $2 $3
  return 210 $2 $3
}

; -ban +o|o
; -ban <hostmask OR number> [channel]

alias -ban { _useredit.echocode -ban $1- }
alias _cmd.-ban {
  var %chan,%dl,%line,%hostmask,%lc,%index
  if ($_ischan($3)) { %chan = $3 }
  if (%chan == $null) {
    if (%~plparse.cchan != $null) { %chan = $ifmatch }
    elseif ($1 == $null) { %chan = $chan }
  }
  if ($1 != $null) && ($_not($_ismaster($1,%chan,mno))) { return 999 -ban }
  if ($2 == $null) || (($_not($_ischan(%chan))) && ($1 != $null)) { return 532 }
  __cmd.bans.loadbans %chan
  %dl = $__cmd.bans.getban($2)
  if (%dl == $null) {
    close -@ @__loadbans
    return 535 %chan $2
  }
  %line = $line(@__loadbans,%dl)
  %hostmask = $gettok(%line,2,32)
  %lc = $gettok(%line,1,32)
  %index = %lc %hostmask
  close -@ @__loadbans
  if ($gettok(%line,5-,32) != $null) {
    if (%lc == global) && ($1 != $null) && ($_not($_ismaster($1,0,mno))) {  }
    else {
      write -ds" $+ %index $+ " " $+ $_baninifile $+ "
      if ($hfind(_aircinternalbanlist,%index,1).data) { hdel _aircinternalbanlist $ifmatch }
    }
  }
  __cmd.-ban %hostmask $iif(%lc != global,%lc)
  if (%lc == global) {
    .timer -o 1 0 _cmdlog $iif($1,$1,$me) -ban %hostmask
    return 217 %hostmask
  }
  .timer -o 1 0 _cmdlog $iif($1,$1,$me) ( $+ %lc $+ ) -ban %hostmask $iif($_ischanban(%hostmask,%lc),(on channel))
  return 216 %hostmask %lc
}
; /__cmd.-ban <hostmask> [channel]
alias __cmd.-ban {
  var %hostmask = $1,%chan = $2,%i = $chan(0),%banumber,%banner
  if (%chan != $null) {
    var %banumber = $_ischanban(%hostmask,%chan),%banner = $gettok($ibl(%chan,%banumber).by,1,33)
    if ($me isop %chan) && (%banumber) && ((%banner == $me) || (%banner == $null)) { ban -r %chan %hostmask }
    .timer_-ban $+ %chan $+ , $+ %hostmask off
  }
  else {
    .timer_-ban $+ global $+ , $+ %hostmask off
    while (%i) {
      var %chan = $chan(%i),%banumber = $_ischanban(%hostmask,%chan),%banner = $gettok($ibl(%chan,%banumber).by,1,33)
      if ($me isop %chan) && (%banumber) && ((%banner == $me) || (%banner == $null)) { ban -r %chan %hostmask }
      dec %i
    }
  }
}

;_
; -exempt +o|o
; -exempt <hostmask OR number>

;_
; -invite +o|o
; -invite <hostmask OR number>

; -chan +n
; -chan <channel>

alias -chan { _useredit.echocode -chan $1- }
alias _cmd.-chan {
  if ($1 != $null) && ($_not($_ismaster($1,0,n))) { return 999 -chan }
  if ($_not($_ischan($2))) { return 526 }
  if ($readini -n " $+ $_chaninifile $+ " $2 chan == $null) { return 527 }
  _removechannel $2
  if ($_connected) && ($me ison $2) { part $2 }
  .timer -o 1 0 _cmdlog $iif($1,$1,$me) -chan $2
  return 226 $2
}

; -chrec +m|m
; -chrec <handle> <channel>
alias -chrec { _useredit.echocode -chrec $1- }
alias _cmd.-chrec {
  if ($2 != $null) && ($3 == $null) { tokenize 32 $1 $2 $_ruini($2,console-chan) }
  if ($1 != $null) && ($_not($_ismaster($1,$3,mn))) { return 999 -chrec }
  if ($2 == $null) || ($_not($_ischan($3))) { return 513 }
  if ($_validateuser(4,$2,$null)) { return $ifmatch $2 }
  if ($_partyline.chlevels($1,$2,$3)) { return 998 }
  if ($istok($_ruini($2,channels),$3,32) == $false) { return 514 $2 $3 }
  _removechrec $2 $3
  _cmdlog $iif($1,$1,$me) -chrec $2 $3
  return 211 $2 $3
}

; bans +o|o
; bans [[channel] wildcard]
; bans all

alias bans { _useredit.echocode bans $1- }
alias _cmd.bans {
  var %handle = $iif($1,$1,$me),%chan,%wc,%incb = 1,%all = 0,%parms = $2-
  _ban.chexpire *
  if ($2 == all) {
    %all = 1
    %wc = *
  }
  else {
    if ($_ischan($2)) {
      %chan = $2
      tokenize 32 $1 $3-
    }
    %wc = $2
  }
  if (%chan == $null) {
    if (%~plparse.cchan != $null) { %chan = $ifmatch }
    elseif ($1 == $null) { %chan = $chan }
  }
  if ($1 != $null) && ($_not($_ismaster($1,%chan,mno))) { return 999 bans }
  if (%chan == $null) { return 528 }
  if (%wc == $null) {
    %wc = *
    %incb = 0
  }
  __cmd.bans.loadbans %chan
  close -@ @__bans
  window -h @__bans
  if (%all) { aline @__bans Global bans:   (! = not active on %chan $+ ) }
  else { aline @__bans Global bans: }
  var %i = 1,%n = $line(@__loadbans,0),%l,%z
  while (%i <= %n) {
    %l = $line(@__loadbans,%i)
    if ($gettok(%l,1,32) != global) && ($_not(%z)) {
      %z = 1
      if (%all) { aline @__bans Channel bans for  %chan $+ :  (! = not active, * = not placed by bot) }
      else { aline @__bans Channel bans for  %chan $+ :  (* = not placed by bot) }
    }
    if (%wc iswm $gettok(%l,2,32)) {
      if (%incb) || ($_ischanban($gettok(%l,2,32),%chan)) { __cmd.bans.showbans %i %chan %l }
    }
    inc %i
  }
  if ($_not(%all)) && ($_not(%incb)) { aline @__bans Use '.bans all' to see the total list. }
  _cmdlog $iif($1,$1,$me) bans %parms
  return 222 @__bans @__bans,@__loadbans
}
alias __cmd.bans.showbans {
  if ($7- == $null) {
    var %dur = $abs($calc($ctime - $6)),%1 = 00,%2 = 00
    %1 = $int($calc(%dur / 60))
    %2 = $calc(%dur - ($int($calc(%dur / 60)) * 60))
    if (%1 < 10) { %1 = 0 $+ %1 }
    if (%2 < 10) { %2 = 0 $+ %2 }
    aline @__bans * [ $+ $_filleft(3, ,$1) $+ ] $4 ( $+ $5 $+ !*@* $+ ) (active %1 $+ : $+ %2 $+ )
  }
  else {
    if ($_ischanban($4,$2)) { var %pref =    }
    else { var %pref = !  }
    var %exp = (perm)
    if ($7) { %exp = (expires at $asctime($calc($6 + $7),HH:nn) $+ ) }
    var %creatn = $abs($calc($ctime - $6)),%creat
    if (%creatn > 86400) {
      %creatn = $round($calc(%creatn / 86400),0)
      %creat = Created $_nsingoplur(%creatn,day,days) ago
    }
    else { %creat = Created $asctime($6,HH:nn) }
    aline @__bans %pref $+ [ $+ $_filleft(3, ,$1) $+ ] $4 %exp $iif($9,(sticky))
    aline @__bans         $5 $+ : $10-
    aline @__bans         %creat
  }
}
alias __cmd.bans.loadbans {
  var %file,%i = 1,%n,%l,%t,%index,%s,%banmask,%banner,%date,%ultrabreak,%win = @__loadbans
  _openwins %win
  %file = $_baninifile
  if ($isfile(%file)) {
    filter -fw $"(%file) %win global *
    filter -fw $"(%file) %win $1 *
  }
  %n = $ibl($1,0)
  while (%i <= %n) {
    %ultrabreak = 0
    %banmask = $ibl($1,%i)
    %banner = $ibl($1,%i).by
    %date = $ibl($1,%i).ctime
    %index = & %banmask
    %t = 1
    while ($line(%win,$fline(%win,%index,%t)) != $null) {
      if ($gettok($ifmatch,2,32) == %banmask) {
        %ultrabreak = 1
        break
      }
      inc %t
    }
    if ($_not(%ultrabreak)) { aline %win $1 %banmask %banner %date }
    inc %i
  }
}
alias __cmd.bans.getban {
  if ($_isint($1)) {
    if ($1 <= $line(@__loadbans,0)) { return $1 }
  }
  else {
    var %i = 1,%index = & $1 *,%l
    while ($line(@__loadbans,$fline(@__loadbans,%index,%i)) != $null) {
      if ($gettok($ifmatch,2,32) == $1) { return $fline(@__loadbans,%index,%i) }
      inc %i
    }
  }
}

;_
; invites +o|o
; invites [[channel] wildcard]
; invites all

;_
; exempts +o|o
; exempts [[channel] wildcard]
; exempts all

; chanload +n|n
; chanload
alias chanload { _useredit.echocode chanload $1- }
alias _cmd.chanload {
  if ($1 != $null) && ($_not($_ismaster($1,1,n))) { return 999 chanload }
  .timer -o 1 0 _cmdlog $iif($1,$1,$me) chanload
  return 218
}

; chanset +n|n
; chanset [channel] <settings>
alias chanset { _useredit.echocode chanset $1- }
alias _cmd.chanset {
  tokenize 32 $1 $strip($2-)
  var %limit,%pass,%i = 1,%l,%s,%f,%+,%-,%t
  if ($_not($_ischan($2))) || (($left($2,1) isin -+) && ($istok($_partyline.chansetflags,$right($2,-1),32))) {
    if ($1 == $null) { tokenize 32 $1 $iif($chan,$chan,$null) $2- }
    else { tokenize 32 $1 $iif(%~plparse.cchan,%~plparse.cchan,$null) $2- }
  }
  if ($_not($_ischan($2))) || ($3- == $null) { return 536 }
  if ($istok(chanmode idle-kick,$3,32)) || (($left($3,1) isin -+) && ($istok($_partyline.chansetflags,$right($3,-1),32))) {
    if ($1 != $null) && ($_not($_ismaster($1,$2,mn))) { return 999 chanset }
  }
  elseif ($istok(need-op need-invite need-key need-unban need-limit,$3,32)) {
    if ($1 != $null) {
      if ($_not($_ismaster($1,0,n))) { return 999 chanset }
      if ($istok($_getsetup(script,owner),$1,32) == $false) { return 588 }
    }
  }
  else { return 537 $2 $3 }
  if ($3 == chanmode) {
    if ($4 != $null) {
      %limit = 0
      %l = $len($4)
      %s = +
      while (%i <= $len($4)) {
        if ($mid($4,%i,1) isin -+) {
          if ($ifmatch != %s) {
            %f = %f $+ $ifmatch
            %s = $ifmatch
          }
        }
        elseif ($mid($4,%i,1) isincs lkipsmtnaq) {
          if (%f == $null) { %f = + }
          %+ = + $+ $mid($4,%i,1)
          %- = - $+ $mid($4,%i,1)
          %f = $removecs(%f,%+,%-,$mid($4,%i,1))
          if (%f == $null) { %f = + }
          %f = %f $+ $mid($4,%i,1)
          if ($mid($4,%i,1) isincs kl) {
            if (%s == +) {
              inc %t
              if ($mid($4,%i,1) === k) { %pass = $gettok($5-,%t,32) }
              else { %limit = $gettok($5-,%t,32) }
            }
            elseif ($mid($4,%i,1) === k) { var %pass }
            else { var %limit }
          }
        }
        inc %i
      }
      %f = $_fixmodes(%f)
      if (+l isincs %f) {
        %f = $removecs(%f,+l)
        if (%f == $null) { %f = + }
        %f = %f $+ +l
      }
      else { var %limit }
      if (+k isincs %f) {
        %f = $removecs(%f,+k)
        if (%f == $null) { %f = + }
        %f = %f $+ +k
      }
      %f = $_unfixmodes(%f)
      if (%pass == $null) { var %pass }
      if (%limit != $null) && ((%limit !isnum) || (%limit <= 0)) { %limit = 0 }
    }
    _wchini $2 $3 %f %limit %pass
    .timer -o 1 0 _cmdlog $iif($1,$1,$me) chanset $2 $3 $ $+ chr(123) %f %limit %pass $ $+ chr(125)
    return 219 $2 $3 %f %limit %pass
  }
  elseif ($3 == idle-kick) {
    %t = $iif($4 isnum && $4 > 0,$round($4,0),0)
    _wchini $2 $3 %t
    .timer -o 1 0 _cmdlog $iif($1,$1,$me) chanset $2 $3 $ $+ chr(123) %t $ $+ chr(125)
    return 219 $2 $3 %t
  }
  elseif ($istok(need-op need-invite need-key need-unban need-limit,$3,32)) {
    _wchini $2 $3 $4-
    .timer -o 1 0 _cmdlog $iif($1,$1,$me) chanset $2 $3 $ $+ chr(123) $4- $ $+ chr(125)
    return 219 $2 $3 $4-
  }
  else {
    %s = $iif($left($3,1) == +,1,0)
    %f = $right($3,-1)
    _wchini $2 %f %s
    .timer -o 1 0 _cmdlog $iif($1,$1,$me) chanset $2 $3
    _chansetup2chanprot
    return 220 $2 $3
  }
}

; chansave +n|n
; chansave
alias chansave { _useredit.echocode chansave $1- }
alias _cmd.chansave {
  if ($1 != $null) && ($_not($_ismaster($1,1,n))) { return 999 chansave }
  .timer -mo 1 0 _cmdlog $iif($1,$1,$me) chansave
  .timer -mo 1 100 _putlog Writing channel file ...
  return 221
}

; chinfo +m|m
; chinfo <user> [channel] [info-line]
alias chinfo { _useredit.echocode chinfo $1- }
alias _cmd.chinfo {
  var %result = $__cmd.chinfo($1-)
  if ($left(%result,1) >= 4) { return %result }
  _cmdlog $iif($1,$1,$me) chinfo $2-
  return %result
}
alias __cmd.chinfo {
  tokenize 32 $strip($1-)
  var %chan,%line,%lock = 0,%line2
  if ($_ischan($3)) {
    %chan = $3
    %line = $4-
  }
  else { %line = $3- }
  if (%line  == none) { var %line }
  if ($1 != $null) && ($_not($_ismaster($1,%chan,mn))) { return 999 chinfo }
  if ($_not($_getsetup(script,use-info))) { return 589 }
  if ($2 == $null) { return 538 }
  if ($_validateuser(4,$2,$null)) { return $ifmatch $2 }
  if ($_partyline.chlevels($1,$2,%chan)) { return 998 }
  _setuserfield $2 infoline. $+ $iif(%chan,%chan,default) %line
  if (@* iswm %line) {
    %lock = 1
    %line2 = $_inputcom(@,%line)
  }
  else { %line2 = %line }
  if (%line == $null) {
    if (%chan) { return 227 $2 %chan }
    return 228 $2
  }
  if (%chan) { return 229 $2 %chan %lock %line2 }
  return 230 $2 %lock %line2
}

; info
; info [channel] [info-line]
alias _cmd.info {
  var %result = $__cmd.info($1,$2-),%handle = $iif($1,$1,$me),%t = $gettok(%result,1,32),%chan = $gettok(%result,2,32)
  if ($_not($_ischan(%chan))) { var %chan }
  if (%t == 231) || (%t == 539) { _cmdlog %handle info %chan }
  elseif (%t == 267) { _cmdlog %handle info %chan none }
  elseif (%t == 232) { _cmdlog %handle info %chan ... }
  return %result
}
alias __cmd.info {
  tokenize 32 $1-
  if ($_not($_getsetup(script,use-info))) { return 589 }
  var %chan,%line,%lock,%line2,%r,%o,%olock = 0
  if ($_ischan($2)) {
    %chan = $2
    %line = $3-
  }
  else { %line = $2- }
  %r = infoline. $+ $iif(%chan,%chan,default)
  %o = $_getuserfield($1,%r)
  if (@* iswm %o) { var %o = $_inputcom(@,%o),%olock = 1 }
  if (@* iswm %line) { %line = $_inputcom(@,%line) }
  if (%line == $null) {
    if (%o == $null) { return 539 }
    return 231 $iif(%chan,%chan,$null) %o
  }
  if (%olock) && ($_not($_ismaster($1,%chan,mn))) { return 540 }
  if (%line == none) {
    _setuserfield $1 %r
    return 267 %chan
  }
  _setuserfield $1 %r %line
  return 232 $iif(%chan,%chan,$null) %line
}

; stick +o|o
; stick [ban/exempt/invite] <hostmask OR number> [channel]
; (aIRC modified command)

alias stick { _useredit.echocode stick $1- }
alias _cmd.stick {
  var %chan,%dl,%line,%hostmask,%lc
  if ($_ischan($3)) { %chan = $3 }
  elseif ($1 != $null) {
    if (%~plparse.cchan != $null) { %chan = $ifmatch }
  }
  else { %chan = $chan }
  if ($1 != $null) && ($_not($_ismaster($1,%chan,mno))) { return 999 stick }
  if ($2 == $null) || ($_not($_ischan(%chan))) { return 542 }
  __cmd.bans.loadbans %chan
  %dl = $__cmd.bans.getban($2)
  if (%dl == $null) {
    close -@ @__loadbans
    return 535 %chan $2
  }
  %line = $line(@__loadbans,%dl)
  %hostmask = $gettok(%line,2,32)
  close -@ @__loadbans
  if ($gettok(%line,5-,32) != $null) { write -l $+ %dl " $+ $_baninifile $+ " $puttok(%line,1,7,32) }
  _cmdlog $iif($1,$1,$me) stick %hostmask
  return 233 %hostmask
}

; unstick +o|o
; unstick [ban/exempt/invite] <hostmask OR number> [channel]
; (aIRC modified command)

alias unstick { _useredit.echocode unstick $1- }
alias _cmd.unstick {
  var %chan,%dl,%line,%hostmask,%lc
  if ($_ischan($3)) { %chan = $3 }
  elseif ($1 != $null) {
    if (%~plparse.cchan != $null) { %chan = $ifmatch }
  }
  else { %chan = $chan }
  if ($1 != $null) && ($_not($_ismaster($1,%chan,mno))) { return 999 unstick }
  if ($2 == $null) || ($_not($_ischan(%chan))) { return 543 }
  __cmd.bans.loadbans %chan
  %dl = $__cmd.bans.getban($2)
  if (%dl == $null) {
    close -@ @__loadbans
    return 535 %chan $2
  }
  %line = $line(@__loadbans,%dl)
  %hostmask = $gettok(%line,2,32)
  close -@ @__loadbans
  if ($gettok(%line,5-,32) != $null) { write -l $+ %dl " $+ $_baninifile $+ " $puttok(%line,0,7,32) }
  _cmdlog $iif($1,$1,$me) unstick %hostmask
  return 234 %hostmask
}