(。ì _ í。) < この記事は 𝕂𝔸𝕐𝔸ℂ 𝔸𝕕𝕧𝕖𝕟𝕥 ℂ𝕒𝕝𝕖𝕟𝕕𝕒𝕣 𝟚𝟘𝟚𝟘 25日目の記事です
はじめに
どーも、こんにちは! 20年度新卒の色物枠のakipakaです、waiwai。 ぼくらの甲子園ポケットというソーシャルゲーム(通称:ぼくポケ)のサーバーサイドやっとります!!
備忘録として僕が新卒研修のときに作ったものについて書きたいと思います!
ところで僕は根がとても不真面目な人間なので、業務中にslackを眺めては無為に時間を過ごしサボっている訳ですが、入社1ヶ月と立たないうちにclubだのtimesだの余りにチャンネルに入り過ぎて手に負えないと言う自体に陥りました。
times 分報って何!?ってなった方にオススメの記事
https://giginc.co.jp/blog/news/slack-hunho
ひとまず原因を分析しながら小首を傾げて唸っていました。
なぜ追えないのか僕なりにその理由について考えてみました。
1. チャンネルの更新スピードが早すぎる、秒速5センチメートル位の更新頻度。 2. 一気に沢山のチャンネルに入りすぎた、人間関係を気にすると抜けられない豆腐メンタル。 3. 僕がわるいんじゃあない、みんなのtimesが面白過ぎるのだ。
結論:やっぱり1つのTLで見たいときに見ればいいtwitter最高なんだなぁ。
そこで一つの考えにたどり着く、slackをtwitterみたいに1つにまとめちゃえばいいぢぁん。
""破壊的な発想""
頭の中のジャニー喜多川が言う。「YOUやっちゃいなよ」
んで新卒研修のときに一緒に作りたいと言ってくれたmiyabin君とともに実装に取り組みました。主にakipakaがDB周りのAPI実装(akipakaAPI)を、miyabinがIO周りのAPI実装(miyabinAPI)に取り組みました。研修の1週間だけでなくちょいちょいプライベートでも取り組み、約1ヶ月弱で以下のようなものを実装することが出来ました。
概要
TimesLineという、連携されたtimesにあった投稿を同期して、1つのchannelに表示できるアプリケーションを作りました。アイコンなどは固有のuserのものになっていますが実際はbotが投稿しています。timeslineでは名前の横に投稿された元のtimes名が表示されます。>マークをクリックすると元のtimesでの投稿に飛ぶことが出来ます。
こんな感じ
技術構成
使った技術はこんな感じです。当時はあんまりDocker慣れしてなかったのでVM使ってローカルに立ててそれをherokuに乗っけてデプロイしました。PostgreSQLの設定に苦しめられた苦い思い出。SlackのAPIをゴリゴリ使い倒して作ってます。
DBの設計
めっちゃ簡素でslack上にはchannel同士を連携するrelationとpost,threadなどの投稿を同期するpost_relation、thread_relationから出来ています。それぞれがchannelの中にpostが、postの中にthreadがあるのでそれぞれ1:nの関係になっています。
機能
機能は大きく分けて3つあります
- channel同士を連携する機能
- 連携されたchannelの投稿を同期する機能
- 同期されたpostの中のthreadを同期する機能
またmessegeとpictureなどを投稿でき、それぞれにpost(投稿)、edit(編集)、delete(削除)の同期を実装しています。
timesをtimeslineへ連携する機能
#times ⇒ #timesline channel,
timesからtimeslineへの投稿
#times ⇒ #timesline post, thread,
timeslineからtimesへの投稿
timesline ⇒ #times thread,
投稿できる内容
messege, picture
投稿に対する処理
post, edit, delete
よく見るとtimesline ⇒ timesではthreadしか投稿できるようにしていないのですが、これは色んな人が入り混じってるtimeslineの投稿が自分のtimesに流れて来ないようにする為です。ただしthreadはpostに対してつくものなので、自分のtimesのpostと連携されたtimeslineのpostにthreadがついた場合にのみ元のtimesのpostにも投稿するという形をとっています。難しい事を言っている。
設計
機能が多いので3つだけ設計の詳細を説明したいと思います。
分岐部分
slackから受け取った情報を受け取り処理によって分岐させる部分の設計です。ここでchannel同士を連携するbotコマンドやpost,threadに対するpost,edit,deleteなどの処理を分岐しAPIに渡していきます。
timesからtimeslineへのpostの同期
連携されたtimesでpostの投稿が行われ発火が起こるとそれを分岐にかけて分別し、relation/searchのAPIにid渡します。そこで連携されているすべてのtimeslineのidを探し出し、それぞれにtimesline/throwに渡し投稿させていきます。その後でtimeslineの投稿されたpostのidを取得し、timesのpostとtimeslineのpostのidをDBに記述します。
timeslineからtimesへのthreadの同期
こちらはtimesからtimeslineのpostの同期と比較するとかなり複雑です。timeslineからtimesへのthreadの同期なので子→親→子のように同期していく必要があるからです。ここではtimeslineのidとtimeslineに投稿されたpostのidでtimesのidとpostのidを見つけだしtimesに投稿します。そして、元々投稿のあったtimesline以外のtimeslineにも同期させます。
連携されたtimeslineでthreadの投稿が行われ発火が起こるとそれを分岐にかけて分別し、post_relation/detectのAPIにid渡します。そこで連携されているtimesのidを探し出し、それぞれにtimes/throw_threadに渡し投稿させていきます。その後でtimeslineの投稿されたthreadのidを取得し、timesのthreadとtimeslineのthreadのidをDBに記述します。そのままpost_relation/syncを叩き「timesからtimeslineのpostの同期」と同じように他のtimeslineにもthreadを投稿していきます。
まとめ
使ってみて最高かよって感じ。いろんなチャンネルピコピコ光ってるけどぶっちゃけtimeslineだけ見てれば全部追えるし、入ってるtimesで話してる内容にもリンク機能で飛んでいけるのでwaiwai絡んでいけるし。すばらしみ。今回は実験的に作った感じでherokuのDBいっぱいになって使えなくなっちゃったけど、作り直してtimeslineライフ満喫してQOL上げてきたいです!
チーム開発においてだと、設計は僕が作りましたがSlackのAPIの調査などはmiyabinに任せきりだったので、上手く連携を取りながら分担して進められたかなと思います。実際今配属されているぼくポケの開発でも、ここまで役割分担を気にしなけれいけないことはそれほどないのでいい経験できたかな。そして何より、2人でこういう機能があったらいいねっていう機能のアイデアを出してそれいいねって言い合えるのがすごく楽しかった。一緒に作ってくれてmiyabinありがとう。感謝。