aboutsummaryrefslogtreecommitdiff
path: root/files/dmtool.bash
blob: 0d7116f97c419bd9e57ab9969a1e840f361bd32f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
# bash completion file for dmtool

# Modified from bash completion for password-store

_dmtool_complete_entries () {
	local prefix1="${HOME}/.dmtool/"
	prefix1="${prefix1%/}/"
        local prefix2="/usr/share/dmtool/"
	prefix2="${prefix2%/}/"
	local suffix=".json"
	local autoexpand=${1:-0}

	local IFS=$'\n'
	local items=($(compgen -f $prefix1$cur))
        items+=($(compgen -f $prefix2$cur))

	# Remember the value of the first item, to see if it is a directory. If
	# it is a directory, then don't add a space to the completion
	local firstitem=""
	# Use counter, can't use ${#items[@]} as we skip hidden directories
	local i=0 item

	for item in ${items[@]}; do
		[[ $item =~ /\.[^/]*$ ]] && continue

		# if there is a unique match, and it is a directory with one entry
		# autocomplete the subentry as well (recursively)
		if [[ ${#items[@]} -eq 1 && $autoexpand -eq 1 ]]; then
			while [[ -d $item ]]; do
				local subitems=($(compgen -f "$item/"))
				local filtereditems=( ) item2
				for item2 in "${subitems[@]}"; do
					[[ $item2 =~ /\.[^/]*$ ]] && continue
					filtereditems+=( "$item2" )
				done
				if [[ ${#filtereditems[@]} -eq 1 ]]; then
					item="${filtereditems[0]}"
				else
					break
				fi
			done
		fi

		# append / to directories
		[[ -d $item ]] && item="$item/"

		item="${item%$suffix}"
                local prefix1ed="${item#$prefix1}"
		COMPREPLY+=("${prefix1ed#$prefix2}")
		if [[ $i -eq 0 ]]; then
			firstitem=$item
		fi
		let i+=1
	done

	# The only time we want to add a space to the end is if there is only
	# one match, and it is not a directory
	if [[ $i -gt 1 || ( $i -eq 1 && -d $firstitem ) ]]; then
		compopt -o nospace
	fi
}

_dmtool_skills()
{
    echo -e "athletics\nacrobatics\nstealth\narcana\nhistory\ninvestigation\nnature\nreligion\ninsight\nmedicine\nperception\nsurvival\ndeception\nintimidation\nperformance\npersuasion\nsleight of hand\nanimal handling"
}

_dmtool_abilities()
{
    echo -e "str\ndex\ncon\nint\nwis\ncha"
}

_dmtool_dmgtypes()
{
    echo -e "slashing\npiercing\nbludgeoning\npoison\nacid\nfire\ncold\nradiant\nnecrotic\nlightning\nthunder\nforce\npsychic"
}

_dmtool_complete_skills_abilities()
{
    local IFS=$'\n'
    COMPREPLY+=($(compgen -W "$(_dmtool_skills)" -- ${cur}))
    COMPREPLY+=($(compgen -W "$(_dmtool_abilities)" -- ${cur}))
}

_dmtool()
{
    COMPREPLY=()
    local cur="${COMP_WORDS[COMP_CWORD]}"
    local commands="ls cp mkdir mv rm attacks roll attack damage heal save reset set edit add del spellcasting help git"
    if [[ $COMP_CWORD -gt 1 ]]; then
        local lastarg="${COMP_WORDS[$COMP_CWORD-1]}"
        case "${COMP_WORDS[1]}" in
            ls|mkdir|rm|reset)
                _dmtool_complete_entries
                ;;
            cp|mv|add)
                if [[ $COMP_CWORD -le 3 ]]; then
                    _dmtool_complete_entries
                fi
                ;;
            save)
                if [[ $COMP_CWORD -eq 2 ]]; then
                    local IFS=$'\n'
                    COMPREPLY+=($(compgen -W "$(_dmtool_abilities)" -- ${cur}))
                elif [[ "$lastarg" == "--type" ]]; then
                    local IFS=$'\n'
                    COMPREPLY+=($(compgen -W "$(_dmtool_dmgtypes)" -- ${cur}))
                elif [[ "$lastarg" == "--damage" ]]; then
                    :
                elif [[ $COMP_CWORD -eq 4 ]]; then
                    _dmtool_complete_entries
                elif [[ $COMP_CWORD -ge 5 ]]; then
                    COMPREPLY+=($(compgen -W "--magical -m --silvered -s --adamantine -a --damage --type --halves" -- ${cur}))
                    _dmtool_complete_entries
                fi
                ;;
            attacks|roll|attack|damage|heal|save|set|edit|del|spellcasting)
                if [[ $COMP_CWORD -le 2 ]]; then
                    _dmtool_complete_entries
                else
                    case "${COMP_WORDS[1]}" in
                        roll)
                            _dmtool_complete_skills_abilities
                            # Add in attacks
                            local IFS=$'\n'
                            opts="$(${COMP_WORDS[0]} attacks ${COMP_WORDS[2]})"
                            COMPREPLY+=($(compgen -W "$opts" -- ${cur}))
                            ;;
                        attack)
                            COMPREPLY+=($(compgen -W "-1 -2" -- ${cur}))
                            if [[ $COMP_CWORD -eq 3 ]]; then
                                local IFS=$'\n'
                                opts="$(${COMP_WORDS[0]} attacks ${COMP_WORDS[2]})"
                                COMPREPLY+=($(compgen -W "$opts" -- ${cur}))
                            elif [[ $COMP_CWORD -eq 4 ]]; then
                                _dmtool_complete_entries
                            fi
                            ;;
                        damage)
                            COMPREPLY+=($(compgen -W "--magical -m --silvered -s --adamantine -a" -- ${cur}))
                            if [[ $COMP_CWORD -eq 4 ]]; then
                                local IFS=$'\n'
                                COMPREPLY+=($(compgen -W "$(_dmtool_dmgtypes)" -- ${cur}))
                            fi
                            ;;
                        set)
                            if [[ $COMP_CWORD -eq 3 ]]; then
                                _dmtool_complete_skills_abilities
                                COMPREPLY+=($(compgen -W "proficiency name" -- ${cur}))
                            elif [[ $COMP_CWORD -eq 4 ]]; then
                                local skills="$(_dmtool_skills)"
                                if [[ "$skills" =~ "$lastarg" ]]; then
                                    COMPREPLY+=($(compgen -W "none proficient expert" -- ${cur}))
                                fi
                            fi
                            ;;
                        del)
                            #TODO: Add items and spells
                            _dmtool_complete_skills_abilities
                            ;;
                        spellcasting)
                            if [[ $COMP_CWORD -eq 3 ]]; then
                                COMPREPLY+=($(compgen -W "init ability level" -- ${cur}))
                            elif [[ "$lastarg" == "ability" ]]; then
                                local IFS=$'\n'
                                COMPREPLY+=($(compgen -W "$(_dmtool_abilities)" -- ${cur}))
                            fi
                            ;;
                    esac
                fi
                ;;
        esac
    else
        COMPREPLY+=($(compgen -W "${commands}" -- ${cur}))
        _dmtool_complete_entries 1
    fi
}

complete -o filenames -F _dmtool dmtool