Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/script/menu.bx
1069 views
# This code is based on GemZ by gemini however it is not his responsibily
#
# If there are any errors contact [NuKe]! !!!!NOT!!!! gemini!
#
# All credits are stated (if not...they are most likely gemini)

^fset FORMAT_XTERM_TITLE [$0][$2] $5-

^set COMMENT_BREAKAGE on
^set JOIN_NEW_WINDOW on
^set JOIN_NEW_WINDOW_TYPE create double on
^set QUERY_NEW_WINDOW on
^set QUERY_NEW_WINDOW_TYPE create
^set WINDOW_DESTROY_PART on
^set SERVER_GROUPS on

@ actionsfile = [$IRCLIB()/script/actplug.gmz]
@ loadacts = [NO]
@ ctcpsound = [OFF]
@ ctcpsndreq = [OFF]
@ EXEDIR = [~]
@ sounddir = [$EXEDIR/sounds]
@ SOUND_PATH = [$EXEDIR/sounds ~ ~/sounds]
@ gz.sounds        = 1

# Echo Strings
^assign gemz.act *
^assign gemz.str .gz.
^assign gemz.usage ***
^eval ^assign gemzov.str \\[\$bgrn\ov${cl}\\]\
alias gecho xecho -b -level crap $*
alias gbecho xecho -b -level crap $*
alias gbecho xecho -b -level crap $*
alias gtecho xecho -b -target $0 $1-
alias gtbecho xecho -b -target $0 $1-
alias gtbecho xecho -b $1-
alias gaecho xecho -b -level crap $*
alias gnecho xecho -b -level crap $*
alias guecho xecho -b -level crap gemz.usage $*

@ NUMKICK = [7]
@ kick.0 = [uh, huh huh... uh... yew suck, or something]
@ kick.1 = [meep meep!]
@ kick.2 = [bork bork bork bork]
@ kick.3 = [oops, silly me, that's the wrong key]
@ kick.4 = [nostalgia kick: Roadkill splattered all over the infobahn]
@ kick.5 = [nostalgia kick: CDA VIOLATION]
@ kick.6 = [If anybody gets funk'd its gun' be U!]

#----------------------------Kicks-----------------------------#
alias bkk {/k $0 BurgerKingKick - You get it my way}
alias mck {/k $0 McKick: You Want Fries with that?}
alias mcdk {/k $0 McKick: Have you had your break today?!?}
alias tbk {/k $0 TacoBellKick: Make a run for the border}
alias cjk {/k $0 CarlsJrKick: If it don't get all over your face, you don't belong in this place}
alias jbk {/k $0 JackInTheBoxKick: Jacks Back!!}
alias kfck {/k $0 KentuckyFriedKick: Original Recipe or Extra Crispy?}
alias kt {/k $0 Kick Toy (tm)}
alias tkl {/k $0 TaeKwonLeapKick}
alias gk {/k $0 [GreetKick] Hello to you too!}
alias wk {/k $0 woikick}

alias save {
  if (fexist(~/menu.sav) != -1) {
        @ unlink(~/menu.sav)
  }
  @ outfile = open(~/menu.sav W)
# gecho Saving menu.bx settings...
  @ write($outfile //^assign ctcpsound $ctcpsound)
  @ write($outfile //^assign loadacts $loadacts)
  @ write($outfile //^assign ctcpsndreq $ctcpsndreq)
  @ write($outfile //^assign SOUND_PATH $SOUND_PATH)
  @ write($outfile //^assign sounddir $sounddir)
  @ write($outfile //^assign actionsfile $actionsfile)
  @ close($outfile)
  //save
}

#
# This code courtesy of mikh
#

alias searchpath {
     fe ($1-) bleah {
          if (file.exist($bleah/$0)) { return $bleah/$0 }
          }
    return 0
}

### returns 1 if we have file $* for playing, path is stripped from parameter
### so you can safely pass full qualified filenames here, if file exist,
### ctcpsnd.fname variable will contain full path to the file, which can
### be passed to mmpm.playfile or mmpm.playfile2

alias ctcpsnd.havefile {
        @ctcpsnd.fname = searchpath($file.sanspath($*) $SOUND_PATH)
        @function_return = file.exist($ctcpsnd.fname)
}

### should be called if you requested a file from someone, and expect dcc
### send to happen
### $0 == file name
alias ctcpsnd.requested {
        @ctcpsnd[$file.sanspath($*)] = time()
}

### this function returns if we already have this file requested from someone
### it returns time since we requested file, or 10000 if we did not requested
### such file, so if (ctcpsnd.isrequested(file.wav) > 30) will check if
### file was requested longer then 30 seconds ago, or not requested at all

alias ctcpsnd.isrequested {
        @ function_return = 10000
        if (ctcpsnd[$file.sanspath($*)] != []) @function_return = time() - ctcpsnd[$%file.sanspath($*)]
}

### returns 1 if we getting this file right now...
alias ctcpsnd.isgetting {
        @ function_return = ctcpsnd.getting[$file.sanspath($*)] > 0
}

### usage is simple, in your own on ^dcc_request, do something like
### ^on dcc_request * if (!ctcpsnd.dcc_request($*)) {
###        your code here
### }

alias ctcpsnd.dcc_request {
        @ function_return = 0
        if (ctcpsnd[$file.sanspath($2)] > 0) {
                @function_return = 1
                if (file.isdir($EXEDIR/SOUNDS)) {
                        @mkdir($EXEDIR/SOUNDS/RECV)
                        //^dcc rename $4 $EXEDIR/SOUNDS/RECV/$file.sanspath($2)
                        @ctcpsnd.getting[$file.sanspath($2)] = time()
                        ^on ^dcc_connect "$4 $0 GET % %" #
                        //^dcc get $4
                        ^on ^dcc_connect -"$4 $0 SEND % %"
                        if (dccitem($4) == []) {
                                //^assign -ctcpsnd.getting[$file.sanspath($2)]
                                //^assign -ctcpsnd[$file.sanspath($2)]
                        }{
                                //on ^dcc_lost "$4 $0 GET $word(8 $dccitem($4)) %*" {
                                        @ctcpsnd.dcc_lost($*)
                                }
                        }
                }{
                        //^assign -ctcpsnd.getting[$file.sanspath($2)]
                        //^assign -ctcpsnd[$file.sanspath($2)]
                        //^dcc close $4
                }
        }
}

### same here

alias ctcpsnd.dcc_lost {
        @function_return = 0
        if (ctcpsnd[$%file.sanspath($3)] > 0) {
                @function_return = 1
                switch ($4) {
                        (ERROR)(LOST)(CLOSED) {
                                @unlink($3)
                                //^assign -ctcpsnd.getting[$file.sanspath($3)]
                                //^assign -ctcpsnd[$file.sanspath($3)]
                                //hook ctcpsnd error $file.sanspath($3) closed
                        }
                        (COMPLETED) {
                                //^assign -ctcpsnd.getting[$file.sanspath($3)]
                                //^assign -ctcpsnd[$file.sanspath($3)]
                                if (fsize($3) && fsize($3) == word(7 $dccitem($0))) {
                                        @rename($3 $exedir/sounds/$file.sanspath($3))
                                        //^hook ctcpsnd received $exedir/sounds/$file.sanspath($3)
                                }{
                                        if (fsize($3)) {
                                                 @unlink($3)
                                                 //hook ctcpsnd error file.sanspath($3) file size mistmatch
                                        }{
                                                @unlink($3)
                                                 //hook ctcpsnd error file.sanspath($3) zero length file
                                        }
                                }
                        }
                }
                //on ^dcc_lost -"$0 $1 $2 $3 %*"
        }
}

### this function is called from main script /sound routine to find if
### we have a local file. If we do, it is assumed that we gonna send it,
### so its added to a circlular buffer of last 10 filenames sent via /sound
### if function returns 1, then ctcpsnd.fname will be a full filename, ready
### to be passed to mmpm.playfile

if (ctcpsnd.cansendidx == []) @ctcpsnd.cansendidx=0

alias ctcpsnd.localfile {
        @ function_return = 1
# cannot send files which we are currently downloading yet
        if (ctcpsnd.isgetting($*)) { @function_return = 0
        } else if (file.exist($*)) {
                @ ctcpsnd.fname = [$*]
                @ ctcpsnd.cansend[$ctcpsnd.cansendidx] = [$*]
                @ ctcpsnd.cansendidx = (ctcpsnd.cansendidx+1) % 10
        } else if (file.exist(${ctcpsnd.fname = searchpath($* $SOUND_PATH)})) {
                @ ctcpsnd.cansend[$ctcpsnd.cansendidx] = [$*]
                @ ctcpsnd.cansendidx = (ctcpsnd.cansendidx+1) % 10
        } else @function_return = 0

}

### $0 is what they requested, function returns 0 or 1, if it returns 1, then
### ctcpsnd.fname will be a file name for /dcc send

alias ctcpsnd.cansend {
        @function_return = 0
        if (rmatch($* %.wav %.au %.mid)) {
                @ctcpsnd.tmp = file.sanspath($*)
                foreach ctcpsnd.cansend ctcpsnd.ii {
                        if (ctcpsnd.tmp == file.sanspath($ctcpsnd.cansend[$ctcpsnd.ii])) {
                                if (file.exist($ctcpsnd.cansend[$ctcpsnd.ii])) {
                                        @ ctcpsnd.fname = ctcpsnd.cansend[$ctcpsnd.ii]
                                        @ function_return = 1
                                        //break
                                } else if (file.exist(${ctcpsnd.fname = searchpath($file.sanspath($ctcpsnd.cansend[$ctcpsnd.ii]) $SOUND_PATH)})) {
                                        @ function_return = 1
                                        //break
                                }
                        }
                }
        }
}

### next 3 ones should be called from ON ^PUBLIC, ON ^MSG and ^ON NOTICE
### Note that we only allow to request these sounds we just recently played
### using /sound, last 10 actually

alias ctcpsnd.msg {
        @function_return = 0
        if ([$1] == [!$N] && [$2] != [] && [$3] == []) {
                @ function_return = 1
                if (ctcpsnd.cansend($2)) {
                        //^hook ctcpsnd request 1 $0 $ctcpsnd.fname
                        ctcpsnd.sendfile_with_timeout $0 $ctcpsnd.fname
                }{
                        //^hook ctcpsnd request 0 $0 $2
                }
        }
}

alias ctcpsnd.notice {
        @function_return = 0
        if (index(# $0) == -1 && ([$1] == [!dccsend] || [$1] == [!$N]) && [$2] != [] && [$3] == []) {
                @ function_return = 1
                if (ctcpsnd.cansend($2)) {
                        //^hook ctcpsnd request 1 $0 $ctcpsnd.fname
                        ctcpsnd.sendfile_with_timeout $0 $ctcpsnd.fname
                }{
                        //^hook ctcpsnd request 0 $0 $2
                }
        }
}

alias ctcpsnd.public {
        if ([$2] == [!$N] && ctcpsnd.cansend($3)) {
                //^hook ctcpsnd request 1 $0 $ctcpsnd.fname
                ctcpsnd.sendfile_with_timeout $0 $ctcpsnd.fname
        }
}


alias ctcpsnd.close_unactive {
        if (dccitem($0) != [] && word(2 $dccitem($0)) != [active]) {
                //^dcc close $0
                //^on ^dcc_connect -"$0 $1 SEND % %"
        }
}

### $0 == nick, $1 == file
alias ctcpsnd.sendfile_with_timeout {
        @ dnum = 0
        on ^dcc_sent "$0 SEND % % #%" {@dnum = [$4]}
        //^dcc send $0 $1-
        on ^dcc_sent -"$0 SEND % % #%"
        on ^dcc_connect "$dnum $0 SEND % %" {
                //on ^dcc_connect -"$0 $1 SEND % %"
                //on ^dcc_lost "$0 $1 SEND $word(8 $dccitem($0)) %*" {
                        //on ^dcc_lost -"$0 $1 $2 $3 %*"
                }
        }
        if (dnum) /timer 180 ctcpsnd.close_unactive $dnum $0
}

alias file.exist {
        @ function_return = fexist($*) == 1
}

alias file.isdir {
        @ function_return = fexist($* d) == 1
}

alias file.sanspath {
        if (file.spi=rindex(\\/: $*)+1) {
                @function_return=mid($file.spi 255 $*)
                } else {
                @function_return=[$*]
                }
}

alias file.ext {
        @file.sp=file.sanspath($*)
        if (file.exi=rindex(. $file.sp)+1) {
                @function_return=[mid($file.exi 255 $file.sp)]
                } else {
                @ function_return = []
                }
}

alias file.sansext {
        @file.sp=file.sanspath($*)
        if (file.sei=rindex(. $file.sp)+1) {
                @function_return=left(${[$@*] - ((@file.sp - file.sei) + 1)} $*)
                } else {
                @function_return=[$*]
                }
}

alias file.path {
        if (file.spi=rindex(\\/: $*)+1) {
                @function_return=[mid(0 $file.spi $*)]
                } else {
                @function_return=[]
                }
}

alias file.tofat {
        @file.path=file.path($*)
        @file.name=file.sansext($file.sanspath($*))
        @file.ext=file.ext($*)
# if extention is >3 chars long truncate it
        if (@file.ext > 3) @file.ext=left(3 $file.ext)
        if (@file.name > 8) {
                @file.tohash=right(${@file.name-5} $file.name)
                echo +++ tohash = $file.tohash
                @file.name=left(5 $file.name)
                @file.tmp=0
                fec ($file.tohash) file.c {
                        @file.tmp = file.tmp + ascii($toupper($file.c))
                }
                echo +++ result = $file.tmp
                @file.tmp = file.tmp % 256
                @file.name #= file.tmp
        }
        if (file.path) @function_return=[$file.path/$file.name\.$file.ext] else @function_return=[$file.name\.$file.ext]
}

alias mmpm.debug {
    if (mmpm.debug) {xecho +++ [mmpm] $*}
}

if (!mmpm.loaded) {
        @ mmpm.loading = 1
        @ mmpm.multimedia = mciapi()
        if (!mmpm.multimedia) { /mmpm.debug
        } else { /mmpm.debug }
        @ mmpm.loaded = 1
        @ mmpm.volume = mmpm.midi.volume = mmpm.wave.volume = 100
}
### outside of 1st if in case we loading it over an older mmpm.api version...
if (mmpm.wave.state == [] && mmpm.midi.state == []) {
        @ mmpm.wave.state = [CLOSED]
        @ mmpm.midi.state = [CLOSED]
}

### always interrups previous sound

#alias mmpm.playfile {
#        @mmpm.donotstop = 0
#        mmpm.playfile_internal $*
#}

#alias mmpm.playfile2 {
#        @mmpm.donotstop = [$0]
#        mmpm.playfile_internal $1-
#}

#I am not sure why the raw version of mmpm.playfile does not work...
#until I figure it out...

alias mmpm.playfile {
eval $mciapi(playfile $0)
}

alias mmpm.playfile2 {
eval $mciapi(playfile $0)
}


alias mmpm.sendplaycmd {
        @ mmpm[$device][nextfile] = [$*]
        switch ($mmpm[$device][state]) {
                (CLOSED) {
                                if (device == [wave]) { @ device.name = [waveaudio]
                                } else if (device == [midi]) { @ device.name = [sequencer]
                                } else { @ device.name = 0 }
                                mmpm.raw open $device.name alias $device$pid() shareable
                                if (!mmpm.err) @mmpm[$device][state] = [OPEN_WAIT]
                }
                (PLAYING) {
                        ### let the stop notification kick in next file
                                mmpm.raw stop $device$pid()
                                if (mmpm.err) {mmpm.close}
                }
        }
}

### should return a device name 'wave' or 'midi' for a filename passed
### as a parameter
alias mmpm.get_device_for_file {
        @ function_return = 0
        switch ($*) {
                (*.wav)(*.au)("*.wav")("*.au") {
                        @ function_return = [wave]
                }
                (*.mid)(*.midi)("*.mid")("*.midi") {
                        @ function_return = [midi]
                }
                (*) {
                        ### todo: default, may open file and look for a header
                }
        }
}

alias mmpm.playfile_internal {
        if (mmpm.multimedia && file.exist($*)) {
                @ device = mmpm.get_device_for_file($*)
                if (device) {
                        if (!mmpm.donotstop || mmpm[$device][state] != [PLAYING])
                        {
                                mmpm.sendplaycmd $*
                        }
                }{
                        mmpm.debug +++ Unknown file extention `$*'
                }
        }
}

#       Numeric code for commands we use:
#

@mmpm.commands[OPEN]    = 1
@mmpm.commands[CLOSE]   = 2
@mmpm.commands[LOAD]    = 22
@mmpm.commands[PLAY]    = 4
@mmpm.commands[STOP]    = 6

#
#       These are notification codes, anything else is an error code and
#       error description can be found using mciapi(errorstr code) function
#
#      #define MCI_NOTIFY_SUCCESSFUL               0x0000
#      #define MCI_NOTIFY_SUPERSEDED               0x0001
#      #define MCI_NOTIFY_ABORTED                  0x0002
#      #define MCI_NOTIFY_ERROR                    0x0003

### global variable device == wave or midi

alias mmpm.close {
        if (mmpm[$device][state] != [CLOSED] && mmpm[$device][state] != [CLOSE_WAIT]) {
                mmpm.raw close $device$pid()
                if (!mmpm.err) { @ mmpm[$device][state] = [CLOSE_WAIT]
                } else { @ mmpm[$device][state] = [CLOSED] }
        }
}

### #define MCIERR_BASE                      5000

alias mmpm.raw {
        mmpm.debug Raw $*
        @mmpm.result = mciapi(raw ${device==[wave]?11:12} $* notify)
        @mmpm.err = mmpm.result > 5000
}

alias mmpm.kickload {
        if (mmpm[$device][nextfile] != []) {
                mmpm.raw load $device$pid() $mmpm[$device][nextfile] ${device==[wave]?[readonly]:[]}
                if (!mmpm.err) {
                        @mmpm[$device][state] = [LOAD_WAIT]
                        @mmpm[$device][nextfile] = []
                }{
                        mmpm.close
                }
        }{
                mmpm.close
        }
}


### we are receiving control of a device
on ^mci_notify "passdevice % 2" {
        if ([$1] == mmpm.wave) { @ device = [wave]
        } else if ([$1] == mmpm.midi) { @ device = [midi]
        } else { @ device = 0 }
        if (device) {
                if (mmpm[$device][state] == [OPENED]) {
                        mmpm.kickload
                }
        } else {
                mmpm.debug +++ Aqured device $1 (not opened by mmpm.api module)
        }
}

### we are loosing control of a device, so lets close it to avoid confusion
on ^mci_notify "passdevice % 1" {
        if ([$1] == mmpm.wave) { @ device = [wave]
        } else if ([$1] == mmpm.midi) { @ device = [midi]
        } else @ device = 0
        if (device) {
                mmpm.debug someone is taking device from us...
                mmpm.close
        }
}

### This is a main handler of notifications from mmpm/2, each command we
### issue (except set volume ones) have `nofify' flag, and is confirmed here.
### Much to my surprise I yet have to see mmpm/2 to lose notifications...

on ^mci_notify "NOTIFY % 1? % %" {
        mmpm.debug Notify $*
        if ([$2] == 11) { @ device = [wave]
        } else if ([$2] == 12) { @ device = [midi]
        } else @ device = 0
        if (device)
        {
                if ([$4] == mmpm.commands[OPEN]) {
        ### open notification
                        if ([$1] == 0) {
                                @ mmpm[$device] = [$3]
                                @ mmpm[$device][state] = [OPENED]
        ### it waits for passdevice now, which gonna start file loading
                        }{
                                mmpm.close
                        }
                } else if ([$4] == mmpm.commands[LOAD]) {
        ### load notification, lets play it now when it finished loading
                        if ([$1] == 0) {
                                if (mmpm[$device][volume] != 100) {
                                        if (device == [midi]) { @mciapi(raw set midi$pid() volume $mmpm[$device][volume])
                                        } else if (device == [wave]) { @mciapi(raw set wave$pid() audio volume all $mmpm[$device][volume]) }
                                }
                                mmpm.raw play $device$pid()
                                if (!mmpm.err) { @ mmpm[$device][state] = [PLAYING]
                                } else {
                                        mmpm.close
                                }
                        }{
                                mmpm.close
                        }
                } else if ([$4] == mmpm.commands[PLAY]) {
        ### play is finished, try to start next file in case we were stopped
                        mmpm.kickload
                } else if ([$4] == mmpm.commands[STOP]) {
        ### stop notification, not actually used anyhow
                        mmpm.debug Stop confirmed
                } else if ([$4] == mmpm.commands[CLOSE]) {
        ### close notification, lets mark device as closed...
                        if ([$1] == 0) {
                                @mmpm[$device][state] = [CLOSED]
                                @mmpm[$device] = 0
                        }
                }
        } else {
                mmpm.debug +++ Unknown device $3 notification received
        }
}

alias mmpm.midi.stop {
        @ device=[midi]
        mmpm.close
}

alias mmpm.wave.stop {
        @ device=[wave]
        mmpm.close
}

alias mmpm.stop {
        mmpm.wave.stop
        mmpm.midi.stop
}

alias mmpm.midi.volume {
        @ mmpm.midi.volume = [$0]
        if (mmpm.midi.state == [PLAYING]) @mciapi(raw set midi$pid() volume $0)
}


alias mmpm.wave.volume {
        @ mmpm.wave.volume = [$0]
        if (mmpm.wave.state == [PLAYING]) @mciapi(raw set wave$pid() audio volume all $0)
}

alias mmpm.volume {
        mmpm.wave.volume $0
        mmpm.midi.volume $0
}

### these are aliases for debugging, /mci <mci string commands> sends a raw
### command to mmpm/2 and displays result and an error string in case of error

/on ^mci_notify * {echo [mci] $*}

/alias mci {
        @ _rc = mciapi(raw $0-)
        if (_rc) {
                echo [mci] Error: $mciapi(errstring $_rc)
        }{
                if (mciapi(result) != []) {
                        echo [mci] Result: $mciapi(result)
                }
        }
}
#############
#GemZ Extras#
#############
@ gz.extras = 1

#########################################################################
### figlet v1.0 support by Kanji_Man.  Modified by Gemini
### Modified by OS2-Mike
#   fixed code by OS2-Mike (with a lot of help from mikh)
#   fixored the prob of 4OS2 echoing its logo info into the figlet pipe.
#   filget.exe is borked - it expects a ^Z EOF to terminate it -
#   added to $fig.text
#   Modified slightly by gemini to replace ^Z with $chr(26) :)
#########################################################################
@ def.figfont = [short]
@ fig.fontdir  = [$exedir/fonts]
@ figfont = [$fig.fontdir/bubble.flf]
alias figfix {
 if ([$0]) {
  @ figfix.count = 0
  ^assign -figfix.text
  while ([$@0-]>=[$figfix.count]) {
   @ figfix.char = [$mid($figfix.count 1 $0-)]
   if ([$strip(<>\;\(\)*/\\\{\}$$~`|'\" $figfix.char)]!=[$figfix.char]) {
    @ figfix.text = [$figfix.text\\]
   }
   if (figfix.char) {
    ^assign figfix.text $figfix.text$figfix.char
   } else {^assign figfix.text $figfix.text}
  @ figfix.count++
 }
 @ FUNCTION_RETURN = [$encode($figfix.text)]
 purge fixfix
 } else {gecho [Error] FIGFIX is an internal alias, avoid using!}
}

alias fig figlet $*
#alias figlist {^exec -name figlet ls $fig.fontdir/*.flf}
alias figlist {
 gecho Starting Font list
 fe ($findfiles(fn $fig.fontdir/*.flf)) _f.1 _f.2 _f.3 _f.4 {
  gecho $[15]_f.1 $[15]_f.2 $[15]_f.3 $[15]_f.4
 }
 gecho End of Font list
 purge _f
}

alias figlet {
 if ([$0]) {
  @ fig.text = encode($strip(| $1-)) ## encode($chr(26))
  ^on ^exec_error "figlet *" {gecho [ERROR] Cannot load figlet!}
  if ([$0]==[*]) {^exec -name figlet -out figlet -f $figfont;^msg %figlet $decode($fig.text)
  } else {^exec -name figlet -msg $0 figlet -f $figfont;^msg %figlet $decode($fig.text)}
  ^assign -fig.text
 } else {gecho Usage: /FIGLET <nick/channel> <text>}
}

alias figfont {
 if ([$0]) {
  @ figfont.file = [$0]
  if ([$fexist($fig.fontdir/$figfont.file\.flf)]==[1]) {
   gecho Figlet font changed from $fig.fontfile\ to $figfont.file\.
   @ figfont = [$fig.fontdir/$figfont.file\.flf]
   @ fig.fontfile = [$figfont.file]
   if ([$1]==[-d]) {@ def.figfont = [$figfont.file];gecho Default Figlet Font Changed}
   ^assign -figfont.file
  } else {gecho [Error] Figlet font not found: $figfont.file\}
 } else {
  gecho Current Figlet Font: $fig.fontfile\
  gecho Usage: /FIGFONT <fontfile>
 }
}

alias figdir {
 input "Please Enter The directory where you fonts are located: " if ([$0]) {
  if ([$fexist($0-)]==[1]) {
   @ fig.fontdir = [$0-]
   gecho Figlet Font Directory Changed to $fig.fontdir
  }
 } else {
  gecho Figlet Font Directory is $fig.fontdir
 }
 figfont $fig.fontfile
}

#added by request -- Ripped from Kanji :)
alias bleah {
 if ([$0]) {
  ^msg $0  \\|/ ____ \\|/             \\|/ ____ \\|/
  ^msg $0  ~@-/ oO \\-@~             ~@-/ Oo \\-@~
  ^msg $0  /_\( \\__/ \)_\\   Bleah!!   /_\( \\__/ \)_\\;
  ^msg $0     \\__U_/                   \\_U__/
  gecho BLEAH launched on $0.
 }{gecho Usage: /BLEAH <nick/channel>}
}
alias bork {
 if (C) {
  @ _o.s = lastserver()
  @ _o.t = _dfn($_o.s)
  evalserver $_o.s @ _o.n = N
  evalserver $_o.s @ _o.c = C
  evalserver $_o.s nick SwdshChef
  evalserver $_o.s WAIT
  evalserver $_o.s saysend $_o.c bork bork bork bork
  evalserver $_o.s nick $_o.n
  @ _rfn($_o.s $_o.t)
  purge _o
 }{gecho Yer not on a channel in this window.}
}

alias _dfn {
 @ function_return = fn[$servergroup($0)]
 @ fn[$servergroup($0)] = 0
}
alias _rfn {@ fn[$servergroup($0)] = [$1]}

alias fozzie {
 if (C) {
  @ _o.s = lastserver()
  @ _o.t = _dfn($_o.s)
  evalserver $_o.s @ _o.c = C
  evalserver $_o.s @ _o.n = N
  evalserver $_o.s nick _fozzie_
  evalserver $_o.s WAIT
  evalserver $_o.s saysend $_o.c wakka wakka wakka
  evalserver $_o.s nick $_o.n
  @ _rfn($_o.s $_o.t)
  purge _o
 }{gecho Your not in a channel in this window.}
}

alias beaker {@ o.n = [$N];nick _Beaker_;WAIT;say meep meep meep meep;nick $o.n;^assign -o.n}

alias gimpkick {
 @ _g.s = lastserver()
 @ _g.t = _dfn($_g.s)
 @ _g.n = N
 @ _g.c = C
 if (ischanop($_g.n $_g.c)) {
 evalserver $_g.s saysend $_g.c $0, I think The Gimp would love a piece of meat like you...
 evalserver $_g.s saysend $_g.c You're the kind of piece of shit trash he likes...
 evalserver $_g.s nick _The_Gimp_
 evalserver $_g.s WAIT
 evalserver $_g.s saysend $_g.c ARRRGGGGGGGGGHHHHHHHH!!!!!
 evalserver $_g.s saysend $_g.c I'm gonna drill you a new asshole!!!
 evalserver $_g.s WAIT
 evalserver $_g.s me Bends $0 over and "goes to town" on him!
 evalserver $_g.s saysend $_g.c AAHHHHHHHHHHHHHHHHHHHHHHHHHHH!!!!
 evalserver $_g.s saysend $_g.c Feels so fuckin good don't it boy!!!!?????
 evalserver $_g.s WAIT
 evalserver $_g.s me zip up $gender leather pants and leaves $0 crying and rubbing his ass!
 evalserver $_g.s //kick $_g.c $0 You're good...you should give references...
 evalserver $_g.s nick $_g.n
 @ _rfn($_g.s $_g.t)
}{gecho You're not a channel Operator}
 purge _g
}
#
alias soupkick {
 @ _s.s = lastserver()
 @ _s.t = _dfn($_s.s)
 @ _s.c = C
 if (ischanop($N $C)) {
  evalserver $_s.s @ _s.n = N
  evalserver $_s.s nick Soup_Nzi
  evalserver $_s.s Wait
  evalserver $_s.s saysend $_s.c VAT!??!??!!!!
  evalserver $_s.s //kick $_s.c $0 N() S()UP F()R Y()U
  evalserver $_s.s Wait
  evalserver $_s.s nick $_s.n
  @ _rfn($_s.s $_s.t)
 }
 purge _s
}

#ripped from Kanji_man
alias gerbilkick {
 if (ischanop($N $C)) {
 @ old_nick = N
 say $0, watch out for the giant gerbil...
 say I hear he likes MomoBoys like you...
 nick _Gerbil_
 WAIT
 me towers above the entire channel... looking for pleasure...
 me reaches down and grabs $0 by the shoulders with one claw...
 WAIT
 me bends over, parts both cheeks with the other claw...
 WAIT
 me begins to scream as a muffled shreek can be heard from $0
 /k $0 SCREEEEEEEEEEEEEECH!
 nick $old_nick
 ^assign -old_nick
}{gecho You're not a channel operator}
}
###Pimp Ideas Ripped from PimpToolz
alias pimpslap {
 if (ischanop($N $C)) {
 @ old_nick = N
 nick PimpGuido
 WAIT
 say WhaT HaPPenS wHeN YeR hO dOn'T WoRk??
 /k $0 !PiMPSlaP HeR!
 WAIT
 nick $old_nick
 WAIT
 ^assign -old_nick
}{gecho You're not a channel operator}
}
alias pimpkick {
 if (ischanop($N $C)) {
 @ old_nick = N
 nick PimpGuido
 WAIT
 say WHAT IS THE MEANING OF PIMP?
 say PiMP = PoWeR!
 say PiMP = PoWeR!
 say PiMP = PoWeR!
 WAIT
 /k $0 !PiMP-PoWeR! !PiMP-PoWeR!
 WAIT
 nick $old_nick
 WAIT
 ^assign -old_nick
}{gecho You're not a channel Operator}
}
alias stinkkick {
 if (ischanop($N $C)) {
  say ShiT SomEThinG FuXinG StINkS!!!
  /k $0 !ThaT'S BeTTeR!
 }{gecho You're not a channel Operator}
}
alias lamahkick {
 if (ischanop($N $C)) {
  say I'M A LaMaH HawK...
  say HuNtInG FoR A LaMaH...
  /k $0 !FuXinG LaMaH!
 }{gecho You're not a channel Operator}
}

#-------------------------------------------------------------------------#
#Swedish Chef Filter by gemini
alias chefsay {
 @ in_line = [$0-]
 fe ($in_line) _in_word {
  switch ($_in_word) {
   (bork) {@ _out_line = _out_line ## [$_in_word]}
   (*tion) {
    @ _len = [$@_in_word] - 4
    @ _out_line = [$_out_line ]##[$subchef($left($_len $_in_word))]##[shun]
   }
   (an) {@ _out_line = _out_line ## [un ]}
   (the) {@ _out_line = _out_line ## [zee ]}
   (*) {@ _out_line = _out_line##[$subchef($_in_word)]
   }
  }
 }
 say $_out_line
 ^assign -_out_line;^assign -_in_line;^assign -_in_word
}

alias chefme {
 @ in_line = [$0-]
 fe ($in_line) _in_word {
  switch ($_in_word) {
   (bork) {@ _out_line = _out_line ## [$_in_word]}
   (*tion) {
    @ _len = [$@_in_word] - 4
    @ _out_line = [$_out_line ]##[$subchef($left($_len $_in_word))]##[shun]
   }
   (an) {@ _out_line = _out_line ## [un]}
   (the) {@ _out_line = _out_line ## [zee]}
   (*) {@ _out_line = _out_line##[$subchef($_in_word)]
   }
  }
 }
 me $_out_line
 ^assign -_out_line;^assign -_in_line;^assign -_in_word
}

alias chefmsg {
 @ in_line = [$1-]
 fe ($in_line) _in_word {
  switch ($_in_word) {
   (bork) {@ _out_line = _out_line ## [$_in_word]}
   (*tion) {
    @ _len = [$@_in_word] - 4
    @ _out_line = [$_out_line ]##[$subchef($left($_len $_in_word))]##[shun]
   }
   (an) {@ _out_line = _out_line ## [un]}
   (the) {@ _out_line = _out_line ## [zee]}
   (*) {@ _out_line = _out_line ##[$subchef($_in_word)]
   }
  }
 }
 /msg $0 $_out_line
 ^assign -_out_line;^assign -_in_line;^assign _in_word
}

alias subchef {
 @ __bork = [$0]
 fec ($__bork) _bork {
  switch ($_bork) {
   (a) {@ bork_return = bork_return ## [e]}
   (e) {@ bork_return = bork_return ## [i]}
   (f) {@ bork_return = bork_return ## [ff]}
   (i) {@ bork_return = bork_return ## [ee]}
   (v) {@ bork_return = bork_return ## [f]}
   (o) {@ bork_return = bork_return ## [u]}
   (u) {@ bork_return = bork_return ## [oo]}
   (w) {@ bork_return = bork_return ## [v]}
   #(.) {@ bork_return = bork_return ## [. Bork Bork Bork!]}
   (!) {@ bork_return = bork_return ## [! Bork Bork Bork!]}
   (*) {@ bork_return = bork_return ## [$_bork]}
  }
 }
 @ FUNCTION_RETURN = [$bork_return ]
 ^assign -bork_return;^assign -_bork;^assign -__bork
}

alias postal {
 if (C) {
  @ _p.s = lastserver()
  @ _p.t = _dfn($_p.s)
  @ _p.c = C
  @ _p.mn = N
  evalserver $_p.s if (ischanop($_p.mn $_p.c)) {
   if ([$0]==[all]) {
    evalserver $_p.s @ _p.l = chanusers($_p.c)
   }{
    evalserver $_p.s fe ($chanusers($_p.c)) _p.u {if (!ischanop($_p.u $_p.c)) {@ _p.l = [$_p.l $_p.u]}}
   }
   @ _p.n = [$mid(0 3 $_p.mn)]
   @ _p.n = [$_p.n]##[Postal]
   @ _p.o = [$_p.mn]
   evalserver $_p.s /me suddenly has an urge to become a postal worker.
   evalserver $_p.s /nick $_p.n
   evalserver $_p.s WAIT
   evalserver $_p.s /me grabs an assault weapon and picks a random person...
   evalserver $_p.s //kick $_p.c $word($rand($#_p.l - 1) $_p.l) pOsTaLkIcK vIcTiM
   evalserver $_p.s /nick $_p.o
   @ _rfn($_p.s $_p.t)
  }{gecho You don't own a gun, You can't go postal without one!}
 }{gecho Not in a channel, how can you go postal???}
 purge _p
}

alias gz.unloadextras {
 ^alias -bleah;^alias -bork;^alias -fozzie;^alias -beaker
 ^alias -postal;^alias -chefme;^alias -chefsay;^alias -subchef
 ^alias -gimpkick;^alias -soupkick;^alias -gerbilkick;^alias -pimpslap
 ^alias -pimpkick;^alias -pimpslap;^alias -lamahkick;^alias -stinkkick
 ^assign -gz.extras;
 ^timer 1 ^alias -gz.unloadextras
 ^timer 2 makegemzmenu
}

#Stripw (orginal asmodean)
alias stripw {
 for (@ __i = 1, [$($__i)] != [], @ __i = __i + 1) {
  if ([$($__i)] != [$0]) {@ _sw = _sw ## [ $($__i)]}
 }
 @ function_return = mid(1 2048 $_sw)
 ^assign -_sw;
}

alias _srvc.menu {
 if (isconnected($0)) {
#  //window goto ${ww = _srv.win($0)}
  //xecho -window $ww $SHOW_NUMERICS_STR\This server is connected or in process of connecting
 } else {
  //server $0
 }
}

alias _srvn.menu {
 if (isconnected($0)) {
#  //window goto ${ww = _srv.win($0)}
  //xecho -window $ww $SHOW_NUMERICS_STR\This server is connected or in process of connecting
 } else {
  //window create server $0
 }
}

alias _cm {if ([$0]==[ON] || [$0]==[YES] || [$0]==[1]) {@ FUNCTION_RETURN = [-c]}
}

alias makemenu {
^menu -menubar
^menu menubar

^submenu menubar main -s "~Main"
^submenu menubar join -s "~Join"
^submenu menubar user -s "~User"
^submenu menubar server -s "~Server"
^submenu menubar cdcc -s "~CDCC"
^submenu menubar msgs -s "M~esgs"
^submenu menubar bx -s "~BitchX"
#^submenu menubar window -s "~Windows"
^submenu menubar help -s "~Help"

^makemain
^makejoin
^makeuser
^makeserver
^makecdcc
^makemesgs
^makebx
#^makewindows
^makehelp

^set DEFAULT_MENU menubar

^window menu menubar
}

alias makemain {
menu -main
menu main
^submenu main saveset "Save Settings"
^menuitem saveset "Save All" {
                        /save
                        /cdcc save
                        }
^menuitem saveset "Save BitchX Settings" {/save}
^menuitem saveset "Save CDCC pack list" {/cdcc save}
^submenu main clrscr "Clear Screen"
^menuitem clrscr "Clear Screen" {/clear}
^menuitem clrscr "Clear All" {/clear -all}
^menuitem clrscr "Clear Scrollback" {/clear -scrollback}
^menuitem clrscr "Clear All Scrollback" {/clear -scrollback -all}
^submenu main settings "Settings"
^menuitem settings -n -c $_cm($ctcpsound) 9 "Ctcp Sound" {
        if (ctcpsound == [ON]) {
                @ ctcpsound = [OFF]
                @ menucontrol(settings 9 check 0)
                } else {
                @ ctcpsound = [ON]
                @ menucontrol(settings 9 check 1)
                }
        }
^menuitem settings -n -c $_cm($ctcpsndreq) 10 "Ctcp Sound Request" {
        if (ctcpsndreq == [ON]) {
                @ ctcpsndreq = [OFF]
                @ menucontrol(settings 10 check 0)
                } else {
                @ ctcpsndreq = [ON]
                @ menucontrol(settings 10 check 1)
                }
        }
^menuitem settings -n -c $_cm($loadacts) 11 "Load Action File" {
        if (loadacts == [YES]) {
                @ loadacts = [NO]
                @ menucontrol(settings 11 check 0)
                } else {
                @ loadacts = [YES]
                @ menucontrol(settings 11 check 1)
                }
        }

if (ctcpsound == [ON]) {
        @ menucontrol(settings 9 check 1)
        } else {
        @ menucontrol(settings 9 check 0)
        }
if (ctcpsndreq == [ON]) {
        @ menucontrol(settings 10 check 1)
        } else {
        @ menucontrol(settings 10 check 0)
        }
if (loadacts == [YES]) {
        @ menucontrol(settings 11 check 1)
        } else {
        @ menucontrol(settings 11 check 0)
        }
        
^menuitem main "Properties" {/properties}
^menuitem main "Change Font" {/fontdialog 0 0}
^menuitem main separator
^menuitem main "Quit" {/quit}
}

alias makejoin {
menu -join
menu join
for (@ ajl=0, ajoinitem($ajl), @ajl++) {
   @ ajlchan = [$word(0 $ajoinitem($ajl))]
   @ ajlkey = [$word(1 $ajoinitem($ajl))]
   submenu join join$ajl "$ajlchan"
   menuitem join$ajl -d "Join Channel" {j $ajlchan $ajlkey}
   menuitem join$ajl "Leave Channel" {leave $ajlchan}
   menuitem join$ajl "Cycle Channel" {cycle $ajlchan}
   menuitem join$ajl "Remove From List" {unajoin $ajlchan}
 }
 menuitem join separator
 menuitem join "Leave ~Current Channel" {l}
 menuitem join "~Leave & Kill Current Window" {window delete}
 menuitem join "~Show AutoJoinList" {ajoinlist}
# gz.addonjoin
# menu join -reset
}

alias makeuser {
menu -user
menu user
^menuitem user "Set Away" {/away $J Away}
^menuitem user "Set Back" {/back}
^menuitem user separator
^menuitem user "Show Notify" {//notify}
}

alias makeserver {
 menu -srv
 menu srv
 submenu server srvc "Change Current Server"
 submenu server srvn "Connect to new server"
 purge srvgrp
 for (@ srv=0, servername($srv), @srv++) {
  if (srvgrp = servergroup($srv)) {
   if (!srvgrp[srvc][$encode($srvgrp)]) {
    @ srvgrp[srvc][$encode($srvgrp)] = 1
    submenu srvc srvc_$encode($srvgrp) "$srvgrp"
   }
   menuitem srvc_$encode($srvgrp) "$servername($srv):$word(0 $serverport($srv))" {_srvc.menu $srv}
   # if submenu does not exist
   if (!srvgrp[srvn][$encode($srvgrp)]) {
    @ srvgrp[srvn][$encode($srvgrp)] = 1
    submenu srvn srvn_$encode($srvgrp) "$srvgrp"
   }
   menuitem srvn_$encode($srvgrp) "$servername($srv):$word(0 $serverport($srv))" {_srvn.menu $srv}
  } else {
   #servers without a group
   menuitem srvc "$servername($srv):$word($serverport($srv))" {_srvc.menu $srv}
   menuitem srvn "$servername($srv):$word($serverport($srv))" {_srvn.menu $srv}
#   menuitem srvc ${isconnected($srv)?[-c]:[]} "$servername($srv):$word($serverport($srv))" {_srvc.menu $srv}
#   menuitem srvn ${isconnected($srv)?[-c]:[]} "$servername($srv):$word($serverport($srv))" {_srvn.menu $srv}
  }
 }
 menuitem srvc separator
 menuitem srvc "Manually enter server: " { manserv }
 menuitem srvn separator
 menuitem srvn "Manually enter server: " { manservn }
 menuitem server separator
^menuitem server "Reconnect" {/rec}
^menuitem server "Disconnect" {/disco}
^menuitem server separator
^submenu server servinfo "Server Information"
^menuitem servinfo "Administration" {/admin}
^menuitem servinfo "List users" {/luser}
^menuitem servinfo "Message of the Day" {/motd}
^menuitem servinfo "Server Links" {/links}
^menuitem servinfo "Server Uptime" {/stats u}
^submenu server ov "Toggle OperView"
^menuitem ov "On" {/ov on}
^menuitem ov "Off" {/ov off}
}

alias makedccmenu {
 menu -dccgl
 menu dccgl
 if (dccitem(1)) {
  #add default when fixed
  menuitem dccgl -d "Display DCC Items" { dcc }
  menuitem dccgl separator
 } else {
  menuitem dccgl -d "No DCC's in progress" { dcc }
 }
 for (@ _gl.i = 1, _gl.x = dccitem($_gl.i), @ _gl.i++) {
  if (word(0 $_gl.x) == [chat] || word(0 $_gl.x) == [raw]) {
   submenu dccgl dccsubgl$_gl.i "~$_gl.i $toupper($word(0 $_gl.x)): $word(1 $_gl.x)"
  } else {
   submenu dccgl dccsubgl$_gl.i "~$_gl.i $toupper($word(0 $_gl.x)): $word(1 $_gl.x) \($file.sanspath($word(8 $_gl.x))\)" gl $_gl.i
  }
  menuitem dccsubgl$_gl.i -d "Display" { dcc }
  if (xdcc.isoktopreview($file.sanspath($word(8 $_gl.x)))) {
   menuitem dccsubgl$_gl.i "~Preview Image" { previewbynum $word(9 $_gl.x) }
  }
  menuitem dccsubgl$_gl.i "Close" { //dcc close $word(9 $_gl.x) }
 }
 purge _gl
 menu dccgl -reset
}

makedccmenu

alias makecdcc {
menu -cdcc
menu cdcc
^submenu cdcc dccgl -s "Current DCC Items"
^submenu cdcc cdccoff "Offers..."
^menuitem cdccoff "Create New offer" {cdcc offer}
^menuitem cdccoff "Remove an Existing offer" {cdcc doffer}
^menuitem cdccoff "List your offers (local)" {cdcc list}
^menuitem cdccoff "Notify Current Channel" {cdcc notice}
^menuitem cdccoff "Show channel your offers" {cdcc plist}
^menuitem cdccoff separator
^menuitem cdccoff "Save Offer File" {cdcc save}
^menuitem cdccoff "Reload Offer File" {cdcc load}
^menuitem cdcc separator
^menuitem cdcc "Create DCC ~Window" {/window create level dcc}
^menuitem cdcc "Send File(s)" { mansenddialog }
^menuitem cdcc "ReSend File(s)" { manresenddialog }
}

alias manserv {
  @ _kat = [$"Enter Server name: "]
  if (_kat) {//^server $_kat}
  ^assign -_kat
}

alias manservn {
  @ _kat = [$"Enter Server name: "]
  if (_kat) {//^window create server $_kat}
  ^assign -_kat
}

alias makemesgs {
^menuitem msgs "Read Message log" {/readlog}
^menuitem msgs "Delete Message log" {/remlog}
}

alias makebx {
^submenu bx bxmdi "MDI Window..."
^menuitem bxmdi "MDI On" {/set MDI on}
^menuitem bxmdi "MDI Off" {/set MDI off}
^menuitem bx separator
^menuitem bx "Paste" {/pmpaste}
^menuitem bx "Paste to input" {/pmpaste -input}
^menuitem bx "SmartPaste" {/pmpaste -smart}
^menuitem bx separator
^menuitem bx "Play a sound" {/dialogplaysound}
^menuitem bx separator
^menuitem bx "Show Version" {/sv}
}

alias makewindows {
^menuitem window "New Window" {/window create}
^menuitem window "Describe Window" {/window describe}
}

alias makehelp {
^menuitem help "Help" {/help}
^menuitem help "Extended Help" {/bhelp index}
^menuitem help separator
^menuitem help "About" {/about}
}

alias redraw_menus {
 for (@ idx = 1, (win = winitem($idx)) && !done, @ idx++) {
  if (win) {
   if ([$word(6 $win)]!=[<none>]) {
    ^window $word(0 $win) menu $word(6 $win)
   }
  } else {@ done = 1}
 }
 ^assign -done;^assign -win;^assign -idx
}

alias makepopup {
@ gt.ppnick = [$1]
@ gt.ppchan = [$0]

menu -popup
menu popup
 //submenu popup md "$gt.ppnick"
  //menuitem md "Op     (+o)" {op $gt.ppnick}
  //menuitem md "DeOp   (-o)" {deop $gt.ppnick}
  //menuitem md "Voice  (+v)" {voice $gt.ppnick}
  //menuitem md "Quiet  (-v)" {quiet $gt.ppnick}
##Add some cool ignore stuff here.
  //menuitem md "Ignore (temp)" {ig $gt.ppnick all}
  //menuitem md "Ignore (perm)" {ig $gt.ppnick -p all}
  //menuitem md "Unignore" {unig $gt.ppnick all}
##Do it right
 //submenu popup nxdcc "XDCC"
  //menuitem nxdcc -d "Req Pack List" {msg $gt.ppnick xdcc list}
  //menuitem nxdcc separator
  for (@ _xidx = 1, _xidx <= 15, @ _xidx++) {
   //submenu nxdcc nx$_xidx "Pack #$_xidx  "
   //menuitem nx$_xidx "List" msg $gt.ppnick xdcc list #$_xidx
   //menuitem nx$_xidx -d "Send" msg $gt.ppnick xdcc send #$_xidx
   //menuitem nx$_xidx "ReSend" msg $gt.ppnick xdcc resend #$_xidx
  }

 //menuitem popup "Send File(s)" {senddialog $gt.ppnick}
 //menuitem popup "ReSend File(s)" {resenddialog $gt.ppnick}
 //menuitem popup "Send Sound" {dialogsound $gt.ppnick}
 //submenu popup popother "Other"
  //menuitem popother -d "Whois" {whois $gt.ppnick}
  //menuitem popother "Server Whois" {wii $gt.ppnick}
  //menuitem popother "Lookup" {nslookup $gt.ppnick}
  //menuitem popother "Channel Idletime" {/showidle}
  //menuitem popother separator
  //menuitem popother "Talk (query)" {talk $gt.ppnick}
  //menuitem popother "Chat (dcc chat query)" {chat $gt.ppnick}
  //menuitem popother separator
  //menuitem popother "Ping" {ping $gt.ppnick}
  //menuitem popother "Time" {/ctcp $gt.ppnick TIME}
  //menuitem popother "UserInfo" {/ctcp $gt.ppnick userinfo}
  //menuitem popother "Finger" {/ctcp $gt.ppnick finger}
  //menuitem popother "Version" {ver $gt.ppnick}
 //menuitem popup separator
 //submenu popup kicks "Kicks"
  //menuitem kicks -d "Random Kick" {k $gt.ppnick}
  //menuitem kicks "McKick" {mck $gt.ppnick}
  //menuitem kicks "McKick (break)" {mcdk $gt.ppnick}
  //menuitem kicks "TacobellKick" {tbk $gt.ppnick}
  //menuitem kicks "BurgerKing Kick" {bkk $gt.ppnick}
  //menuitem kicks "KentuckyFried" {kfck $gt.ppnick}
  //menuitem kicks "CarlsJr Kick" {cjk $gt.ppnick}
  //menuitem kicks "TaeKwonLeap Kick" {tkl $gt.ppnick}
  //menuitem kicks "GreetKick" {gk $gt.ppnick}
  if (gz.extras) //menuitem kicks -b "PimpKick" {pimpkick $gt.ppnick}
  if (gz.extras) //menuitem kicks "PimpSlap" {pimpslap $gt.ppnick}
  if (gz.extras) //menuitem kicks "GerbilKick" {gerbilkick $gt.ppnick}
  if (gz.extras) //menuitem kicks "GimpKick" {gimpkick $gt.ppnick}
  if (gz.extras) //menuitem kicks "Stinkkick" {stinkkick $gt.ppnick}
  if (gz.extras) //menuitem kicks "LamahKick" {lamahkick $gt.ppnick}
  if (gz.extras) //menuitem kicks "Soup Kick" {soupkick $gt.ppnick}
 //submenu popup popban "Bans"
  //menuitem popban "Ban" {ban $gt.ppnick}
  //menuitem popban -d "Ban/Kick" {bk $gt.ppnick}
  //menuitem popban "Kick/Ban/Ignore" {kbi $gt.ppnick}
  //menuitem popban separator
  //menuitem popban "Screw Ban" {sban $gt.ppnick}
  //menuitem popban "Screw Ban/Kick" {sban $gt.ppnick;k $gt.ppnick}
  //menuitem popban "Screw Ban/Kick/Ignore" {sban $gt.ppnick;k $gt.ppnick;ig $gt.ppnick}
 //menuitem popup separator
 //submenu popup popnotify "Notify..."
  //menuitem popnotify "Add to Notify list" {//notify $gt.ppnick}
  //menuitem popnotify "Remove from Notify List" {//notify -$gt.ppnick}
  //menuitem popnotify "Show Notify List" {//notify}
 //submenu popup poppaste "Clipboard"
  //menuitem poppaste -d "Paste" {//pmpaste}
  //menuitem poppaste "SmartPaste" {//pmpaste -smart}
 //menuitem popup separator
 //submenu popup actions "Actions"
  //submenu actions cluebats "ClueBats"
   //menuitem cluebats "Clue Bludgeon" {/me bludgeons $gt.ppnick with the cluebat}
   //menuitem cluebats "Lead ClueBat" {/me pulls out a lead cluebat, engraves $gt.ppnick's name on it, and swings wildly}
   //menuitem cluebats "Pi�ata" {/me strings $gt.ppnick up, puts on a blindfold, and declares a cluebat pi�ata party!!!}
   //menuitem cluebats "SuperMomoCluebat" {/me purchases a sUpErMoMo (tm) cluebat and pummels $gt.ppnick to the ground}
   //menuitem cluebats "Windows Cluebat" {/me finds the Windows edition Cluebat, taps it over $gt.ppnick's head, and watches it break}
  //menuitem actions separator
  //menuitem actions "Awake?" {/me pokes $gt.ppnick in the ribs ... you awake?}
  //menuitem actions "Backside" {/me calls attention to $gt.ppnick's backside}
  //menuitem actions "Booger" {/me flicks a booger at $gt.ppnick}
  //menuitem actions "Cookie Toss" {/me tosses $gt.ppnick a cookie... good boy}
  //menuitem actions "Curse" {/me wishes the fleas of a thousand camels upon $gt.ppnick's underwear drawer.}
  //menuitem actions "Fart" {/me farts in $gt.ppnick's general direction, clearing $gt.ppchan as well.}
  //menuitem actions "Finger" {/me gives $gt.ppnick the finger.  nInn}
  //menuitem actions "Glare" {/me glares at $gt.ppnick}
  //submenu actions ctacts -b "Cute Actions"
   //menuitem ctacts "Hug" {/me hugs $gt.ppnick ....}
   //menuitem ctacts "Pass Kiss" {/me Passionately Kisses $gt.ppnick}
   //menuitem ctacts "Hug/Kiss" {/me Hugs and Kisses $gt.ppnick}
   //menuitem ctacts "Dance" {/me takes $gt.ppnick in hand and Dances $rgenderex() around the channel}
   //menuitem ctacts "OZ-Hug" {/me gives $gt.ppnick a Big Ole Ozzie hug....}
   //menuitem ctacts "Rose" {/me drops to $gender knees and hands $gt.ppnick a long stemed rose @>->-`-,-->---}
   //menuitem ctacts "Snuggle" {/me snuggles up to $gt.ppnick ....}
  //menuitem actions separator
  //menuitem actions "HerringSlap" {/me slaps $gt.ppnick around a bit with an official sized #os/2 herring...}
  //menuitem actions "Noogie" {/me noogies $gt.ppnick}
  //menuitem actions "Nosepicker" {/me watches in disgust, as $gt.ppnick picks their nose}
  //menuitem actions "Slap" {/me slaps $gt.ppnick around a bit with a substantially large Brown Cow...}
  //menuitem actions "Moon" {/me drops $gender drawers and moons $gt.ppnick ( | )}
  //menuitem actions "PoopFace" {say Hey $gt.ppnick does the expression "Up your Bum PoopFace" Mean anything to you ??? :P}
  //menuitem actions "Rose" {/me tosses $gt.ppnick a rose @>--`-}
  //menuitem actions "Smurf" {/me points at $gt.ppnick and calls him a 09SMURF07}
  //submenu actions deaths -b "Deaths"
   //menuitem deaths "AK47" {/me pulls out $gender trusty AK47... nestles the sites squarely on $gt.ppnick's head... eases back on the trigger and empties a 30 round clip....BANG You're Dead}
  //menuitem actions separator
  //menuitem actions "Sneeze" {/me sneezes violently and a blob of snot lands on $gt.ppnick}
  //menuitem actions "Thwap" {/me thwaps $gt.ppnick upside the head...   \"Get with the program.\"}
  //menuitem actions "Tickle" {/me sneaks up behind $gt.ppnick ... tickle tickle tickle...}
  //menuitem actions "Wet Noodle" {/me pummels $gt.ppnick with a wet noodle}
  //menuitem actions "Whistle" {/me whistles with an innocent look on $gender face...}
  //menuitem actions "Win95 Torture" {/me handcuffs $gt.ppnick to a desk with Windows95 - "Multitask, bitch."}
  //menuitem actions "Vomit upon" {/me vomits repeatedly upon $gt.ppnick}
  //menuitem actions "Yucko" {/me slids over close to $gt.ppnick and gives them a nice slimey YUCKO !!!!}
  //submenu popup greets "Greets"
   //menuitem greets "moo" {say moo $gt.ppnick}
   //menuitem greets "\'lo" {say 'lo $gt.ppnick}
   //menuitem greets "heya" {say heya $gt.ppnick}
   //menuitem greets "what's up" {say what's up $gt.ppnick}
   //menuitem greets "re" {say re $gt.ppnick}
   //menuitem greets "hi" {say hi $gt.ppnick}
   //menuitem greets "Yo" {say Yo!! $gt.ppnick\!}
   //menuitem greets "hello" {say hello $gt.ppnick}
   //menuitem greets "Howdy" {say Howdy $gt.ppnick}
   //menuitem greets "\'sup?" {say \'sup $gt.ppnick\?}
   //menuitem greets "!!!!!" {say $gt.ppnick!!!!!}
   //menuitem greets "!@#\$\%\^" {say $gt.ppnick\!@#\$\%\^}
 //submenu popup byes "Byes"
  //menuitem byes "bye" {say bye $gt.ppnick}
  //menuitem byes "hastalapasta" {say hastalapasta $gt.ppnick}
  //menuitem byes "hastalabyebye" {say Hastalabyebye $gt.ppnick}
  //menuitem byes "wave" {/me waves bye to $gt.ppnick\.  \"Don't let the door hit you in the arse\"}
  //menuitem byes "See ya" {say See ya $gt.ppnick}
 if ([$loadacts]==[YES]) {
   /loadplug $actionsfile
 }
^popupmenu popup
}

alias rccheck {
 if (onchannel($lastclickline(4) $C)==1) {makepopup $C $lastclickline(4)} else {windowlist}
 }

alias ldccheck {
 if (onchannel($lastclickline(4) $C)==1) {talk $lastclickline(4)}
 }

alias logstart {
  @ cc = [$0]
     filedialog S $exedir/*.log "Logfile for $cc" "Set" {
      if ([$0]==[OK]) {
                       ^cset CHANNEL_LOG_FILE $decode($1-)
                       ^cset CHANNEL_LOG on
                       gecho Logging of $cc to $decode($1-) now active.
                       }
      }
}

alias logchange {
  @ cc = [$0]
   if ([$getcset(CHANNEL_LOG $cc)]!=[ON]) {
    filedialog S $exedir/*.log "Logfile for $cc" "Set" {
     if ([$0]==[OK]) {
      ^cset CHANNEL_LOG_FILE $decode($1-)
      gecho Log file for $cc changed to $decode($1-).
      }
    }
  } else {gecho You must turn Logging off before changing the log file}
}

alias logstop {
  @ cc = [$0]
      ^cset CHANNEL_LOG OFF
      gecho Log file $getcset(CHANNEL_LOG_FILE $cc) for $cc now closed.
}

alias gz.ajoinlist {
 for (@ idx = 0, ajoinitem($idx), @ idx++) {
 push _ret $ajoinitem($idx)
 }
#@function_return = $_ret
return $_ret
purge _ret
}

alias inajoinlist {
@ function_return = match($0 $gz.ajoinlist()) ? 1 : 0
}

#Popup Channel Menu inspired by menus.scr by OS3
alias chanmenu {
@ cc = [$0]
 menu -popcm
 menu popcm
 if (match($cc $mychannels())) {
  if (cc != T) {//menuitem popcm "goto $cc window" /j $cc}
  //menuitem popcm \"~Leave: $cc\" {leave $cc}
 } else {//menuitem popcm \"~Join: $cc\" {join $cc}}
 if (inajoinlist($cc)) {
    //menuitem popcm "~Remove from AJoin" {unajoin $cc}
    } else {
    //menuitem popcm "~Add to AJoin" {ajoin $cc}
    }
 if (match($cc $mychannels())) {
  if ([$getcset(CHANNEL_LOG $cc)]==[ON]) {
   menuitem popcm "Stop Logging" { logstop $cc  }
  } else {
    menuitem popcm "Start Logging" { logstart $cc $1- }
  }
  menuitem popcm "Change Logfile" { logchange $cc $1- }
  }
if (![$1]) {
 menuitem popcm separator
 //submenu popcm cmm "Channel Stats"
  if (gz.longcsc) {
   //menuitem cmm -d "Names (detailed)" {/scan}
   //menuitem cmm "Names (short)" {cnames}
  } else {
   //menuitem cmm -d "Names (short)" {cnames}
   //menuitem cmm "Names (detailed)" {/scan}
  }
  //menuitem cmm "Who (Detailed)" {cwho}
  //menuitem cmm "Show Channel Bans" {csb}
  //menuitem cmm "Show Channel Topic" {t}
 //submenu popcm cmodes "Modes"
  //menuitem cmodes "Show Modes" {gecho Mode For $cc is \+$chanmode($cc)}
  //menuitem cmodes "Remove Keys (unlock)" {unlock}
  //submenu cmodes csetmode "Set Modes"
   //menuitem csetmode "Mode (+nst)" {/mode $cc +nst}
   //menuitem csetmode "Mode (+inst)" {/mode $cc +inst}
  //submenu cmodes creset "Reset Modes"
   //menuitem creset "Reset (+nst)" {/creset}
   //menuitem creset "Reset (+inst)" {/creseti}
  //submenu cmodes cmass "Mass"
   //menuitem cmass "Mass Op (+o)" {mop}
   //menuitem cmass "Mass DeOp (-o)" {mdop}
   //menuitem cmass "Mass Voice (+v)" {mvoice}
   //menuitem cmass "Mass UnVoice (-v)" {mdvoice}
 //menuitem popcm separator
  //submenu popcm credir "Redirects"
  //submenu credir lrm "Last Received Message"
   //menuitem lrm "=>  Channel" {relm}
   //menuitem lrm "=>  Topic" {relmt}
  //submenu credir lrn "Last Received Notice"
   //menuitem lrn "=>  Channel" {reln}
   //menuitem lrn "=>  Topic" {relnt}
  //submenu credir lsm "Last Sent Message"
   //menuitem lsm "=>  Channel" {relsm}
   //menuitem lsm "=>  Topic" {relsmt}
  //submenu credir lsn "Last Sent Notice"
   //menuitem lsn "=>  Channel" {relsn}
   //menuitem lsn "=>  Topic" {relsnt}
 //submenu popcm other "Other"
  //menuitem other "Channel Away" {away -c}
  //menuitem other "Channel Back" {cback}
  //menuitem other "Cycle" {cycle}
  //menuitem other "Check Offers" {/ctcp $cc xdcc list}
  //menuitem other "Check ctcp Time" {/ctcp $cc time}
 //menuitem popcm "Send Sound" dialogsound $cc
 //menuitem popcm separator
 //submenu popcm cgreets "Greets"
  //menuitem cgreets "moo" {/say moo!}
  //menuitem cgreets "zug zug" {/say zug zug}
  //menuitem cgreets "Hey all" {/say Hey all}
  //menuitem cgreets "'lo" {/say 'lo}
  //menuitem cgreets "What's up folks?" {/say What's up folks?}
 //submenu popcm cacts "Actions"
  //menuitem cacts "Binoculars" {/me pulls out $gender binoculars and searches $cc for intelligent life.... Damn... None to be found!}
  //menuitem cacts "Gerbil Release" {/me releases $gender gerbils upon $cc, run while you can!!!}
  //menuitem cacts "PinDrop" {/me drops the proverbial pin...}
  //menuitem cacts "Slide" {/me slides into the channel...  dances a happy jig... falls on $gender arse in the process}
 //submenu popcm cbyes "Byes"
  //menuitem cbyes "Later all" {/say Later all}
 //menuitem popcm separator
 //menuitem popcm "Ping" {ping $CC}
 //menuitem popcm "Version" {ver $CC}
}
  popupmenu popcm
  #^assign -cc
}

alias targetmenu {
 menu -tm
 menu tm
 if (![$1]) {
  menuitem tm "Queried: $0    " #
 } else {
  menuitem tm "nick: $0 " #
 }
 menuitem tm separator
 if (![$1]) {
  menuitem tm "Turn Log On" {//^window logfile $exedir/logs/$left(8 $strip(=\\*?<>|\"\' $T)).log;//window log on}
  menuitem tm "Turn Log off" //window log off
 } else {
  menuitem tm "Talk Window" /talk $0
  menuitem tm "Chat Window" /chat $0
 }
 submenu tm tmi "Ignores"
  menuitem tmi -d "Ignore (temp)" ig $0 -t 180 all
  menuitem tmi "Ignore (perm)" ig $0 -p all
  menuitem tmi "Unignore" unig $0 all
 //submenu tm tmo "Other"
  //menuitem tmo -d "Whois" whois $0
  //menuitem tmo "Server Whois" wii $0
  //menuitem tmo "Lookup" nslookup $0
  //menuitem tmo separator
  //menuitem tmo "Ping" ping $0
  //menuitem tmo "Time" ctcp $0 TIME
  //menuitem tmo "UserInfo" ctcp $0 userinfo
  //menuitem tmo "Finger" ctcp $0 finger
  //menuitem tmo "Version" ver $0
 //submenu tm tmx "XDCC"
  //menuitem tmx -d "Req Pack List" msg $0 xdcc list
  //menuitem tmx separator
  for (@ _xidx = 1, _xidx <= 15, @ _xidx++) {
   //submenu tmx tmx$_xidx "Pack #$_xidx  "
   //menuitem tmx$_xidx "List" msg $0 xdcc list #$_xidx
   //menuitem tmx$_xidx -d "Send" msg $0 xdcc send #$_xidx
   //menuitem tmx$_xidx "ReSend" msg $0 xdcc resend #$_xidx
  }
 //menuitem tm "Send File(s)" senddialog $0
 //menuitem tm "ReSend File(s)" resenddialog $0
 //menuitem tm "Send Sound" dialogsound $0
 popupmenu tm
 ^assign -_xidx
}

alias windowlist {
 @ _ll.l = lastclickline(0)
 if (![$0]) {@ _cw = lastclickline(3);@ __cw = lastclickline(4)} else {@ _cw = []}
 if ((word(2 $_ll.l) == [SOUND:]) && (![$0])  && (word(4 $_ll.l) == [\(autorequest])) {
  menu -tmpmenu
  menu tmpmenu
  if (gz.mircsndpatch) {
         //^quote PRIVMSG $1 :!$0 $3
   menuitem tmpmenu "request Sound [$word(3 $_ll.l)]" { /msg $C !$word(1 $_ll.l) $word(3 $_ll.l) }
        } else {
   menuitem tmpmenu "request Sound [$word(3 $_ll.l)]" { /msg $word(1 $_ll.l) !$word(1 $_ll.l) $word(3 $_ll.l) }
        }
#  menuitem tmpmenu "request Sound [$word(3 $_ll.l)]" { /msg $word(1 $_ll.l) !$word(1 $_ll.l) $word(3 $_ll.l) }
  popupmenu tmpmenu
 } else if ((rmatch($_cw *.??*)) && (@_cw > 4)) {
#  if (!rmatch($_cw http:// ftp:// gopher://)) {@_cw=[http://]##_cw}
  urlmenu $_cw;^assign -_cw
# } else if (ischannel($strip(@\'\"\(\) $_cw))) {chanmenu $strip(@\'\"\(\) $_cw) -d;^assign -_cw
 } else if (ischannel($gz.safechan($_cw))) {chanmenu $gz.safechan($_cw) -d;^assign -_cw
# } else if (ischannel($strip(+@\'\"\(\) $_cw))) {chanmenu $_cw -d;^assign -_cw}
 } else if (__cw == T && [$T]!=[]) {targetmenu $T
 } else {
  menu -menulist
  menu menulist
  #submenu menulist setup -s "Setup"
  //submenu menulist pastepop "Clipboard"
   //menuitem pastepop -d "Paste" {//pmpaste}
   //menuitem pastepop "SmartPaste" {//pmpaste -smart}
#  if (lastclickline(3)) {
#   //submenu menulist webster "Dictionary"
#    //menuitem webster "Define: $strip(\[\]!@#$%^&*\(\)-_=+\\|,.<>\/?~`\" $lastclickline(3))" define $strip(\[\]!@#$%^&*\(\)-_=+\\|,.<>\/?~`\" $lastclickline(3))
#    //menuitem webster "Spell:  $strip(\[\]!@#$%^&*\(\)-_=+\\|,.<>\/?~`\" $lastclickline(3))" spell $strip(\[\]!@#$%^&*\(\)-_=+\\|,.<>\/?~`\" $lastclickline(3))
#  }
  //submenu menulist popsave "Save..."
   //menuitem popsave "Save All" {
                        /save
                        /cdcc save
                        }
   //menuitem popsave "Save BitchX Settings" {/save}
   //menuitem popsave "Save CDCC Pack List" {/cdcc save}
  //menuitem menulist "Change Font" {fontdialog 0 0}
  makedccmenu
  submenu menulist subdcc "Current DCC Items"
  if (dccitem(1)) {
  #add default when fixed
   menuitem subdcc -d "Display DCC Items" dcc
  menuitem subdcc separator
  } else {
   menuitem subdcc -d "No DCC's in progress" dcc
  }
  for (@ _gl.i = 1, _gl.x = dccitem($_gl.i), @ _gl.i++) {
   if (word(0 $_gl.x) == [chat] || word(0 $_gl.x) == [raw]) {
    submenu subdcc subdccsubgl$_gl.i "~$_gl.i $toupper($word(0 $_gl.x)): $word(1 $_gl.x)"
   } else {
    submenu subdcc subdccsubgl$_gl.i "~$_gl.i $toupper($word(0 $_gl.x)): $word(1 $_gl.x) \($file.sanspath($word(8 $_gl.x))\)" gl $_gl.i
   }
   menuitem subdccsubgl$_gl.i -d "Display" dcc
   if (xdcc.isoktopreview($file.sanspath($word(8 $_gl.x)))) {
    menuitem subdccsubgl$_gl.i "~Preview Image" { previewbynum $word(9 $_gl.x) }
   }
   menuitem subdccsubgl$_gl.i "Close" { //dcc close $word(9 $_gl.x) }
  }
  purge _gl
  //menuitem menulist "Show Notify" {//notify}
  //menuitem menulist separator
  //menuitem menulist "Properties" {/properties}
  //menuitem menulist separator
  //menuitem menulist "   <<  Window list >>   " #
  @ done = 0
  for (@ idx = 1, (win = winitem($idx)) && !done, @ idx++) {
   if (win) {
    if ([$word(3 $win)]!=[<none>]) {
     //menuitem menulist "~$idx  $word(3 $win)  [$word(0 $win)]" { //window show $word(0 $win) }
    } else if ([$word(4 $win)!=[<none>]) {
     //menuitem menulist "~$idx  $word(4 $win)  [$word(0 $win)]" { //window show $word(0 $win) }
    } else {
     //menuitem menulist "~$idx  $word(1 $win)  [$word(0 $win)]" { //window show $word(0 $win) }
    }
   } else {@ done = 1}
  }
  popupmenu menulist
 }
 ^assign -_cw;^assign -__cw
 ^assign -done
}

alias urlmenu {
 @ url = [$strip(\(\)\" $0)]
 if (url) {
  menu -wm
  menu wm
  //submenu wm wm3 "Netscape"
   //menuitem wm3 -d \"$left(100 $url)\" webfix netscape $url
  //submenu wm wm1 "WebExplorer"
   //menuitem wm1 -d \"$left(100 $url)\" webfix webexplorer $url
  //submenu wm wm2 "Lynx"
   //menuitem wm2 -d \"$left(100 $url)\" exec -start LYNX $url
  //menuitem wm separator
  //submenu wm wmh "Add to URL Save File"
   //menuitem wmh -d \"$left(100 $url)\" addtofile $url
  //submenu wm wmc "Copy URL to clipboard"
   //menuitem wmc -d \"$left(100 $url)\" clipbrdput $url
 popupmenu wm
 }
 ^assign -url
}

alias webfix {
 @ _weblist = [$webrun($0)]
 if (_weblist) {
  @ webrun(activate $word(0 $_weblist))
  @ webrun($0 pushurl $word(0 $_weblist) $1)
 } else {
  if ([$0]==[webexplorer]) {/exec -noshell explore.exe $1}
  if ([$0]==[netscape]) {/exec -start netscape $browserparams $1}
 }
 ^assign -_weblist
}

#OS2-Mike's idea and code stub.
alias dialogsound {
 @ gt.sndnick = [$0]
 if (ischannel($gt.sndnick)) {
  filedialog OA $sounddir/*.* "Send Sound Files" "Send/Exit" "Send" {
   if ([$0]==[OK]) {/csound $gt.sndnick $decode($1);^assign -gt.sndnick}
   if ([$0]==[APPLY]) {/csound $gt.sndnick $decode($1)}
   if ([$0]==[CANCEL]) {^assign -gt.sndnick}
  }
 } else {
  filedialog OA $sounddir/*.* "Send Sound Files" "Send/Exit" "Send" {
   if ([$0]==[OK]) {
    if (ctcpsnd.localfile($decode($1))) {
     /mmpm.playfile $ctcpsnd.fname
     //ctcp $gt.sndnick SOUND $decode($1)
     ^assign -gt.sndnick
    }
   }
   if ([$0]==[APPLY]) {
    if (ctcpsnd.localfile($decode($1))) {
     /mmpm.playfile $ctcpsnd.fname
     //ctcp $gt.sndnick SOUND $decode($1)
    }
   }
   if ([$0]==[CANCEL) {
    ^assign -gt.sndnick
   }
  }
 }
}

alias dialogplaysound {
  filedialog OA $sounddir/*.* "Play Sound Files" "Play" "Test" {
   if ([$0]==[OK]) {
    if (ctcpsnd.localfile($decode($1))) {
     /mmpm.playfile $ctcpsnd.fname
     ^assign -gt.sndnick
    }
   }
   if ([$0]==[APPLY]) {
    if (ctcpsnd.localfile($decode($1))) {
     /mmpm.playfile $ctcpsnd.fname
    }
   }
   if ([$0]==[CANCEL) {
    ^assign -gt.sndnick
   }
  }
}

alias senddialog {//filedialog OM $gx.uploaddir\* "Select Files to send" sendproc send $0 $$*}
alias resenddialog {//filedialog OM $gx.uploaddir\* "Select Files to send" sendproc resend $0 $$*}

alias sendproc {
 if ([$2] == [OK]) {
  @ _sp.f = 0
  fe ($3-) _sp.t {
   if (fexist($decode($3-)) == 1) {
    //dcc $0 $1 $decode($3-)
    @ _sp.f = 1
   }
  }
  if (_sp.f) {gecho File Request sent to $1}
  purge _sp
 }
}

alias mansenddialog {//filedialog OM $gx.uploaddir\* "Select Files to send" mansendproc send $$*}
alias manresenddialog {//filedialog OM $gx.uploaddir\* "Select Files to send" mansendproc resend $$*}

alias mansendproc {
 if ([$1] == [OK]) {
  @ _sp.n = [$"[gxDCC] Nick to send to : "]
  if (_sp.n) {
   @ _sp.f = 0
   fe ($2-) _sp.t {
    if (fexist($decode($_sp.t)) == 1) {
     //dcc $0 $_sp.n $decode($_sp.t)
     @ _sp.f = 1
    }
   }
  }
  if (_sp.f) {gecho File Request sent to $_sp.n}
  purge _sp
 }
}

#on ^hook "dccchanged*" {
#   makedccmenu
#   /redraw_menus
#   }

#on #-dcc_connect 23 "*" {^hook dccchanged}
#on #-dcc_lost 23 "*" {^hook dccchanged}
#on #-dcc_request 23 "*" {^hook dccchanged}

#^on ^connect "*" {
#   makemenu
#   /redraw_menu
#}

^on #^timer 60 * {
 if (rmatch($0 %:00*) || match($0 %:30*) || match($0 %:15*) || match($0 %:45*)) {
  for (@ idx = 1, (win = winitem($idx)), @ idx++) {
   if (win) {xecho -b -window $word(0 $win) The Time is now $0}   }
  }
}

alias gz.sndon {
 if (ctcpsound == [OFF]) {
  @ function_return = 0
 } else {
  if (away && gz.noctcpaway) {
   @ function_return = 0
  } else {
   @ function_return = isctog($0 S) ? 0 : 1
  }
 }
}

alias gz.reqon {
 if (ctcpsndreq == [OFF]) {
  @ function_return = 0
 } else {
  if (away && gz.noctcpaway) {
   @ function_return = 0
  } else {
   @ function_return = isctog($0 R) ? 0 : 1
  }
 }
}

on ^ctcp "% % SOUND *" {
        @ _dl = []
        if (rmatch($3 *.wav *.au *.mid) && [$3] && gz.sndon($1)) {
                if (ctcpsnd.havefile($3)) {
#               mmpm.playfile2 $gz.playifplaying $ctcpsnd.fname
                mmpm.playfile $ctcpsnd.fname
                } else {
                        if (!gz.reqon($1)) { @ _dl = [autorequest disabled]
                        } else if (ctcpsnd.isgetting($3)) { @ _dl = [downloading]
                        } else if (ctcpsnd.isrequested($3) < 30) { @ _dl = [requested]
                        } else {
        if (gz.mircsndpatch) {
                                        //^quote PRIVMSG $1 :!$0 $3
                                } else {
                                        //^quote PRIVMSG $0 :!$0 $3
                                }
                                ctcpsnd.requested $3
                                @ _dl = [requesting]
                        }
                }
                if (ischannel($1)) {
                        //xecho -b -t $1 ${gc.nickaction}$0${cl}/$1 SOUND: $file.sanspath($3) ${_dl?[\($_dl\)]:[]} $mirc2cntl(,$4-)
                } else {
                        //xecho -b ${gc.nickaction}$0${cl} SOUND: $file.sanspath($3) ${_dl?[\($_dl\)]:[]} $mirc2cntl(,$4-)
                }
        } else {
                if (ischannel($1)) {
                        //xecho -b -t $1 ${gc.nickaction}$0${cl}/$1 SOUND: $file.sanspath($3) \(ctcp sounds disabled\) $mirc2cntl(,$4-)
                } else {
                        //xecho -b ${gc.nickaction}$0${cl} SOUND: $file.sanspath($3) \(ctcp sounds disabled) $mirc2cntl(,$4-)
                }
        }
}

on ^hook "ctcpsnd received %*" {
 if (ctcpsound == [on]) {
  gecho Requested Sound Finished: $2-
# /mmpm.playfile2 $gz.playifplaying $2
  /mmpm.playfile $2
 }
}

on ^hook "ctcpsnd request % % *" {
 gecho \($4\) file request from $3 ${[$2]?[sent]:[access denied]}
}

on #-send_msg 74 "% !% %.wav" ctcpsnd.request $2
on #-send_msg 74 "% !%.au" ctcpsnd.request $2
on #-send_msg 74 "% !%.mid" ctcpsnd.request $2

on #-send_notice 74 "% !% %.wav" ctcpsnd.request $2
on #-send_notice 74 "% !% %.au" ctcpsnd.request $2
on #-send_notice 74 "% !% %.mid" ctcpsnd.request $2

on #-send_public 74 "% !% %.wav" ctcpsnd.request $2
on #-send_notice 74 "% !% %.mid" ctcpsnd.request $2
on #-send_msg 74 "% !% %.au" ctcpsnd.request $2

alias sound {
 if ([$0]) {
  if (T) {
   if (ischannel($T)) {@ _t = T} else {@ _t = strip(= $T)}
   if (ctcpsnd.localfile($0)) {
#   /mmpm.playfile2 $gz.playifplaying $ctcpsnd.fname
    /mmpm.playfile $ctcpsnd.fname
    /ctcp $_t SOUND $0-
    if ([$1] != []) {
     //xecho -b ${gc.action}$N${cl}/$T SOUND \($0\): $1-
    } else {
     //xecho -b ${gc.action}$N${cl}/$T SOUND \($0\)
    }
   } else {
    gecho File $0 does not exist${index(\\/: $0) >= 0 ? [, please check your /set sound_path] : []}
   }
  } else {
   gecho There are no channel or /query in this window
  }
 } else {
  gecho Usage: /sound file.wav [</me like action>]
 }
 ^assign -_t
}

alias csound {
 if (ctcpsnd.localfile($1)) {
# /mmpm.playfile2 $gz.playifplaying $ctcpsnd.fname
  /mmpm.playfile $ctcpsnd.fname
  /ctcp $0 SOUND $1-
  //xecho -b ${gc.action}$N${cl} SOUND \($1)
 } else {
  gecho File $1 does not exist
 }
}

alias chat {
 if ([$1]==[-b]) {@ _oink = gz.autotalkfg} else {@ _oink = 1}
 if ([$0]) {
  for (@ idx = 1, (win = winitem($idx)) && !done, @ idx++) {
   if (win) {
    if (word(4 $win)==[=$0]) {
     gecho You already have a query to $0
     @ borky = 1
    }
   } else {@ done = 1}
  }
  if (!borky) {
   gecho ${gc.msginfo} Creating chat window with${cl} ${gc.msgfrom} $0${cl}
   //^window create nicklist 0 query =$0
   //dcc chat $0
   if (autotalklogging == [ON]) {
    switch ($gz.drivetype($gz.logdir)) {
     (hpfs) {@ _talk.file = strip(\\*?<>|\"\' $0) ## [.log]}
     (*) {@ _talk.file = left(8 $strip(\\*?<>|\"\' $0)) ## [.log]}
    }
    //^window $_moo logfile $gz.logdir\/$_talk.file
    xecho -target $0 $gemz Window Logfile is $gz.logdir\/$_talk.file
    //^window $_moo log on
    xecho -target $0 $gemz Window LOG is ON
   }
  }
 } else {gecho Usage talk <nick>}
 ^assign -done;^assign -borky;^assign -_moo;^assign -_oink
}

alias talk {
 if ([$1]==[-b]) {@ _oink = gz.autotalkfg} else {@ _oink = 1}
 if ([$0]) {
  for (@ idx = 1, (win = winitem($idx)) && !done, @ idx++) {
   if (win) {
    if (word(4 $win)==[$0]) {
     gecho You already have a query to $0
     @ borky = 1
    }
   } else {@ done = 1}
  }
  if (!borky) {
   gecho ${gc.msginfo} Creating chat window with${cl} ${gc.msgfrom} $0${cl}
   //^window create nicklist 0 query $0
   if (autotalklogging == [ON]) {
    switch ($gz.drivetype($gz.logdir)) {
     (hpfs) {@ _talk.file = strip(\\*?<>|\"\' $0) ## [.log]}
     (*) {@ _talk.file = left(8 $strip(\\*?<>|\"\' $0)) ## [.log]}
    }
    //^window $_moo logfile $gz.logdir\/$_talk.file
    xecho -target $0 $gemz Window Logfile is $gz.logdir\/$_talk.file
    //^window $_moo log on
    xecho -target $0 $gemz Window LOG is ON
   }
  }
 } else {gecho Usage talk <nick>}
 ^assign -done;^assign -borky;^assign -_moo;^assign -_oink
}

alias addhilite {
 if ([$0]) {
  if ([$0]==[-n]) {
   push hilitelist $1
   gecho \$1\ added to the hilite list.
  } else {
   if (match($0 $hilitelist)) {
    gecho a matching highlite string was found, to force
    gecho a new highlight, use /addhilite -n <string>
   } else {
    push hilitelist $0
    gecho \$0\ added to the hilite list.
   }
  }
 } else {
  gecho Usage: /addhilite <word/filter>
 }
}

alias addignore /ignore $*

alias addnotify {
 if ([$0]) {
  notify $0
 } else {gecho Usage: /addnotify <nick1>}
}

alias showignore {
        /ignore
}

alias cnames {
 if ([$0]) {
  if (ischannel($0)) {
   if (onchannel($N $0)) {
    gtecho $0 $0: $_cnames($0)
   } else {gecho You are not on $0}
  } else {gecho $0 is not a valid channel;gecho Usage: /cnames [<#channel>]}
 } else {
  if (C) {
   gecho $C: $_cnames($C)
  } else {gecho You are not on any channels}
 }
}

alias _cnames {
 fe ($chanusers($0)) _cn.ch {
  if (ischanop($_cn.ch $0)) {
   @ _cn.no #= [ @$_cn.ch]
  } else {
   @ _cn.nv #= isvoice($_cn.ch $0) ? [ +$_cn.ch] : [ $_cn.ch]
  }
 }
 @ function_return = [${gc.chops}$_cn.no${cl}${gc.lamers}$_cn.nv$_cn.nl${cl}]
 purge _cn
}

alias creseti {/c -inst+mlk 40 resetting;/c +inst-mlk resetting}
alias creset {/c -nst+milk 40 resetting;/c +nst-milk resetting}
alias ctcpreply if ([$0]) {gecho ${gc.ctcpban}ctcp${cl}: ${gc.ctcp}$tolower($1) reply${cl} from ${gc.ctcpnk}$0${cl}: $2-}
alias ctcpreq if ([$0]) {gecho ${gc.ctcpban}ctcp${cl}: ${gc.ctcp}$tolower($2) request${cl} from ${gc.ctcpnk}$0${cl} ${gc.peren}\(${gc.ctcpnk}$userhost()${gc.peren}\)${cl} to ${gc.ctcpnk}$1${cl}}
alias cwait {wait -CMD #;wait -CMD $0-}

alias ctogg {
        if (![$0]) {
                foreach ch.flags _ch {
                        gecho Channel $decode($_ch)\ flags $ch.flags[$_ch]\
                }
                gecho Usage: /ctogg [#channel] flags
        } else {
                if (![$1]) {
                        if (ischannel($0)) {
                                @ _ch = [$%0]
                                gecho Channel $decode($_ch)\ flags $ch.flags[$_ch]\
                        } else {
                                if (C) {
                                        ctogg $C $0
                                } else {
                                        gecho No current channel in this window
                                        gecho Usage: /ctogg [#channel] flags
                                }
                        }
                } else {
                        @ _ch = ischannel($0) ? [$0] : [#$0]
                        @ _wasm = index(M $ch.flags[$%_ch]) >= 0
                        @ ch.flags[$%_ch] = _alter_flags($_valid_ctogg($1) $ch.flags[$%_ch])
                        if (!ch.flags[$%_ch]) {
                                //^assign -ch.flags[$%_ch]
                                gecho Channel $_ch\ removed
                                if (_wasm) {
                                        _recache_channels $_ch
                                }
                        } else {
                                gecho New flags for $_ch\ are '$ch.flags[$%_ch]'
                                if (_wasm != (index(M $ch.flags[$%_ch]) >= 0)) {
                                        _recache_channels $_ch
                                }
                        }
                }
        }
        //^assign -_ch
}

# cached /who
alias cwho {
        if ([$0] && onchannel($N $0)) {
                fe ($chanusers($0)) _n {
                        gecho ${ischanop($_n $0) ? [@] : isvoice($_n $0) ? [+] : [ ]}$[9]_n [$[8]nickdata($0 $_n 2)\] '$nick($_n)->host'
                }
                //^assign -_n
        } else {
                if ([$0]) {
                        gecho You are not on channel $0
                } else {
                        if (C) {
                                cwho $C
                        } else {
                                gecho You aren't on any channel in this window
                        }
                }
        }
}

# cached banlist
alias csb {
        if ([$0] && onchannel($N $0)) {
                @ _idx = 0
    @ _idx2 = 0
                fe ($chanmode($0 1)) _n {
      @ _idx++
                        gecho [$[2]_idx\] '$_n' $tdiff(${time() - word(${_idx2 * 3 + 2} $chanmode($0 2))}) old
                        gecho ${_idx2*3}
      @ _idx2++
                }
                if ([$_idx]==[0]) {gecho There Are No Bans in $0}
                //^assign -_n
                //^assign -_idx
    //^assign -_idx2
        } else {
                if ([$0]) {
                        gecho You are not on channel $0
                } else {
                        if (C) {
                                csb $C
                        } else {
                                gecho You are on any channel in this window
                        }
                }
        }
}


#csc written by mikh, enhanced by gemini
alias csc {
 if ([$0] && onchannel($N $0)) {
  @ _co.t = #chanusers($C)_co.u
  fe ($gz.chanops($0)) _co.tn {@ _co.co #= _co.co ? [ @$_co.tn] : [@$_co.tn]}
  fe ($gz.voices($0)) _co.tn {@ _co.v #= _co.v ? [ +$_co.tn] : [+$_co.tn]}
  @ _co.l = gz.lamers($0)
  gtbecho $0 ${gc.cscborder}�������������������������������������������������������������������Ŀ
  gtbecho $0 ${gc.cscborder}�${gc.topicchan}$[10]0${cl} ${gc.cscborder}�${cl} ${gc.chops}ChanOps${cl}: \$[-3]#_co.co\ ${gc.cscborder}�${cl} ${gc.lamers}Voiced${cl}: \$[-3]#_co.v\ ${gc.cscborder}�${cl} ${gc.lamers}Normal${cl}: \$[-3]#_co.l\ ${gc.cscborder}�${cl} Total: \$[-3]_co.t\ ${gc.cscborder}�
  gtbecho $0 ${gc.cscborder}�������������������������������������������������������������������Ĵ
  if (_co.co) {
  fe ($_co.co) _co.1 _co.2 _co.3 _co.4 _co.5 _co.6 {
   gtbecho $0 ${gc.cscborder}� ${gc.chops}$[10]_co.1 $[10]_co.2 $[10]_co.3 $[10]_co.4 $[10]_co.5 $[10]_co.6 ${gc.cscborder}�
  }
  }
  if (_co.v || _co.l) {
  fe ($_co.v $_co.l) _co.1 _co.2 _co.3 _co.4 _co.5 _co.6 {
   gtbecho $0 ${gc.cscborder}� ${gc.lamers}$[10]_co.1 $[10]_co.2 $[10]_co.3 $[10]_co.4 $[10]_co.5 $[10]_co.6 ${gc.cscborder}�
  }
  }
  gtbecho $0 ${gc.cscborder}���������������������������������������������������������������������
  purge _co
 } else {
  if ([$0]) {
   gecho You are not on channel $0
  } else {
   if (C) {
    csc $C
   } else {
    gecho No current channel in this window
   }
  }
 }
 purge _co
}

################################
# GemZ easy find Api functions #
################################



alias gz.bkgd {
 switch ($_bkgd) {
  (-) {@ _bkgd = [\\]}
  (\\) {@ _bkgd = [|]}
  (|) {@ _bkgd = [/]}
  (/) {@ _bkgd = [-]}
  (*) {@ _bkgd = [-]}
 }
 ^set status_notify  [$_bkgd][%F]
}

alias gz.bytestomegs {
 ^set float on
 @ _xm.m = [$0] / 1048576
 ^set float off
 @ function_return = mid(0 ${index(. $_xm.m) + 3} $_xm.m)
 purge _xm
}

alias gz.chanops {
 fe ($chanusers($0)) _h.o {
  if (ischanop($_h.o $0)) {@ _h.r #= _h.r ? [ $_h.o] : _h.o}
 }
 @ function_return = _h.r
 purge _h
}

alias chanops {@ function_return = gz.chanops($0)}

alias gz.chatstat {
# Input: <nick>
# return 0 if no chat
# rerurn 1 if chat is waiting
# return 2 if chat is active
# return 3 if chat is offered
 @ function_return = 0
 for (@ _d.i = 0, (_d.c = dccitem($_d.i)), @ _d.i++) {
  if ((word(0 $_d.c) == [CHAT]) && (word(1 $_d.c) == [$0])) {
   if (word(2 $_d.c) == [Active]) {@ function_return = 2
   } else if (word(2 $_d.c) == [Offered]) {@ function_return = 3
   } else {@ function_return = 1}
   //break
  }
 }
 purge _d
}

alias gz.chatwinstat {
# Input: <nick>
# return 0 if there isn't a window (regardless of dcc status)
# return 1 if there is a window (regardless of dcc status)
 @ function_return = 0
 for (@ _c.i = 1, (_c.w = winitem($_c.i)), @ _c.i++) {
  if (_c.w) {
   if (word(1 $_c.w) == [=$0_Queried]) {
    @ function_return = 1
    //break
   }
  }
 }
 purge _c
}

alias gz.rows {@ function_return = gz.dimension(row $*)}
alias gz.cols {@ function_return = gz.dimension(col $*)}
alias gz.dimension {
 switch ($0) {
  (col) {@ _cl.t = 8}
  (row) {@ _cl.t = 9}
 }
 switch ($2) {
  (r) {@ _cl.mw = 0}
  (n) {@ _cl.mw = 1}
  (c) {@ _cl.mw = 3}
  (q) {@ _cl.mw = 4}
  (*) {@ _cl.mw = 0}
 }
 @ function_return = 0
 for (@ _cl.i = 1, _cl.w = winitem($_cl.i), @ _cl.i++) {
  if (word($_cl.mw $_cl.w) == [$1]) {
   @ function_return = word($_cl.t $_cl.w)
   //break
  }
 }
 purge _cl
}

alias gz.exdcc {//dcc $0 $1 "$decode($2)"}
alias gz.finuh {@ function_return = is_ip($0@$1) ? [$0] ## [@] ## [$1] : fix.umask($0 $1)}

alias gz.finline {
 @ _w.i = [..................................................................]
 @ _w.0 = [$0]
 @ _w.1 = strip( $1)
 @ _w.2 = strip( $2)
 @ _w.s = _w.0 - (@_w.1 + @_w.2)
 if (_w.s < 1) {@ _w.s = 0}
 @ function_return = [$1] ## left($_w.s $_w.i) ## [$2]
 purge _w
}

alias gz.fixbytes {
 ^set float on
 if ([$0] < 1000) {@ function_return = [$0] ## [b]
 } else if ([$0] < 10240) {@ function_return = left(3 ${[$0] / 1024}) ## [k]
 } else if ([$0] < 102400) {@ function_return = left(2 ${[$0] / 1024}) ## [k]
 } else if ([$0] < 1022976) {@ function_return = left(3 ${[$0] / 1024}) ## [k]
 } else if ([$0] < 10485761) {@ function_return = left(3 ${[$0] / 1048576}) ##[M]
 } else if ([$0] < 104857600) {@ function_return = left(2 ${[$0] / 1048576}) ##[M]
 } else {@ function_return = left(3 ${[$0] / 1048576}) ##[M]}
 ^set float off
}


alias gz.fixnum {
 if (left(1 $0) == [-]) {@ _fn.neg = 1}
 fec ($0) _fn.rc {@ _fn.r = _fn.rc ## _fn.r}
 @ _fn.r = strip(- $_fn.r)
 fec ($_fn.r) _fn.sc {
  if (_fn.c == 3) {@ _fn.c = 0;@ _fn.scr = _fn.sc ## [,] ## _fn.scr} else {@ _fn.scr = _fn.sc ## _fn.scr}
  @ _fn.c++
 }
 if (_fn.neg) {@ _fn.scr = [-] ## _fn.scr}
 @ function_return = _fn.scr
 purge _fn
}

alias gz.fixpath {
 fec ($*) _fp.c {if ([$_fp.c]==[\\]) {if (_fp.r) {@ _fp.r #= [/]} else {@ _fp.r = [/]}} else {if (_fp.r) {@ _fp.r #= _fp.c} else {@ _fp.r = _fp.c}}}
 @ function_return = _fp.r
 purge _fp
}

alias gz.getdate {
 @ _d = stime($time()))
 @ function_return = [$gz.getmonth($word(1 $_d))]##[/]##[$word(2 $_d)]##[/]##[$right(2 $word(4 $_d))]
 ^assign -_d
}

alias gz.getmonth {
 switch ($0) {
  (Jan) {@ _m = 1}
  (Feb) {@ _m = 2}
  (Mar) {@ _m = 3}
  (Apr) {@ _m = 4}
  (May) {@ _m = 5}
  (Jun) {@ _m = 6}
  (Jul) {@ _m = 7}
  (Aug) {@ _m = 8}
  (Sep) {@ _m = 9}
  (Oct) {@ _m = 10}
  (Nov) {@ _m = 11}
  (Dec) {@ _m = 12}
 }
 @ function_return = _m
 ^assign -_m
}

alias gz.hasnicklist {
# takes in $T for window in question
 if (chanwindow($0)) {
  for (@ _is.i = 1, _is.w = winitem($_is.i), @ _is.i++) {
   if (word(0 $_is.w) == chanwindow($0)) {
    @ function_return = index(N $word(16 $_is.w)) >= 0 ? 1 : 0
    //break
 }}}
 purge _is
}

alias gz.isoper {@ function_return = O == status_oper ? 1 : gz.localoper}

alias gz.lamers {
 fe ($chanusers($0)) _h.o {
  if (!isvoice($_h.o $0) && !ischanop($_h.o $0)) {@ _h.r #= _h.r ? [ $_h.o] : _h.o}
 }
 @ function_return = _h.r
 purge _h
}

alias gz.nban {
 @ _nb.u = [$strip(~ $mid(0 $index(@ $1) $1))]
 @ _nb.u = [$right(8 $_nb.u)]
 @ _nb.h = [$strip(@ $mid($index(@ $1) $@1 $1))]
 if (is_ip($1)) {
  @ function_return = [*!*]## _nb.u ## [@] ## [$mid(0 $rindex(. $_nb.h) $_nb.h).*]
 } else {
  if (index(. $1) != rindex(. $1)) {@ function_return = [*!*$fix.umask($_nb.u $_nb.h)]} else {@ FUNCTION_RETURN = [*!*] ## _nb.u ## [@] ## _nb.h}
 }
 purge _nb
}

alias gz.playsnd {if (gz.sounds) {playfile $(snd.$0)}}
alias gz.randnick {
 @ _r.c = [abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_^\\\{\}\[\]`|0123456789-]
 @ _r.n = mid($rand(62) 1 $_r.c)
 for (@ _r.l = 1, _r.l < 9, @ _r.l++) {
  @ _r.n = _r.n ## mid($rand(62) 1 $_r.c)
 }
 @ function_return = _r.n
 purge _r
}
alias gz.reverse {
 fec ($*) _r.c {@ _r.r = _r.c ## _r.r}
 @ function_return = _r.r
 purge _r
}

alias gz.safechan {
 if (index(# $0) == [0]) {@ _sf.r = [$0]
 } else if (index(# $0) == [1] && ( (index(+ $0) == [0]) || (index(@ $0) == [0])) ) {
  @ _sf.r = mid(1 9999 $0)
 } else { @ _sf.r = [$0] }
 @ function_return = _sf.r
 purge _sf.r
}


alias gz.servergroups {
 for (@ _sg.i = 0, servername($_sg.i), @_sg.i++) {
  if (!match($servergroup($_sg.i) $_sg.r)) {
   @ _sg.r #= _sg.r ? [ ] ## servergroup($_sg.i) : servergroup($_sg.i)
  }
 }
 @ function_return = _sg.r
 purge _sg
}

alias gz.striplastslash {@ function_return = right(1 $*)==[/] ? left(${gz.strlen($*) - 1} $*) : [$*]}
alias gz.strlen {@ _t = [$*];@ function_return = @_t;^assign -_t}
alias gz.stripfw {
 if ([$0] == [$1]) {
  @ _wr.r = [$2-]
 } else {
  @ _wr.r = [$1-]
  @ _wr.n = 0
  fe ($1-) _wr.d {
   @ _wr.n++
   if (_wr.d == [$0]) {
    @ _wr.r = ref(1-${_wr.n - 1} $1-) ## [ ] ## ref(${_wr.n + 1}\-1000 $1-)
    //break
   }
  }
 }
 @ function_return = _wr.r
 purge _wr
}


alias gz.subaway {
 @ away = 1
 if ([$1]) {@ away.reason = [$1-]} else {@ away.reason = [$away[$rand($numaway)]]}
 //away -all $away.reason [Log:$logging] $gemz.str
 gecho Setting you away. Message logging is \$logging\
 switch ($0) {
  (-q) {gecho Quiet Away Reason: $away.reason}
  (-c) {if (C) {/me $str.away \($away.reason\) [Log:$logging] $gemz.str}}
  (-n) {
   if (mychannels()) {
    /tzmme $str.away \($away.reason\) [Log:$logging] $gemz.str
   }
  }
 }
}

alias gz.testoper {
#Idea/inspiration by Blackjac.  Implementation GemZ dependent.
 _gz.OperTestAddNick $0 $1
 userhost $0 -cmd if ([$1] == [+]) {
  @ gt.tn = _gz.OperTestDoNick($0)
  if (gt.tn) {
   gtecho $gt.tn ${gc.opernick}$0${cl} ${gc.peren}\(${gc.operuh}$3@$4${gc.peren}\)${cl} is a megamomo (IRCop).
  } else {
   gecho ${gc.opernick}$0${cl} ${gc.peren}\(${gc.operuh}$3@$4${gc.peren}\)${cl} is a megamomo (IRCop).
  }
 } else {@ _gz.OperTestDoNick($0)}
 ^assign -gt.tn
}

alias gz.voices {
 fe ($chanusers($0)) _h.o {
  if (isvoice($_h.o $0) && !ischanop($_h.o $0)) {@ _h.r #= _h.r ? [ $_h.o] : _h.o}
 }
 @ function_return = _h.r
 purge _h
}

alias quiet {
 if ([$0]) {
  if (ischanop($N $C)) {
   //mode $C -v $0
  }{gecho You are not a channel Operator}
 }{gecho Usage: //quiet <nick>}
}

alias tlm {t $last.mesg}
alias tlsm {t $lastmsmg}
alias tlsn {t $lastsnot}
alias tln {t $last.noti}


##action plugin module support for GemZ 2.5
##Format for the plugin file must be one line per //menuitem using
## the following keyword format
##"TITLE" TYPE TEXT GOES HERE
##   Type Keywords are: %ACT, %PUB, %KICK or %CMD
##   Other Keywords are %nk (nick) %pnk (possesive nick)
##     and %ch (current channel)
##   Comment lines must begin with a pound (#)
##To create a new column in the //submenu, put %new as the second word
##  followed by a Command keyword
##%kick must have %nk following it immediately.
##%cmd must be followed by a valid command... like /gimpkick

alias loadplug {
 @ pluginsloaded = 1
 if ([$0] && fexist($0)==[1]) {
#  makepopup
  //menuitem popup separator
  //submenu popup custact "Custom Actions"
  //submenu popup custkick "Custom Kicks"
  //submenu popup custcmd "Custom Command"
  @ _plugfile = open($0 R)
  while (!eof($_plugfile)) {
   @ _tmp.p = strip(; $read($_plugfile))
   @ _tmp.p = [$^(^)_tmp.p]
   if (left(1 $_tmp.p) == [#]) {
   } else if (word(1 $_tmp.p) == [%new]) {
    switch ($word(2 $_tmp.p)) {
     (%cmd) {//menuitem custcmd -b "$word(0 $_tmp.p)" custout $stripw(%new $_tmp.p)}
     (%kick) {//menuitem custkick -b "$word(0 $_tmp.p)" custout $stripw(%new $_tmp.p)}
     (%act) {//menuitem custact -b "$word(0 $_tmp.p)" custout $stripw(%new $_tmp.p)}
     (%pub) {//menuitem custact -b "$word(0 $_tmp.p)" custout $stripw(%new $_tmp.p)}
     (*) {}
    }
  } else {
    switch ($word(1 $_tmp.p)) {
     (%cmd) {//menuitem custcmd "$word(0 $_tmp.p)" custout $_tmp.p}
     (%kick) {//menuitem custkick "$word(0 $_tmp.p)" custout $_tmp.p}
     (%act) {//menuitem custact "$word(0 $_tmp.p)" custout $_tmp.p}
     (%pub) {//menuitem custact "$word(0 $_tmp.p)" custout $_tmp.p}
     (*) {}
    }
   }
  }
  @ close($_plugfile)
  ^assign -_tmp.p;^assign -_plugfile
 }{gecho No module specifed, or file does not exist}
}

alias custout {
 @ _nick = [$strip(@+=\'\" $lastclickline(4))]
 @ _chan = [$C]
 @ _input = [$1-]
 if ([$1]==[%act] || [$1]==[%pub] || [$1]==[%kick] || [$1]==[%cmd]) {
  fe ($_input) _word {
   if ([$_word]==[%act]) { @ _output = [$_output]##[/me]
   } else if ([$_word]==[%pub]) { @ _output = [$_output]##[/say]
   } else if ([$_word]==[%kick]) { @ _output = [$_output]##[/k]
   } else if ([$_word]==[%cmd]) {@ _cmd = [true]
   } else if ([$_word]==[%nk]) { @ _output = [$_output $_nick]
   } else if ([$_word]==[%nk,]) { @ _output = [$_output $_nick\,]
   } else if ([$_word]==[%nk.]) { @ _output = [$_output $_nick\.]
   } else if ([$_word]==[%nk!]) { @ _output = [$_output $_nick\!]
   } else if ([$_word]==[%pnk]) { @ _output = [$_output $_nick\'s]
   } else if ([$_word]==[%ch]) { @ _output = [$_output $_chan]
   } else if (_cmd) { @ _output = [$_output]##[$_word];^assign -_cmd
   } else @ _output = [$_output $strip(; $_word)]
  }
  eval $_output
  #gecho $_output
 } else {
  gecho $_input
  gecho ERROR in plugin (2nd word not %act, %pub, %kick, %cmd)
 }
 ^assign -_output;^assign -_chan;^assign -_input
}

alias saysend {
 .send $0-
 fe ($unparse($0)) _s {
  xecho -target $_s ${gc.pubbrac}<${gc.spub}$N${gc.pubbrac}>${cl} $1-
 }
 ^assign -_s
}

alias .send quote PRIVMSG $0 :$cntl2mirc(f0 $1-)

# Finish up

if (fexist($EXEDIR/menu.sav) != -1)
{
  //load $EXEDIR/menu.sav
}

^bind rclick parse_command rccheck
^bind nicklistrclick parse_command rccheck
^bind ldblclick parse_command ldccheck
^bind nicklistldblclick parse_command ldccheck
^bind statusrclick parse_command if (C) {chanmenu $C} else {if (T) {targetmenu $strip(= $T)}}

^makemenu