Slack の新機能 Status

CLI から操作したいよね.ということで,簡単なシェルスクリプトを書いてみました.

Shell script からステータスを簡単アップデート

ステータス機能の詳細は,以下の Slack の blog に書いてありました. Set your status in Slack - A new way to let your teammates know what you're up to

でも GUI から変更するの面倒ですよね.末尾のようなスクリプトを ame という名前で path の通ったところに置いて,

ame :office: "I'm at office!"

などとすると,Slack の status が変わります.

Slack の API token は ~/.config/ame/config.sh に置いておきます.

DEFAULT_TEAM="yourteam"

TOKEN_YOURTEAM="xoxp-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxx"
TOKEN_ANOTHERTEAM="xoxp-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxx"

あなたの token は,Legacy tokens | Slack から取れます.に書いてあります.

以下 ame スクリプトです. gist も置きました: Set your status in Slack with CLI

#!/bin/bash

################################################################
## Usage

usage() {
  echo "ame [-c CONFIG_FILE] [-t TEAM] ICON TEXT"
  echo "  -c Set config file name."
  echo "  -t Set Slack team name."
  echo "examples:"
  echo "  ame :office: \"I'm at office\""
  echo "  ame :house:  \"I'm home\""
} >&2

print_error() {
  printf "Error: $@\n"
} >&2

################################################################
## Update Slack Status

update_slack_status () {
  local token="$1"
  local emoji="$2"
  local stext="$3"

  local response=$(curl -s -S -X POST \
       -d "token=$token" \
       --data-urlencode "profile={\"status_text\": \"$stext\", \"status_emoji\": \"$emoji\"}" \
       https://slack.com/api/users.profile.set \
       | sed -n 's/{"ok":false,"error":"\([^"]*\)".*/\1/p')

  echo "$response" | tr '_' ' '
}

################################################################
## Parse option

OPT_CONF="$HOME/.config/ame/config.sh"

while getopts "c:dt:" flag
do
  case $flag in
    # getopts sets '?' to flag on error.
    \?|h) OPT_ERROR=1
          ;;
    c)    OPT_CONF="$OPTARG"
          ;;
    d)    OPT_DEBUG="true"
          ;;
    t)    OPT_TEAM="$OPTARG"
          ;;
  esac
done
shift $(( $OPTIND - 1 ))

# unknown option check
if [ "$OPT_ERROR" = 1 -o $# -ne 2 ]; then
  usage
  exit -1
fi

################################################################
## Read Config
#
# config.sh Example:
#
# DEFAULT_TEAM="yourteam"
# TOKEN_YOURTEAM="xoxp-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxx"
# TOKEN_ANOTERTEAM="xoxp-xxxxxxxxxx-xxxxxxxxxx-xxxxxxxxxx-xxxxxx"
#

if [ -f "$OPT_CONF" ]; then
  source "$OPT_CONF"
else
  print_error "config $OPT_CONF not found."
  exit -1
fi

################################################################
## Set Slack API Token

if [ -z "$OPT_TEAM" ]; then
  OPT_TEAM="$DEFAULT_TEAM"
fi

TOKEN_NAME=TOKEN_$(echo "$OPT_TEAM" | tr a-z A-Z)
TOKEN=${!TOKEN_NAME}

if [ -z "$TOKEN" ]; then
  print_error "No API Token found for $OPT_TEAM in $OPT_CONF."
  exit -1
fi

################################################################
## Main

if [ -n "$OPT_DEBUG" ]; then
  echo "update_slack_status \"$TOKEN\" \"$1\" \"$2\""
  exit 0
fi

error_message=$(update_slack_status "$TOKEN" "$1" "$2")

if [ -n "$error_message" ]; then
  print_error "$error_message."
  exit 1
fi

exit 0

Skack は,お手軽にこういうことができるからいいですね. 僕は,センサから取得した自分の状態を Status に自動で反映させています.

Enjoy!