この記事は新歓ブログリレー2024の33日目の記事です。
こんにちは、21B SysAd班のmehm8128です。
新歓ブログリレーで書くことではないような気もするのですが(しかも昨日から入部期間開始)、今回はtraP部員の凍結・除名について書こうと思います。
traP部員の凍結・除名とは
traPでは半期ごとに2000円の部費を払ってもらい、部内サービスのサーバー代やイベント開催費などに使っていますが、その部費を払わないと部内サービスのアカウントが凍結され、traPから除名になります(部費を払ったタイミングで再度復帰できます)。また、卒業のタイミングでも同様にアカウントが凍結され、traPからは除名になります。除名についてはtraP サークル規約の第2章第9条に書かれています。部内のGiteaで管理していて公開していいか怪しいので、traPに入る人は見てみてください。
traPへの入部はこちらから↓
凍結したらどうなる?
traPの活動では、主にサークル内SNSであるtraQ上でやり取りをします。除名のタイミングで、このアカウントにもログインできないように凍結処理がされます。
traQのソースコードは公開されているのですが、具体的にはPATCH /users/:userID
にstate: 0
でリクエストを投げることでユーザーを凍結させることができます。この権限は一部の人だけが持っています(部費納入を確認して復活させる権限も同様で、state: 1
で復活させられます)。
https://github.com/traPtitech/traQ/blob/2676024440112f9418cef22b2a6c318c00cddbf8/router/v3/users.go#L363
実際の凍結操作はtraPortalという、traQとは別のサービスからUI上で操作をして凍結させるのですが、部員の個人情報を直接扱うサービスということもあってセキュリティ上の理由からprivateリポジトリで管理しているのでソースコードは見せることができません。気になる人がtraPに入部してSysAd班に所属してください。
ちなみに3月に既存部員の2024年前期分の部費納入期間があったのですが、僕は今回部費納入期間に一歩も外に出る機会がなかったので納入タイミングを逃し、1日だけ凍結されました。部費納入から凍結までに1週間あってその期間に外に出るタイミングがあったのでその期間に納入しました。
部費について
本編とは関係ないのですが、部費について。
traPでは半期2000円で、大学4年間だと16000円支払うことになりますが、これは安すぎると思います。半期だけ所属して講習会などを受けるだけでも16000円以上の価値があると思うので、積極的に活動できる人であれば部費以上のものを手に入れられることは保証できます。
SysAd班部員の卒業
SysAd班では部員が卒業する前に(引き継ぐものがある人は)引き継ぎ作業と、(持っている人は)権限の放棄をしないといけません。主なものを見ていきます。
卒業するタイミングでなくてもリーダーの引き継ぎはしてOKなので、僕は既に一部チームでは引き継ぎをしています。
GitHubのorganizationのteamのmaintainerを譲渡
プロジェクトごとにチームを作って、チームリーダーにはmaintainer権限が与えられています。これを引き継ぎ先部員に譲渡します。
例: traQチーム
https://github.com/orgs/traPtitech/teams/traq
codeownersの変更
部内wikiで各プロジェクトのリーダーがまとまっているページがあるので、そこの名前を書き換えます。他にtraQ上のグループのオーナーを譲渡したりもします。
devops botの権限譲渡
devops botというのは部内のサービスをデプロイするためのbotです。わざわざサーバーにSSHしてデプロイ等の作業をしなくても、botのコマンドを叩くだけで実行できるようになっています。
https://github.com/traPtitech/DevOpsBot
このコマンドを叩く権限を譲渡します。
例: Jomonチームでの引き継ぎPR
https://github.com/traPtitech/manifest/pull/428
DBへのアクセス権を譲渡
traPではAdminerというツールで部内サービスのDBをGUIで操作できるようになっています。この権限を渡します。
セキュリティ上の理由から部内のリポジトリで管理されているのでここで見せることはできませんが、Ansibleで管理されているのでその設定を書き換えればOKです。
nssから名前を削除
nssとは、Name Switch Serviceの略らしいです。このリポジトリで管理しています。
https://github.com/traPtitech/nss
traPで管理してるサーバーにSSHログインできるユーザーを管理していて、GitHubに登録している公開鍵でログイン可能になります。
こちらは完全に卒業するタイミングで名前を消すようにしています。
https://github.com/traPtitech/nss/pulls?q=is%3Apr+is%3Amerged
ちなみに、逆に名前を追加するときは細かい説明などはされずに「空気を読んでPRを出してください」を言われるので、空気を読んでPRを出します。
復活通知
部費を再度納入したら復活することができると書きましたが、今回から新たに、部員が復活したときにtraQ上のチャンネルに復活通知を送信する機能を実装したので、紹介します。
traQでは自由にbotを作成することができるのですが、traq-system-botというbotがシステム通知(ユーザーが参加した、チャンネルが作成された、スタンプが作成された等)を流しています。
今回はそのbotがユーザーの復活通知も流すように変更を加えました。
復活通知を飛ばすのは以下の流れになっています。
- traPortalから復活ボタンを押すと、traQのサーバーにリクエストが送信される
- traQのサーバーが復活処理を行う
- traQのサーバーが復活処理と同時に、
USER_ACTIVATED
イベントを発行して該当イベントを購読しているbotにイベントを飛ばす - botはイベントを受け取り、traQに復活通知メッセージを送信する
今回は3のイベント発行と、4のイベント受け取り&メッセージの送信、さらにbotがUSER_ACTIVATED
イベントを購読できるようにする機能を実装しました。
イベント発行
該当PRはこちらです。
過去に他のbotイベントを追加するPRを他の人が作っていたので、それを見ながら書きました。
特に大事なところはこの2箇所です。
https://github.com/traPtitech/traQ/pull/2266/files#diff-36faf031366cbebf285a481133e3bfb512c3bf02a663090089de442d1dc7c774R243-R244
https://github.com/traPtitech/traQ/pull/2266/files#diff-36faf031366cbebf285a481133e3bfb512c3bf02a663090089de442d1dc7c774R324-R330
送信されてきたリクエストが復活させるリクエスト(state: 1
)だったら、activate=true
になり、r.hub.Publish
でUSER_ACTIVATED
イベントを発行しています。
イベント購読
該当PRはこちら。
ユーザーが自由にbotを作成できるようにUIを提供しているのがbot-consoleです。Vue2+pug+Netlifyという、昔からあまり積極的にメンテされないまま残ってしまっている構成です(pugってtraP外で聞かないけど使われてるのかな)。
ここではUSER_ACTIVATED
イベントを購読できるようにしたのと、ドキュメントも追加しました。
イベントの受け取り&メッセージの送信
該当PRはこちら。
こちらはGoogle CloudのCloud Functionsで動いているらしく、bot-consoleと同じく今のtraPではあまり見ないような構成です。
1つ目のPRでは他のイベントを真似してUSER_ACTIVATED
イベントを受け取ってメッセージを送信する処理を書きました。本来ならmasterにマージすれば自動でデプロイが走るはずなのですが、デプロイに使っていたgoogle-github-actions/deploy-cloud-functionsで今は使えなくなっていた認証方法を使ってしまっていてデプロイが落ちてしまっていたので、2つ目のPRで修正しました。
おまけ
これで動くと思ったのですが、僕が復活したときに上手く動いていなくて、あれ、となったのですが、結局traq-system-botにUSER_ACTIVATED
イベントを購読させ忘れていただけでした。
購読の設定後、このように無事復活通知が流れました。
まとめ
3つのリポジトリに変更を加えることで無事復活通知を実装することができました。
最後に、traPへの入部はこちらから。
対面入部(及び相談会)は、水曜日は多分います(大学行くの水曜日だけなので)。
明日の担当はcpくんです、お楽しみにー