slack 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. #!/usr/bin/env bash
  2. export SLACK_CLI_TOKEN=$(pass personal/slack/token)
  3. bindir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. etcdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  5. if [ -n "${SLACK_CLI_TOKEN}" ]; then
  6. token="${SLACK_CLI_TOKEN}"
  7. elif [ -r "${etcdir}/.slack" ] && [ -f "${etcdir}/.slack" ]; then
  8. token=$(sed -n '1p' < "${etcdir}/.slack")
  9. elif [ -r "${HOME}/.slack" ] && [ -f "${HOME}/.slack" ]; then
  10. token=$(sed -n '1p' < "${HOME}/.slack")
  11. elif [ -r "/etc/.slack" ] && [ -f "/etc/.slack" ]; then
  12. token=$(sed -n '1p' < "/etc/.slack")
  13. fi
  14. # COMMAND PARSING #################################################################################
  15. cmd="${1}" ; shift
  16. # SUBCOMMAND PARSING ##############################################################################
  17. case "${cmd}${1}" in
  18. chatdelete|chatsend|chatupdate|\
  19. filedelete|fileinfo|filelist|fileupload|\
  20. presenceactive|presenceaway|\
  21. reminderadd|remindercomplete|reminderdelete|reminderinfo|reminderlist| \
  22. snoozeend|snoozeinfo|snoozestart|\
  23. statusclear|statusedit)
  24. sub=${1} ; shift
  25. ;;
  26. esac
  27. # PIPE FRIENDLINESS ###############################################################################
  28. case "${cmd}${sub}" in
  29. chatsend|chatupdate|fileupload) [ -p /dev/stdin ] && stdin=$(cat <&0) ;;
  30. esac
  31. # ARGUMENT AND OPTION PARSING #####################################################################
  32. while (( "$#" )); do
  33. case "${1}" in
  34. --actions=*) actions=${1/--actions=/''} ; shift ;;
  35. --actions*|-a*) actions=${2} ; shift ; shift ;;
  36. --author-icon=*) authoricon=${1/--author-icon=/''} ; shift ;;
  37. --author-icon*|-ai*) authoricon=${2} ; shift ; shift ;;
  38. --author-link=*) authorlink=${1/--author-link=/''} ; shift ;;
  39. --author-link*|-al*) titlelink=${2} ; shift ; shift ;;
  40. --author=*) author=${1/--author=/''} ; shift ;;
  41. --author*|-at*) author=${2} ; shift ; shift ;;
  42. --channels=*) channels=${1/--channels=/''} ; shift ;;
  43. --channels*|-chs*) channels=${2} ; shift ; shift ;;
  44. --channel=*) channel=${1/--channel=/''} ; shift ;;
  45. --channel*|-ch*) channel=${2} ; shift ; shift ;;
  46. --color=*) color=${1/--color=/''} ; shift ;;
  47. --color*|-cl*) color=${2} ; shift ; shift ;;
  48. --compact|-cp) compact='-c' ; shift ;;
  49. --comment=*) comment=${1/--comment=/''} ; shift ;;
  50. --comment*|-cm*) comment=${2} ; shift ; shift ;;
  51. --count=*) count=${1/--count=/''} ; shift ;;
  52. --count|-cn*) count=${2} ; shift ; shift ;;
  53. --emoji=*) emoji=${1/--emoji=/''} ; shift ;;
  54. --emoji*|-em*) emoji=${2} ; shift ; shift ;;
  55. --fields=*) fields=${1/--fields=/''} ; shift ;;
  56. --fields*|-flds*) fields=${2} ; shift ; shift ;;
  57. --filename=*) filename=${1/--filename=/''} ; shift ;;
  58. --filename*|-fln*) filename=${2} ; shift ; shift ;;
  59. --filetype=*) filetype=${1/--filetype=/''} ; shift ;;
  60. --filetype*|-flt*) filetype=${2} ; shift ; shift ;;
  61. --file=*) file=${1/--file=/''} ; shift ;;
  62. --file*|-fl*) file=${2} ; shift ; shift ;;
  63. --filter=*) filter=${1/--filter=/''} ; shift ;;
  64. --filter*|-f*) filter=${2} ; shift ; shift ;;
  65. --footer-icon=*) footericon=${1/--footer-icon=/''} ; shift ;;
  66. --footer-icon*|-fi*) footericon=${2} ; shift ; shift ;;
  67. --footer=*) footer=${1/--footer=/''} ; shift ;;
  68. --footer*|-ft*) footer=${2} ; shift ; shift ;;
  69. --image=*) image=${1/--image-url=/''} ; shift ;;
  70. --image*|-im*) image=${2} ; shift ; shift ;;
  71. --monochrome|-m) monochrome='-M' ; shift ;;
  72. --minutes=*) minutes=${1/--minutes=/''} ; shift ;;
  73. --minutes*|-mn*) minutes=${2} ; shift ; shift ;;
  74. --page=*) page=${1/--page=/''} ; shift ;;
  75. --page|-pg*) page=${2} ; shift ; shift ;;
  76. --pretext=*) pretext=${1/--pretext=/''} ; shift ;;
  77. --pretext*|-pt*) pretext=${2} ; shift ; shift ;;
  78. --reminder=*) reminder=${1/--reminder=/''} ; shift ;;
  79. --reminder|-rm*) reminder=${2} ; shift ; shift ;;
  80. --text=*) text=${1/--text=/''} ; shift ;;
  81. --text*|-tx*) text=${2} ; shift ; shift ;;
  82. --thumbnail=*) thumbnail=${1/--thumbnail=/''} ; shift ;;
  83. --thumbnail*|-th*) thumbnail=${2} ; shift ; shift ;;
  84. --time=*) _time=${1/--time=/''} ; shift ;;
  85. --time|-tm*) _time=${2} ; shift ; shift ;;
  86. --timestamp-from=*) timestampfrom=${1/--timestampfrom=/''} ; shift ;;
  87. --timestamp-from|-tf*) timestampfrom=${2} ; shift ; shift ;;
  88. --timestamp-to=*) timestampto=${1/--timestampto=/''} ; shift ;;
  89. --timestamp-to|-tt*) timestampto=${2} ; shift ; shift ;;
  90. --timestamp=*) timestamp=${1/--timestamp=/''} ; shift ;;
  91. --timestamp*|-ts*) timestamp=${2} ; shift ; shift ;;
  92. --title-link=*) titlelink=${1/--title-link=/''} ; shift ;;
  93. --title-link*|-tl*) titlelink=${2} ; shift ; shift ;;
  94. --title=*) title=${1/--title=/''} ; shift ;;
  95. --title*|-ti*) title=${2} ; shift ; shift ;;
  96. --token=*) token=${1/--token=/''} ; shift ;;
  97. --token|-tk*) token=${2} ; shift ; shift ;;
  98. --trace|-x) trace='set -x' ; shift ;;
  99. --types=*) types=${1/--types=/''} ; shift ;;
  100. --types|-ty*) types=${2} ; shift ; shift ;;
  101. --user=*) user=${1/--user=/''} ; shift ;;
  102. --user|-ur*) user=${2} ; shift ; shift ;;
  103. *)
  104. case "${cmd}${sub}" in
  105. chatdelete)
  106. [ -n "${1}" ] && [ -n "${timestamp}" ] && [ -z "${channel}" ] && channel=${1}
  107. [ -n "${1}" ] && [ -z "${timestamp}" ] && timestamp=${1}
  108. ;;
  109. chatsend)
  110. [ -n "${1}" ] && [ -n "${text}" ] && [ -z "${channel}" ] && channel=${1}
  111. [ -n "${1}" ] && [ -z "${text}" ] && text=${1}
  112. ;;
  113. chatupdate)
  114. [ -n "${1}" ] && [ -n "${text}" ] && [ -n "${timestamp}" ] && [ -z "${channel}" ] && channel=${1}
  115. [ -n "${1}" ] && [ -n "${text}" ] && [ -z "${timestamp}" ] && timestamp=${1}
  116. [ -n "${1}" ] && [ -z "${text}" ] && text=${1}
  117. ;;
  118. filedelete|fileinfo)
  119. [ -n "${1}" ] && [ -z "${file}" ] && file=${1}
  120. ;;
  121. fileupload)
  122. [ -n "${1}" ] && [ -n "${file}" ] && [ -z "${channels}" ] && channels=${1}
  123. [ -n "${1}" ] && [ -z "${file}" ] && file=${1}
  124. ;;
  125. snoozeinfo)
  126. [ -n "${1}" ] && [ -z "${user}" ] && user=${1}
  127. ;;
  128. snoozestart)
  129. [ -n "${1}" ] && [ -z "${minutes}" ] && minutes=${1}
  130. ;;
  131. statusedit)
  132. [ -n "${1}" ] && [ -n "${text}" ] && [ -z "${emoji}" ] && emoji=${1}
  133. [ -n "${1}" ] && [ -z "${text}" ] && text=${1}
  134. ;;
  135. reminderadd)
  136. [ -n "${1}" ] && [ -n "${text}" ] && [ -z "${_time}" ] && _time=${1}
  137. [ -n "${1}" ] && [ -z "${text}" ] && text=${1}
  138. ;;
  139. remindercomplete|reminderdelete|reminderinfo)
  140. [ -n "${1}" ] && [ -z "${reminder}" ] && reminder=${1}
  141. ;;
  142. esac
  143. shift
  144. ;;
  145. esac
  146. done
  147. # TRACING #########################################################################################
  148. ${trace}
  149. # ARGUMENT AND OPTION PROMPTING ###################################################################
  150. case "${cmd}${sub}" in
  151. chatdelete)
  152. [ -z "${channel}" ] && read -e -p 'Enter channel (e.g. #general): ' channel
  153. [ -z "${timestamp}" ] && read -e -p 'Enter timestamp (e.g. 1405894322.002768): ' timestamp
  154. ;;
  155. chatsend)
  156. [ -z "${channel}" ] && [ -z "${text}" ] && prompt='true'
  157. [ -n "${prompt}" ] && [ -z "${actions}" ] && read -e -p 'Enter actions (e.g. {"type": “button", "style": "primary", "text": "my text", "url": "http://example.com"}, ...): ' actions
  158. [ -n "${prompt}" ] && [ -z "${author}" ] && read -e -p 'Enter author name (e.g. slackbot): ' author
  159. [ -n "${prompt}" ] && [ -z "${authoricon}" ] && read -e -p 'Enter author icon (e.g. a URL): ' authoricon
  160. [ -n "${prompt}" ] && [ -z "${authorlink}" ] && read -e -p 'Enter author link (e.g. a URL): ' authorlink
  161. [ -z "${channel}" ] && read -e -p 'Enter channel (e.g. #general): ' channel
  162. [ -n "${prompt}" ] && [ -z "${color}" ] && read -e -p 'Enter color (e.g. good): ' color
  163. [ -n "${prompt}" ] && [ -z "${fields}" ] && read -e -p 'Enter fields (e.g. {"title": "My Field Title", "value": "My field value", "short": true}, ...): ' fields
  164. [ -n "${prompt}" ] && [ -z "${footer}" ] && read -e -p 'Enter footer (e.g. Hello footer!): ' footer
  165. [ -n "${prompt}" ] && [ -z "${footericon}" ] && read -e -p 'Enter footer icon (e.g. a URL): ' footericon
  166. [ -n "${prompt}" ] && [ -z "${image}" ] && read -e -p 'Enter image (e.g. a URL): ' image
  167. [ -n "${prompt}" ] && [ -z "${pretext}" ] && read -e -p 'Enter pretext (e.g. Hello pretext!): ' pretext
  168. [ -z "${text}" ] && read -e -p 'Enter text (e.g. Hello text!): ' text
  169. [ -n "${prompt}" ] && [ -z "${thumbnail}" ] && read -e -p 'Enter thumbnail (e.g. a URL): ' thumbnail
  170. [ -n "${prompt}" ] && [ -z "${_time}" ] && read -e -p 'Enter time (e.g. 123456789): ' _time
  171. [ -n "${prompt}" ] && [ -z "${title}" ] && read -e -p 'Enter title (e.g. Hello title!): ' title
  172. [ -n "${prompt}" ] && [ -z "${titlelink}" ] && read -e -p 'Enter title link (e.g. a URL): ' titlelink
  173. ;;
  174. chatupdate)
  175. [ -z "${text}" ] && read -e -p 'Enter text (e.g. Hello World!): ' text
  176. [ -z "${timestamp}" ] && read -e -p 'Enter timestamp (e.g. 1405894322.002768): ' timestamp
  177. [ -z "${channel}" ] && read -e -p 'Enter channel (e.g. #general): ' channel
  178. ;;
  179. filedelete)
  180. [ -z "${file}" ] && read -e -p 'Enter file (e.g. F2147483862): ' file
  181. ;;
  182. fileinfo)
  183. [ -z "${file}" ] && read -e -p 'Enter file (e.g. F2147483862): ' file
  184. ;;
  185. fileupload)
  186. [ -z "${file}" ] && read -e -p 'Enter file (e.g. file.log): ' file
  187. [ -z "${channels}" ] && read -e -p 'Enter channels (e.g. #general,C1234567890): ' channels
  188. ;;
  189. init)
  190. if [ -n "${SLACK_CLI_TOKEN}" ]; then
  191. _token="${SLACK_CLI_TOKEN}"
  192. elif [ -r "${etcdir}/.slack" ] && [ -f "${etcdir}/.slack" ]; then
  193. _token=$(sed -n '1p' < "${etcdir}/.slack")
  194. fi
  195. if [ -z "${token}" ] || [ "${token}" == "${_token}" ]; then
  196. read -e -p 'Enter Slack API token: ' token
  197. fi
  198. ;;
  199. reminderadd)
  200. [ -z "${text}" ] && read -e -p 'Enter text (e.g. lunch): ' text
  201. [ -z "${_time}" ] && read -e -p 'Enter time (e.g. 123456789): ' _time
  202. ;;
  203. remindercomplete|reminderdelete|reminderinfo)
  204. [ -z "${reminder}" ] && read -e -p 'Enter reminder (e.g. RmCT7QGVBF): ' reminder
  205. ;;
  206. snoozestart)
  207. [ -z "${minutes}" ] && read -e -p 'Enter minutes (e.g. 60): ' minutes
  208. ;;
  209. statusedit)
  210. [ -z "${text}" ] && read -e -p 'Enter text (e.g. lunch): ' text
  211. [ -z "${emoji}" ] && read -e -p 'Enter emoji (e.g. :hamburger:): ' emoji
  212. ;;
  213. esac
  214. # COMMAND UTILITY FUNCTIONS #######################################################################
  215. function attachify() {
  216. [ -n "${actions}" ] && local _actions=", \"actions\": [${actions}]"
  217. [ -n "${author}" ] && local _author=", \"author_name\": \"${author}\""
  218. [ -n "${authoricon}" ] && local _authoricon=", \"author_icon\": \"${authoricon}\""
  219. [ -n "${authorlink}" ] && local _authorlink=", \"author_link\": \"${authorlink}\""
  220. [ -n "${color}" ] && local _color=", \"color\": \"${color}\""
  221. [ -n "${fields}" ] && local _fields=", \"fields\": [${fields}]"
  222. [ -n "${footer}" ] && local _footer=", \"footer\": \"${footer}\""
  223. [ -n "${footericon}" ] && local _footericon=", \"footer_icon\": \"${footericon}\""
  224. [ -n "${image}" ] && local _image=", \"image_url\": \"${image}\""
  225. [ -n "${pretext}" ] && local _pretext=", \"pretext\": \"${pretext}\""
  226. [ -n "${thumbnail}" ] && local _thumbnail=", \"thumb_url\": \"${thumbnail}\""
  227. [ -n "${_time}" ] && local __time=", \"ts\": \"${_time}\""
  228. [ -n "${title}" ] && local _title=", \"title\": \"${title}\""
  229. [ -n "${titlelink}" ] && local _titlelink=", \"title_link\": \"${titlelink}\""
  230. local _json="${_author}${_authoricon}${_authorlink}${_color}${_footer}${_footericon}${_image}${_pretext}${_thumbnail}${__time}${_title}${_titlelink}${_fields}${_actions}"
  231. [ -z "${_json}" ] && local _attachments="[{\"mrkdwn_in\": [\"pretext\"], \"fallback\": \"${text}\", \"pretext\": \"${text}\"}]"
  232. [ -n "${_json}" ] && local _attachments="[{\"mrkdwn_in\": [\"fields\", \"pretext\", \"text\"], \"fallback\": \"${text}\", \"text\": \"${text}\"${_json}}]"
  233. echo "${_attachments}"
  234. }
  235. function jqify() {
  236. case "$(echo ${1} | jq -r '.ok')" in
  237. true) echo ${1} | jq -r ${compact} ${monochrome} "${filter:=.}" ;;
  238. *) echo ${1} | jq -r ${compact} ${monochrome} "${filter:=.}" ; return 1 ;;
  239. esac
  240. }
  241. function lchannel() {
  242. case "${channel}" in
  243. @*)
  244. local _user=$(\
  245. curl -s -X POST https://slack.com/api/users.list --data-urlencode "token=${token}" 2>&1 | \
  246. jq -r ".members | map(select(.name == \"${channel/@/}\" or .profile.display_name == \"${channel/@/}\")) | .[0].id")
  247. local _channel=$(\
  248. curl -s -X POST https://slack.com/api/im.list --data-urlencode "token=${token}" 2>&1 | \
  249. jq -r ".ims | map(select(.user == \"${_user}\")) | .[].id")
  250. echo ${_channel}
  251. ;;
  252. *) echo ${channel} ;;
  253. esac
  254. }
  255. function luser() {
  256. case "${user}" in
  257. @*)
  258. local _user=$(\
  259. curl -s -X POST https://slack.com/api/users.list --data-urlencode "token=${token}" 2>&1 | \
  260. jq -r ".members | map(select(.name == \"${user/@/}\" or .profile.display_name == \"${user/@/}\")) | .[0].id")
  261. echo ${_user}
  262. ;;
  263. *) echo ${user} ;;
  264. esac
  265. }
  266. # COMMAND FUNCTIONS ###############################################################################
  267. function chatdelete() {
  268. local msg=$(\
  269. curl -s -X POST https://slack.com/api/chat.delete \
  270. --data-urlencode "as_user=true" \
  271. --data-urlencode "channel=$(lchannel)" \
  272. --data-urlencode "ts=${timestamp}" \
  273. --data-urlencode "token=${token}")
  274. jqify "${msg}"
  275. }
  276. function chatsend() {
  277. [ -n "${stdin}" ] && [ -z "${text}" ] && text=\`\`\`${stdin//$'\n'/'\n'}\`\`\`
  278. local msg=$(\
  279. curl -s -X POST https://slack.com/api/chat.postMessage \
  280. --data-urlencode "as_user=true" \
  281. --data-urlencode "attachments=$(attachify)" \
  282. --data-urlencode "channel=$(lchannel)" \
  283. --data-urlencode "token=${token}")
  284. jqify "${msg}"
  285. }
  286. function chatupdate() {
  287. [ -n "${stdin}" ] && [ -z "${text}" ] && text=\`\`\`${stdin//$'\n'/'\n'}\`\`\`
  288. local msg=$(\
  289. curl -s -X POST https://slack.com/api/chat.update \
  290. --data-urlencode "as_user=true" \
  291. --data-urlencode "attachments=$(attachify)" \
  292. --data-urlencode "channel=$(lchannel)" \
  293. --data-urlencode "ts=${timestamp}" \
  294. --data-urlencode "token=${token}")
  295. jqify "${msg}"
  296. }
  297. function help() {
  298. local a=(${0//\// })
  299. local bin=${a[${#a[@]}-1]}
  300. echo 'Usage:'
  301. echo " ${bin} chat delete [<timestamp> [channel]]"
  302. echo ' [--channel|-ch <channel>] [--compact|-c] [--filter|-f <filter>] [--monochrome|-m]'
  303. echo ' [--timestamp|-ts <timestamp>] [--trace|-x]'
  304. echo
  305. echo " ${bin} chat send [<text> [channel]]"
  306. echo ' [--author|-at <author>] [--author-icon|-ai <author-icon-url>]'
  307. echo ' [--author-link|-al <author-link>] [--channel|-ch <channel>] [--color|-cl <color>]'
  308. echo ' [--compact|-cp] [--fields|-flds <fields>] [--filter|-f <filter>] [--footer|-ft <footer>]'
  309. echo ' [--footer-icon|-fi <footer-icon-url>] [--image|-im <image-url>] [--monochrome|-m]'
  310. echo ' [--pretext|-pt <pretext>] [--text|-tx <text>] [--thumbnail|-th <thumbnail-url>]'
  311. echo ' [--time|-tm <time>] [--title|-ti <title>] [--title-link|-tl <title-link>]'
  312. echo ' [--trace|-x]'
  313. echo
  314. echo " ${bin} chat update [<text> [<timestamp> [channel]]]"
  315. echo ' [--author|-at <author>] [--author-icon|-ai <author-icon-url>]'
  316. echo ' [--author-link|-al <author-link>] [--channel|-ch <channel>] [--color|-cl <color>]'
  317. echo ' [--compact|-cp] [--fields|flds <fields>] [--filter|-f <filter>] [--footer|-ft <footer>]'
  318. echo ' [--footer-icon|-fi <footer-icon-url>] [--image|-im <image-url>] [--monochrome|-m]'
  319. echo ' [--pretext|-pt <pretext>] [--text|-tx <text>] [--thumbnail|-th <thumbnail-url>]'
  320. echo ' [--time|-tm <time>] [--timestamp|-ts <timestamp>] [--title|-ti <title>]'
  321. echo ' [--title-link|-tl <title-link>] [--trace|-x]'
  322. echo
  323. echo " ${bin} init"
  324. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--token|-tk <token>]'
  325. echo ' [--trace|-x]'
  326. echo
  327. echo " ${bin} file delete [file]"
  328. echo ' [--compact|-c] [--file|-fl <file>] [--filter|-f <filter>] [--monochrome|-m]'
  329. echo ' [--trace|-x]'
  330. echo
  331. echo " ${bin} file info [file]"
  332. echo ' [--count|-cn <count>] [--compact|-c] [--file|-fl <file>] [--filter|-f <filter>]'
  333. echo ' [--monochrome|-m] [--page|-pg <page>] [--trace|-x]'
  334. echo
  335. echo " ${bin} file list"
  336. echo ' [--channel|-ch <channel>] [--count|-cn <count>] [--compact|-c] [--filter|-f <filter>]'
  337. echo ' [--monochrome|-m] [--page|-pg <page>] [--timestamp-from|-tf <timetamp>]'
  338. echo ' [--timestamp-to|-tt <timestamp>] [--trace|-x] [--types|-ty <types>]'
  339. echo ' [--user|-ur <user>]'
  340. echo
  341. echo " ${bin} file upload [<file> [channels]]"
  342. echo ' [--channels|-chs <channels>] [--comment|-cm <comment>] [--compact|-c]'
  343. echo ' [--file|fl <file>] [--filename|-fn <filename>] [--filetype|-ft <filetype>]'
  344. echo ' [--filter|-f <filter>] [--monochrome|-m] [--title|-ti <title>] [--trace|-x]'
  345. echo
  346. echo " ${bin} presence active"
  347. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  348. echo
  349. echo " ${bin} presence away"
  350. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  351. echo
  352. echo " ${bin} reminder add [<text> [time]]"
  353. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--text|tx <text>]'
  354. echo ' [--time|tm <time>] [--trace|-x] [--user|-ur <user>]'
  355. echo
  356. echo " ${bin} reminder complete [reminder]"
  357. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--reminder|rm <reminder>]'
  358. echo ' [--trace|-x]'
  359. echo
  360. echo " ${bin} reminder delete [reminder]"
  361. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--reminder|rm <reminder>]'
  362. echo ' [--trace|-x]'
  363. echo
  364. echo " ${bin} reminder info [reminder]"
  365. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--reminder|rm <reminder>]'
  366. echo ' [--trace|-x]'
  367. echo
  368. echo " ${bin} reminder list"
  369. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  370. echo
  371. echo " ${bin} snooze end"
  372. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  373. echo
  374. echo " ${bin} snooze info [user]"
  375. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  376. echo ' [--user|-ur <user>]'
  377. echo
  378. echo " ${bin} snooze start [minutes]"
  379. echo ' [--compact|-c] [--filter|-f <filter>] [--minutes|-mn <minutes>] [--monochrome|-m]'
  380. echo ' [--trace|-x]'
  381. echo
  382. echo " ${bin} status clear"
  383. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  384. echo
  385. echo " ${bin} status edit [<text> [<emoji>]]"
  386. echo ' [--compact|-c] [--filter|-f <filter>] [--monochrome|-m] [--trace|-x]'
  387. echo
  388. echo 'Configuration Commands:'
  389. echo ' init Initialize'
  390. echo
  391. echo 'Chat Commands:'
  392. echo ' chat delete Delete chat message'
  393. echo ' chat send Send chat message'
  394. echo ' chat update Update chat message'
  395. echo
  396. echo 'File Commands:'
  397. echo ' file delete Delete file'
  398. echo ' file info Info about file'
  399. echo ' file list List files'
  400. echo ' file upload Upload file'
  401. echo
  402. echo 'Presence Commands:'
  403. echo ' presence active Active presence'
  404. echo ' presence away Away presence'
  405. echo
  406. echo 'Reminder Commands:'
  407. echo ' reminder add Add reminder'
  408. echo ' reminder complete Complete reminder'
  409. echo ' reminder delete Delete reminder'
  410. echo ' reminder info Info about reminder'
  411. echo ' reminder list List reminders'
  412. echo
  413. echo 'Snooze Commands:'
  414. echo ' snooze end End snooze'
  415. echo ' snooze info Info about snooze'
  416. echo ' snooze start Start snooze'
  417. echo
  418. echo 'Status Commands:'
  419. echo ' status clear Clear status'
  420. echo ' status edit Edit status'
  421. echo
  422. echo 'More Information:'
  423. echo ' repo https://github.com/rockymadden/slack-cli'
  424. }
  425. function filedelete() {
  426. local msg=$(\
  427. curl -s -X POST https://slack.com/api/files.delete \
  428. --data-urlencode "file=${file}" \
  429. --data-urlencode "token=${token}")
  430. jqify "${msg}"
  431. }
  432. function fileinfo() {
  433. local msg=$(\
  434. curl -s -X POST https://slack.com/api/files.info \
  435. ${count:+ --data-urlencode "count=${count}"} \
  436. --data-urlencode "file=${file}" \
  437. ${page:+ --data-urlencode "page=${page}"} \
  438. --data-urlencode "token=${token}")
  439. jqify "${msg}"
  440. }
  441. function filelist() {
  442. local msg=$(\
  443. curl -s -X POST https://slack.com/api/files.list \
  444. ${channel:+ --data-urlencode "channel=${channel}"} \
  445. ${count:+ --data-urlencode "count=${count}"} \
  446. ${page:+ --data-urlencode "page=${page}"} \
  447. ${timestampfrom:+ --data-urlencode "ts_from=${timestampfrom}"} \
  448. ${timestampto:+ --data-urlencode "ts_to=${timestampto}"} \
  449. ${types:+ --data-urlencode "types=${types}"} \
  450. ${user:+ --data-urlencode "user=$(luser)"} \
  451. --data-urlencode "token=${token}")
  452. jqify "${msg}"
  453. }
  454. function fileupload() {
  455. [ -n "${stdin}" ] && [ -z "${file}" ] && file=${stdin}
  456. if [ -f "${file}" ]; then
  457. local _file=${file}
  458. case "${filename}" in
  459. '') local _filename=$(basename ${file}) ;;
  460. *) local _filename=${filename} ;;
  461. esac
  462. else
  463. local _content=${file}
  464. case "${filename}" in
  465. '') local _filename='stdin' ;;
  466. *) local _filename=${filename} ;;
  467. esac
  468. fi
  469. case "${_file}" in
  470. '')
  471. local msg=$(\
  472. curl -s -X POST https://slack.com/api/files.upload \
  473. ${channels:+ --data-urlencode "channels=${channels}"} \
  474. ${comment:+ --data-urlencode "initial_comment=${comment}"} \
  475. ${_content:+ --data-urlencode "content=${_content}"} \
  476. ${_filename:+ --data-urlencode "filename=${_filename}"} \
  477. ${filetype:+ --data-urlencode "filetype=${filetype}"} \
  478. ${title:+ --data-urlencode "title=${title}"} \
  479. --data-urlencode "token=${token}")
  480. ;;
  481. *)
  482. local msg=$(\
  483. curl -s -X POST https://slack.com/api/files.upload \
  484. ${channels:+ --form-string "channels=${channels}"} \
  485. ${comment:+ --form "initial_comment=${comment}"} \
  486. ${_file:+ --form "file=@${_file}"} \
  487. ${_filename:+ --form "filename=${_filename}"} \
  488. ${filetype:+ --form "filetype=${filetype}"} \
  489. ${title:+ --form "title=${title}"} \
  490. --form "token=${token}")
  491. ;;
  492. esac
  493. jqify "${msg}"
  494. }
  495. function init() {
  496. echo "${token}" > "${etcdir}/.slack"
  497. case "${?}" in
  498. 0) echo '{"ok": true}' | jq -r ${compact} ${monochrome} "${filter:=.}" ;;
  499. *)
  500. echo '{"ok": false, "error": "not_writable"}' |
  501. jq -r ${compact} ${monochrome} "${filter:=.}" ; return 1
  502. ;;
  503. esac
  504. }
  505. # Setting presence=auto + setActive works more consistently than just setActive.
  506. function presenceactive() {
  507. local msg0=$(\
  508. curl -s -X POST https://slack.com/api/users.setPresence \
  509. --data-urlencode "presence=auto" \
  510. --data-urlencode "token=${token}")
  511. local msg1=$(\
  512. curl -s -X POST https://slack.com/api/users.setActive \
  513. --data-urlencode "token=${token}")
  514. jqify "${msg0}" && jqify "${msg1}" >/dev/null 2>&1
  515. }
  516. function presenceaway() {
  517. local msg=$(\
  518. curl -s -X POST https://slack.com/api/users.setPresence \
  519. --data-urlencode "presence=away" \
  520. --data-urlencode "token=${token}")
  521. jqify "${msg}"
  522. }
  523. function reminderadd() {
  524. local msg=$(\
  525. curl -s -X POST https://slack.com/api/reminders.add \
  526. --data-urlencode "text=${text}" \
  527. --data-urlencode "time=${_time}" \
  528. ${user:+ --data-urlencode "user=$(luser)"} \
  529. --data-urlencode "token=${token}")
  530. jqify "${msg}"
  531. }
  532. function remindercomplete() {
  533. local msg=$(\
  534. curl -s -X POST https://slack.com/api/reminders.complete \
  535. --data-urlencode "reminder=${reminder}" \
  536. --data-urlencode "token=${token}")
  537. jqify "${msg}"
  538. }
  539. function reminderdelete() {
  540. local msg=$(\
  541. curl -s -X POST https://slack.com/api/reminders.delete \
  542. --data-urlencode "reminder=${reminder}" \
  543. --data-urlencode "token=${token}")
  544. jqify "${msg}"
  545. }
  546. function reminderinfo() {
  547. local msg=$(\
  548. curl -s -X POST https://slack.com/api/reminders.info \
  549. --data-urlencode "reminder=${reminder}" \
  550. --data-urlencode "token=${token}")
  551. jqify "${msg}"
  552. }
  553. function reminderlist() {
  554. local msg=$(\
  555. curl -s -X POST https://slack.com/api/reminders.list \
  556. --data-urlencode "token=${token}")
  557. jqify "${msg}"
  558. }
  559. function snoozeend() {
  560. local msg=$(\
  561. curl -s -X POST https://slack.com/api/dnd.endSnooze \
  562. --data-urlencode "token=${token}")
  563. jqify "${msg}"
  564. }
  565. function snoozeinfo() {
  566. local msg=$(\
  567. curl -s -X POST https://slack.com/api/dnd.info \
  568. ${user:+ --data-urlencode "user=$(luser)"} \
  569. --data-urlencode "token=${token}")
  570. jqify "${msg}"
  571. }
  572. function snoozestart() {
  573. local msg=$(\
  574. curl -s -X POST https://slack.com/api/dnd.setSnooze \
  575. --data-urlencode "num_minutes=${minutes}" \
  576. --data-urlencode "token=${token}")
  577. jqify "${msg}"
  578. }
  579. function statusclear() {
  580. local msg=$(\
  581. curl -s -X POST https://slack.com/api/users.profile.set \
  582. --data-urlencode 'profile={"status_text":"", "status_emoji":""}' \
  583. --data-urlencode "token=${token}")
  584. jqify "${msg}"
  585. }
  586. function statusedit() {
  587. local msg=$(\
  588. curl -s -X POST https://slack.com/api/users.profile.set \
  589. --data-urlencode "profile={\"status_text\":\"${text}\", \"status_emoji\":\"${emoji}\"}" \
  590. --data-urlencode "token=${token}")
  591. jqify "${msg}"
  592. }
  593. function version() {
  594. echo '0.18.0'
  595. }
  596. # COMMAND ROUTING #################################################################################
  597. case "${cmd}${sub}" in
  598. --help|-h) help ; exit 0 ;;
  599. --version|-v) version ; exit 0 ;;
  600. init) init ; exit $? ;;
  601. chatdelete|chatsend|chatupdate|\
  602. filedelete|fileinfo|filelist|fileupload|\
  603. presenceactive|presenceaway|\
  604. reminderadd|remindercomplete|reminderdelete|reminderinfo|reminderlist|\
  605. snoozeend|snoozeinfo|snoozestart|\
  606. statusclear|statusedit)
  607. if [ -z "${token}" ]; then
  608. echo '{"ok": false, "error": "not_inited"}' |
  609. jq -r ${compact} ${monochrome} "${filter:=.}" ; exit 1
  610. fi
  611. ${cmd}${sub} ; exit $?
  612. ;;
  613. *) help ; exit 1 ;;
  614. esac