#!/usr/bin/env bash

# For generic functions.

ips ()
{
    about display all ip addresses for this host
    ifconfig | grep "inet " | awk '{ print $2 }'
}

down4me ()
{
    about checks whether a website is down for you, or everybody
    param 1: website url
    example '$ down4me http://www.google.com'
    curl -s "http://www.downforeveryoneorjustme.com/$1" | sed '/just you/!d;s/<[^>]*>//g'
}

myip ()
{
    about displays your ip address, as seen by the Internet
    res=$(curl -s checkip.dyndns.org | grep -Eo '[0-9\.]+')
    echo -e "Your public IP is: ${echo_bold_green} $res ${echo_normal}"
}


pickfrom ()
{
    about picks random line from file
    param 1: filename
    example '$ pickfrom /usr/share/dict/words'
    local file=$1
    [ -z "$file" ] && reference $FUNCNAME && return
    length=$(cat $file | wc -l)
    n=$(expr $RANDOM \* $length \/ 32768 + 1)
    head -n $n $file | tail -1
}

pass ()
{
    about generates random password from dictionary words
    param optional integer length
    param if unset, defaults to 4
    example '$ pass'
    example '$ pass 6'
    local i pass length=${1:-4}
    pass=$(echo $(for i in $(eval echo "{1..$length}"); do pickfrom /usr/share/dict/words; done))
    echo "With spaces (easier to memorize): $pass"
    echo "Without (use this as the pass): $(echo $pass | tr -d ' ')"
}

pmdown ()
{
    about preview markdown file in a browser
    param 1: markdown file
    example '$ pmdown README.md'
    if command -v markdown &>/dev/null
    then
      markdown $1 | browser
    else
      echo "You don't have a markdown command installed!"
    fi
}

mkcd ()
{
    about make a directory and cd into it
    param path to create
    example '$ mkcd foo'
    example '$ mkcd /tmp/img/photos/large'
    mkdir -p "$*"
    cd "$*"
}

lsgrep ()
{
    about search through directory contents with grep
    ls | grep "$*"
}


pman ()
{
    about view man documentation in Preview
    param 1: man page to view
    example '$ pman bash'
    man -t "${1}" | open -f -a $PREVIEW
}


pcurl ()
{
    about download file and Preview it
    param 1: download URL
    example '$ pcurl http://www.irs.gov/pub/irs-pdf/fw4.pdf'
    curl "${1}" | open -f -a $PREVIEW
}

pri ()
{
    about display information about Ruby classes, modules, or methods, in Preview
    param 1: Ruby method, module, or class
    example '$ pri Array'
    ri -T "${1}" | open -f -a $PREVIEW
}

quiet ()
{
	$* &> /dev/null &
}

banish-cookies ()
{
    about redirect .adobe and .macromedia files to /dev/null
	rm -r ~/.macromedia ~/.adobe
	ln -s /dev/null ~/.adobe
	ln -s /dev/null ~/.macromedia
}

usage ()
{
    about disk usage per directory, in Mac OS X and Linux
    param 1: directory name
    if [ $(uname) = "Darwin" ]; then
        if [ -n $1 ]; then
            du -hd $1
        else
            du -hd 1
        fi

    elif [ $(uname) = "Linux" ]; then
        if [ -n $1 ]; then
            du -h --max-depth=1 $1
        else
            du -h --max-depth=1
        fi
    fi
}

if [ ! -e $BASH_IT/plugins/enabled/todo.plugin.bash ]; then
# if user has installed todo plugin, skip this...
    t ()
    {
        about 'one thing todo'
        param 'if not set, display todo item'
        param '1: todo text'
        if [[ "$*" == "" ]] ; then
            cat ~/.t
        else
            echo "$*" > ~/.t
        fi
    }
fi

command_exists ()
{
    about checks for existence of a command
    param 1: command to check
    example '$ command_exists ls && echo exists'
    type "$1" &> /dev/null ;
}

plugins-help ()
{
    about list all plugins and functions defined by bash-it
    echo "bash-it Plugins Help-Message"
    echo

    set | grep "()" \
    | sed -e "/^_/d" | grep -v "BASH_ARGC=()" \
    | sed -e "/^\s/d" | grep -v "BASH_LINENO=()" \
    | grep -v "BASH_ARGV=()" \
    | grep -v "BASH_SOURCE=()" \
    | grep -v "DIRSTACK=()" \
    | grep -v "GROUPS=()" \
    | grep -v "BASH_CMDS=()" \
    | grep -v "BASH_ALIASES=()" \
    | grep -v "COMPREPLY=()" | sed -e "s/()//"
}

# useful for administrators and configs
buf ()
{
    about back up file with timestamp
    param filename
    local filename=$1
    local filetime=$(date +%Y%m%d_%H%M%S)
    cp ${filename} ${filename}_${filetime}
}
