Code Monkey home page Code Monkey logo

kani3camp / youtube-study-space Goto Github PK

View Code? Open in Web Editor NEW
122.0 6.0 16.0 427.26 MB

Youtube-based online study space! You can enter the study-room by using command in youtube live chat.

Home Page: https://www.youtube.com/channel/UCXuD2XmPTdpVy7zmwbFVZWg/live

License: MIT License

Go 20.93% TypeScript 78.44% Dockerfile 0.11% JavaScript 0.20% HTML 0.21% CSS 0.10%
youtube nextjs lambda api-gateway golang youtube-live youtube-livestream firestore

youtube-study-space's Introduction

youtube-study-space

FOSSA Status

Go to YouTube channel

Overview

Online study room, live-streamed on YouTube 24/7! The world's first fully automated online entry/exit system (unlimited number of people) using YouTube live streaming & chat (24 hours) .

Viewers can freely enter and exit the room by sending simple commands in the live chat.

Despite the title "study space," various tasks other than studying (walking, yoga, napping, meditation, games, cleaning, etc.) can be done here.

Please see docs/system-setup.md for the system setup instructions.

Licenses & Attributions

FOSSA Status

This project utilizes code from various open-source projects. The full list of software attributions is available in ATTRIBUTIONS.md.

youtube-study-space's People

Contributors

dependabot[bot] avatar fossabot avatar gangjun06 avatar kani3camp avatar shusann01116 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

youtube-study-space's Issues

discordに`!report`を通知する機能

今は!reportをすると管理人のLINEのみにメッセージが飛ぶが,Discord (オンライン作業部屋運営ギルド) のテキストチャンネルにも通知が飛ぶようにしたい.
さらには,LINEは廃止してDiscordだけにしたい.

`reset_daily_total_study_time` の高速化

システム登録者4万人を超え、毎日のreset_daily_total_study_timeの処理時間が15分に迫ってきた。
直ぐに何かしらの対応をしないと、Lambdaの実行時間である15分を超え、デイリー作業時間が正しくリセットされなくなるユーザーが出てくる。

考えている対応策

  • Lambdaの計算リソース割り当てを上げる(メモリ容量を上げる)
  • ひたすら全員分の時間を0で上書きするのではなくて、0じゃない人だけ0にリセットする。高速化できるのであれば、最有力。

[feature] 席移動・作業名変更機能

席移動

  • 入室中に!inしたら、席はそのままで、作業名が指定されていればそれを更新する。最大作業時間が指定されていても、退室処理がされないためそれは無効とする。
  • 入室中に!席番号したら、その席に座れるかを確認してから、退室処理をし、入室処理をする。この場合は、!outの手間を省くのと同じなので、作業名や最大作業時間はオプションが反映される。作業名が指定されていない場合は、もともとの作業名を引き継ぐ。

作業名変更

!change work=新作業名で退室することなく作業名を変更できる。入室中に限りこのコマンドは有効。

[monitor] 作業名と名前を,長さに応じて大きさを可変にする

現状ては,長い名前や作業名は枠に入り切らないと「テスト勉...」のように表示される.
一定値以上の幅になる名前や作業名はフォントサイズを小さくすることでできるだけ枠におさまるようにする.

canvas要素を使って横幅を予測する方法で考え中.

本番・開発ライブ配信の混同問題

本番配信用Botが、開発用配信に入ってくる問題が発生

開発用配信を止め、本番botを再起動することで本番配信のライブチャットに戻すことができた。
しかし、原因は不明。

可変無限ルーム 入室システム

混み具合によってルームの数が変わる。
人が増えるとルームが増え、ピークが過ぎるとルームが減っていく。

  • firestoreではルームという概念はなく、seats(座席のリスト)と、max_seats(最大座席数)のみを管理。
  • ルーム座席レイアウトはシステム(firestore + Bot)側では管理せず、monitorで管理。
  • monitorが定期的に座席数が妥当かどうか検証し、状況に応じて座席を増やす・減らすなどのリクエストをシステム(lambda)に投げる。lambdaはリクエストされた座席数をfirestoreのdirected_num_seatsに上書きする。botプログラムがそれを定期的に確認して、max_seatsdirected_num_seatsが違うと気づいたらそれに応じて退室処理などをして、max_seatsを更新する。
  • 入室人数的にルームを減らした方がいいとmonitorが判断したら、ルームを減らす。ただ、閉じたいルームにまだ人が残っている場合は、botプログラムがその人たちをできるだけ若い番号の席に移動させる。移動し終えて、閉じたいルーム内の座席に人がいないことを確認できたら、max_seatsを更新する。

ルームとレイアウトについて

  • 基本ルームと臨時ルームの2種類
  • 基本ルームはどれだけ人が少なくても必ず開放される固定ルーム
  • 臨時ルームは、基本ルームだけで人数がさばけないときに開放される一時的なルーム
  • monitorでは基本ルームおよび臨時ルームの座席レイアウトが用意されている。
  • 臨時ルームは無限に増えることができる。レイアウトは数種類を使いまわす。
  • レイアウトは背景画像を設定することで、ルーム独自の雰囲気を自由度高く表現できるようにしたい。

[system] ランク機能

注意:他人と競うための機能ではない

あくまで自分の努力の積み上げを認識しやすくするための機能。

  • 累計時間によって席の色を変える。
  • ランク表示はユーザーごとにオンオフできる。

ログを本格的に保存・集計

ログをFirestoreではないBigqueryなどの外部データベースに流すことで,Firestoreの容量が膨張するのを防ぎ,データの解析をしやすくする.
これに伴い,これまで保存してきた各ユーザーごとのhistoryというサブコレクションを廃止,データ削除をしたい.

保存項目

  • ライブチャットメッセージ

    • ライブチャットID
    • タイムスタンプ
    • メッセージID
    • ユーザーの表示名
    • ユーザーのチャンネルID
    • メッセージ本文
    • (スーパーチャット情報)
  • 行動ログ

    • 行動タイプ
      • 入室・退室・作業名変更・休憩・再開
    • タイムスタンプ
    • 席番号
    • ユーザーの表示名
    • ユーザーのチャンネルID
    • 席の色
    • 作業名
    • 席の自動退室時間(until)

以下は優先度が低いため見送り

  • コマンド実行ログ(全コマンド)

    • コマンドタイプ
    • オリジナルメッセージ
    • オリジナルメッセージのid
    • コマンド詳細(要検討)
    • 実行タイムスタンプ
    • 実行結果:成功したか(bool)
  • 入室状況(seats)

    • タイムスタンプ
    • 使用座席数
    • 全座席数
    • 対応座席レイアウトバージョン
    • seatsのjson文字列?
  • 座席レイアウト変更

  • 全ユーザーデータ

  • オペレーション (さすがに実装コストが高いので一旦見送り)

    • ユーザー情報(my設定や累計作業時間)の変更
    • 入退室処理
    • その他もろもろ

手順

クラウドのRDBサービスはコストがかかるため、以下の手順を採用。

  1. チャットを読み込んだらFirestoreに保存(1つのチャットメッセージにつき1個のドキュメント)
  2. 1日に1回Firestoreのチャット履歴データをCloud Storageにエクスポートする処理を行い、コピー元のFirestoreのデータはクリアする。
  3. BigQueryにバッチ読み込みでデータを保存する。これによりReDashで分析可能になる。そのため、ライブチャット以外の情報も含めると良いかも。

休憩モード機能

休憩コマンド

  • !break 時間(分)
  • !chill 時間(分)

など。時間(分)は任意オプション。

作業再開コマンド

  • !resume

また,画面右下のタイマーと同期して休憩できる機能(これ,割と大変?)

[guadian] detect stopping of the live chat bot

検出した場合、LINE通知だけでなくライブチャットにも連絡するようにする

検出方法

  1. Botは、ライブチャットを読み込むタイミングでfirestoreに最終アクセスタイムスタンプを記録する。(チャット読み込みは通常1秒もしくは2秒なので、かなり高頻度にはなるので、数回おきにすると、書き込みリクエストのコストを抑えられる)
  2. 1分おきに巡回するガーディアンプログラムが、Botが1分以上アクセスしていないことをfirestoreを読むことで検知し、LINEで通知する。3分以上反応がない場合は、ライブチャットにもBotが反応しない旨を伝える。
  3. firestoreの設定変数に「Botが反応しないことを検知したとして、通知するかしないか」を示すものを追加しておき、メンテナンス時にうるさくならないようにする。ただ、メンテナンス終わった時に通知を有効にするのを忘れるのがこわい。

[youtube] upgrade live chat commands

新しいバージョンで使えるようにしたいコマンド一覧です。

注意

コマンドやオプションはスペースで区切ってください。スペースは、半角でも全角でも構いません。

入室

!in

退室

!out

入室オプション

席番号を指定する

!席番号
席番号は半角数字で、0以上の整数であること。
例:

  • !4:4番の座席に座る
  • !10:10番の席に座る
  • !0:スタンディングルームで勉強する(席に座らない)

作業内容を表示する

ライブ配信動画内の席の自分の名前とともに、作業内容を表示します。
!in work=作業内容 もしくは!in w=作業内容
例:

  • !in work=数学
    ダメな例:
  • !inwork=数学:スペースで区切れていない
  • !in work=数学:スペースで区切ってしまっている

作業時間(分単位)を指定する

!in min=作業時間もしくは!in m=作業時間
作業内容の前でも後でもOK。
例:

  • !in min=25
  • !in min=120
  • !5 min=60 work=英語
  • !0 work=化学 min=30
  • !12 w=英語 m=20

その他のコマンド

累計作業時間を表示する

!info

累積作業時間・入室回数・個人設定を表示する

!info d

旧コマンド(まだ使えます)

入室

!in

退室

!out

入室オプション

席番号を指定

!席番号

作業内容

!in work-作業内容

作業時間

!in min-作業時間

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.