こんにちは! KEPPLE CREATORS LAB でエンジニアをやっている小須田です。
株式会社ケップルは社内チャットツールに Slack を使用しています。
ある人が言いました「社内スタンプで会社の雰囲気が分かる」と。ケップルでは日々業務をしていく中で、リアクションをする時やメッセージ内にスタンプを使用しています。たかがスタンプ、されどスタンプ。そんなスタンプに込められた思いや熱意を紐解くため、社内のスタンプ使用ランキングを調査してみました。
早速ですが結果発表!
好きなものは先に食べる派なので、先に結果を発表します。
集計期間: ~ 2024/03/05 の全期間
集計対象: 私の所属しているプライベートチャンネル、パブリックチャンネル
ランキング: テキストスタンプ、リアクションスタンプ 使用回数の多い上位30個
勘の良い方はお察しかと思いますが、私の所属しているプライベートチャンネルが対象で、重複して所属してるメンバーのバイアスがかなりかかっています。なので、実質 KEPPLE CREATORS LAB メンバーの使用ランキングになります。
テキストスタンプランキングとリアクションスタンプランキングのそれぞれを発表します。
テキストスタンプランキング
お願いする系の土下座や祈りが多数ランクインしていました。みなさん土下座しすぎですね。2位にランクインした 🌝は、LAB のメンバーが無駄に多用するのでこのような結果になったと言えますね 🌝
🌝はWindowsの環境だと、怖い印象になるので他の事業部では評判が良くないとの噂もあります。
リアクションスタンプランキング
サムアップ👍が堂々の1位でした!サムダウン👎ではなくてホッとしています。素敵, イイね などのお褒めの言葉はリアクションで使いやすいようです。テキストだと少し恥ずかしいけど、スタンプだと伝えられますね 👏
ハートやかわいいのスタンプは #working-parent という働くパパとママのチャンネルがあるのですが、可愛いお子さんの写真へのリアクションでランクインした模様です。
調査方法
たまには、エンジニアらしいことも書こうかなと思ったので、実装の方針や手順を書きます。掻い摘んで説明するので参考程度に。
それでは、Slackのスタンプ使用ランキングを調査していきましょう。Slack には Web API があるのでこちらの API を使って調査していきます。conversations.history でメッセージの履歴とそのメッセージにリアクションしたスタンプが取れるようです。
方針
今回調査対象とするのは、私の所属するプライベートチャンネルとパブリックチャンネルです。加えて、少し大変になってしまうことからスレッド内に投稿されたメッセージは対象外としてます。
スタンプはメッセージ内に表示されるものと、メッセージにリアクションしたものがあるので、この二つの軸で集計していきます。
手順
Slack App を作成して Web API を使用するための Token を発行する
conversations.list の API を使用してチャンネルの一覧を取得する
conversations.history の API を使用してメッセージを取得する
取得したメッセージの JSON からスタンプを集計する
ざっとこんな感じでやりました。部分的に説明を補足します。
Slack App を作成して Web API を使用するための Token を発行する
Slack のドキュメント 通りに進めていけば Token は発行できるかと思います。conversations.list と conversations.history を使用するので以下を Scope に追加します。User Token Scopes にも追加するのをお忘れなく。
Web API を使用して必要な情報を取得する
適当な Node の環境を手元で作って、@slack/web-api のパッケージを使ってAPI叩いていきます。
import { WebClient } from "@slack/web-api";
const webApiToken = process.env.SLACK_WEB_API_TOKEN;
const web = new WebClient(webApiToken);
// チャンネル一覧を取得
const channels = web.conversations.list();
// チャンネル内のメッセージ一覧を取得
const histories = web.conversations.history({ channel: "CHANNEL_ID" });
上記のように叩けます。SLACK_WEB_API_TOKEN には User Token の方を指定してください。
取得した JSON から集計する
conversations.history のドキュメントでAPIテストできるので、実際に帰ってきたデータを元に調査します。メッセージ内のスタンプは、blocks の中に テキストとスタンプのデータが入っているのでこの中から取得できます。リアクションのスタンプは、reactions の中に入っているのでこれを取得します。
サンプルコードをここに供養します。
import { MessageElement } from "@slack/web-api/dist/types/response/ConversationsHistoryResponse";
function countTextEmoji(conversation: MessageElement) {
const blocks = conversation.blocks ?? [];
for (const block of blocks) {
const filteredElement =
block.elements?.filter((e) => e.type === "rich_text_section") ?? [];
const emojiElements = filteredElement.flatMap((e) => {
return e.elements?.filter((f) => f.type === ("emoji" as string)) ?? [];
}) as { type: string; name: string; unicode?: string }[];
for (const emojiElement of emojiElements) {
// カウントする処理
}
}
}
function countReactionEmoji(conversation: MessageElement) {
const reactions = conversation.reactions ?? [];
for (const reaction of reactions) {
if (reaction.name && reaction.count) {
// カウントする処理
}
}
}
あんなスタンプ、こんなスタンプ
スタンプ使用ランキングで弊社の雰囲気が分かったか分からなかったかはさておき、今後は 🌝の使用率を下げることに尽力していきたいと私は思いました。スタンプ警察として社内の風紀を正します。
余談ですが、執筆時点で 2628 個のカスタムスタンプがあるのですが、そのうちの 1189 個が一人の社員よって生み出されました。とんでもない人がいたものですね 🌚 本来やるべき業務を行ってほしいです。
せっかくなので、社内のカスタムスタンプをいくつか紹介して終わりたいと思います。
※ 私の勝手な解釈が多分に含まれています。
全力シリーズ
弊社の代表が一番パワフルなので、もちろん全力神先もあります。
パワフルさを感じたらとりあえず使います。
余白シリーズ
余白とは心の余裕、余白とは人生。みなさん余白を意識しましょう。
「結局余白」スタンプの文字の余白が気になりますが、それもまた余白です。
tashikani シリーズ
さあ、本物の「たしかに」はどれでしょう?
全て、:tashikani_: から始まる文字で登録されているので、作った人は相当意地が悪いです。
実は、この中に「たしかに」はありません。残念でした。
気になったスタンプ
筋肉界隈のスタンプもたくさんあるのですが、私は筋トレが嫌いなのでここでは言及しません。「闇の取引」が作成された経緯が気になりますね。個人的に「手の込んだガラクタ」が一番好きです。使ったことないですけど。
スタンプは用法用量を守って正しくお使いください。