alias parsemode {
if ($status != connected) || (!$isid) return
var %i = 1, %char, %type, %token, %2 = $2, %3 = $3
hfree -w parsemode
tokenize 32 $1
while ($mid($1,%i,1) != $null) {
%char = $v1
if (%char isin +-) {
%type = %char
inc %i
continue
}
elseif (%char isincs $gettok($chanmodes,1-2,44) $+ $nickmode) {
inc %token
hadd -m parsemode $calc($hget(parsemode,0).item + 1) %type $+ %char $gettok($2-,%token,32)
}
elseif (%char isincs $gettok($chanmodes,3,44)) {
if (%type == +) {
inc %token
hadd -m parsemode $calc($hget(parsemode,0).item + 1) %type $+ %char $gettok($2-,%token,32)
}
else hadd -m parsemode $calc($hget(parsemode,0).item + 1) %type $+ %char
}
elseif (%char isincs $gettok($chanmodes,4,44)) hadd -m parsemode $calc($hget(parsemode,0).item + 1) %type $+ %char
inc %i
}
if ($prop == find) {
if (($hfind(parsemode,%2,%3,w).data) || ($hfind(parsemode,%2,%3,W).data)) var %found = $v1
if (%3 != 0) && ($hget(parsemode,%found)) !
elseif (%found) !
hfree -w parsemode
return $iif($v1,$v1,$iif(%3 == 0,0,$false))
}
elseif ($prop == findr) {
if (($hfind(parsemode,%2,%3,r).data) var %found = $v1
if (%3 != 0) && ($hget(parsemode,%found)) !
elseif (%found) !
hfree -w parsemode
return $iif($v1,$v1,$iif(%3 == 0,0,$false))
}
elseif (- isin %2) {
if (%2 < 0) {
inc %2
if ($hget(parsemode,$calc($hget(parsemode,0).item %2))) {
hfree -w parsemode
return $v1
}
}
elseif (*-* iswm %2) {
var %begin = $gettok(%2,1,45), %end = $iif($gettok(%2,2,45),$v1,$hget(parsemode,0).item), %mode, %modes, %ctype, %type
while (%begin <= %end) && ($hget(parsemode,%begin)) {
%mode = $v1
%ctype = %type
%type = $left($v1,1)
if (* * iswm %mode) %modes = $gettok(%modes,1,32) $+ $iif(%ctype == %type,$mid($gettok(%mode,1,32),2),$gettok(%mode,1,32)) $gettok(%modes,2-,32) $gettok(%mode,2,32)
else %modes = $gettok(%modes,1,32) $+ $iif(%ctype == %type,$mid(%mode,2),%mode) $gettok(%modes,2-,32)
inc %begin
}
hfree -w parsemode
return %modes
}
}
elseif ($hget(parsemode,%2) [ $+ [ $iif(%2 == 0,.item) ] ]) {
hfree -w parsemode
return $v1
}
}
on *:rawmode:#:{
var %i = 1
while ($parsemode($1-,%i)) {
.signal -n mode # $v1
inc %i
}
}
on *:signal:mode:{
if (?a iswm $2) .signal -n $iif(-* iswm $2,de) $+ admin $1 $3
}