21
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Slack でタコピー風に会話する

Last updated at Posted at 2022-03-10

「Slackでの文章が怖い」と言われたので何か改善できないかと思い、まずはメッセージを全てタコピー風にする CLI を Go で作成しました。(GitHub でスターをくれると喜びます。)

タコピー?

タコピーは「タコピーの原罪」という少年ジャンプ+で連載中の漫画のキャラクターです。「っピ」を語尾につけるのが特徴なので文章を柔らかく見せてくれるだろうと考え採用しました。

CLI の作成

Go 有名な形態素解析ライブラリ github.com/ikawaha/kagome を利用しています。

文章を加工するためにいくつか工夫しました。

  1. メッセージを正規化する
  2. 正規化済みの文字列に対して形態素解析を行う
  3. 置き換えたい内容が見つかれば置換する

置き換えたいものは map として定義しました。map のキーの型には構造体を利用しています。この構造体のフィールド全てが比較可能な型になるので、構造体も比較可能になります。(comparable)

比較可能にすることでこのように置き換え可能な内容かを簡単に判定することが可能です。

for _, token := range tokens {
	features := token.Features()
	key := key{
		pos:   features[0],
		affix: features[1],
		want:  token.Surface,
	}
	if replace, ok := dict[key]; ok {
		buf.WriteString(replace) // 置き換え
	} else {
		buf.WriteString(token.Surface)
	}
}

リポジトリでバージョンタグを切ると GitHub Action 上で goreleaser がいい感じに各プラットフォーム向けのバイナリを作成してくれます。とても便利です。また homebrew でインストールできるようにも調整してくれます。

$ brew update
$ brew install Code-Hex/tap/takopi
$ # argv
$ takopi "はい、いいえ、どうだ"
そうだっピ、ちがうっピ、どうだっピ!
$ # stdin
$ echo "はい、いいえ、どうだ" | takopi
そうだっピ、ちがうっピ、どうだっピ!

これで温かみのあるコミュニケーションができますね。

モバイル上での対応

外出先で Slack のメッセージが届いたので返信しようとしました。その時に気がついたのですが、なんとモバイル上で CLI を動かすことができません。(一旦なりすましました)そこで Wasm にしてブラウザでも実行できるようにしました。

Go のコードはとてもシンプルなものになりました。Go の Wasm は JavaScript のライブラリとして利用するというより、あくまで main プログラムを実行する形になっているようです。

package main

import (
	"syscall/js"

	"github.com/Code-Hex/takopi"
)

func takopilize(_ js.Value, args []js.Value) interface{} {
	if len(args) == 0 {
		return nil
	}
	return takopi.Do(args[0].String())
}

func registerCallbacks() {
	js.Global().Set("takopilize", js.FuncOf(takopilize))
}

func main() {
	c := make(chan struct{}, 0)
	registerCallbacks()
	println("takopi WebAssembly Ready")
	<-c
}

このコードをtakopi.wasm としてビルドします。そして $GOROOT から動かすために必要な js ファイルをコピーしてくる必要があるらしいです。とてもクセがありますね。Makefile の中身はこのようになりました。

.PHONY: all wasm wasm_exec
all: wasm wasm_exec
wasm:
	GOOS=js GOARCH=wasm go build -trimpath -o takopi.wasm ./cmd/wasm

wasm_exec:
	cp "$(shell go env GOROOT)/misc/wasm/wasm_exec.js" .

この辺りの知見は公式の wiki にまとめられてました。

HTML などは少し書く必要がありました。長くなるのでここに PR を置いておきます。

完成したものがこちらになります。

これでブラウザで動くようになったので外出先でも安心してタコピーになれます。

ユーザー体験の問題

ブラウザ上で動くようになりましたが、ロードが遅いのとブラウザアプリと Slack アプリを行き来するのが非常に大変でした。そこで Slack Slash Commands API を利用してコマンドを作成しました。

ezgif-5-d9fb2581f5.gif

ソースコードです。

バックエンドに Cloud Functions を利用しました。Cloud Functions はこのような bot を作るのに非常にコストが低い印象があります。素晴らしい時代ですね。料金プランもご参考ください。

Cloud Functions では Go 1.16 のランタイムが推奨になってます。注意しましょう。

これでどの環境でもタコピー風メッセージを簡単に投稿できるようになりました。

後日談

「個人的には ッピ 付いてると読むのに集中できないので素で書いて欲しい」とフィードバックをいただいたので、Slack に登録されている絵文字を多用する方向で頑張ることにしました🤩

21
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?