ishikota / PokerServer

Poker server using websocket
1 stars 0 forks source link

DealerをActiveModelとして保存し,channel間で共有できるようにする #6

Closed ishikota closed 8 years ago

ishikota commented 8 years ago

問題

clientからdeclare_actionしたら,@dealer_hashにdealerが入ってなくてエラーが起きる

原因

RoomChannelがSingletonじゃないことに気づかなかった, つまり,

  1. RoomChannelのinstance変数@delegateはplayer1のものとplayer2のもので違う
  2. @delegateがinstance変数として持っている@dealer_hashも当然,player1のchannelとplayer2のchannelで別のものになる.
  3. player2が揃った時点でゲームを開始する場合,player2のchannelのdelegateのdealer_hashにdealerが入るが,player1のには入らない
  4. player1がdeclare_actionでdealer_hashからdealerをとりたいが,player2のhashにしかないのでムリ

    やること

よって,Dealerを複数channelで共有するため,active_record objectとして保存する必要がある

ishikota commented 8 years ago

方針

  1. Dealerの持つ状態を1箇所(ActiveRecord)にまとめて保存できるようにする
    • 保存したものは,key=room_idで, channel_delegateから取り出す
  2. Dealerに状態を渡すことで,Dealerの状態を復元できるようにする.
    • Dealerの状態 => round_count, table, street, ...
  3. Dealerのpublicなメソッドは,保存しておきたい状態を返す設計にする.
    • 呼び出しもと(channel_delegate)は,返ってきた状態をActiveRecordに保存
ishikota commented 8 years ago

Dealerの持つ状態

ishikota commented 8 years ago

Dealerの状態保存までの手順

  1. Config, TableはMarshallでdump
  2. round_count, round_manager { street, agree_num, next_player }のprimitiveを取り出す
  3. 1,2をhashに入れた後,jsonにしてdbに保存
  4. json -> hash -> hashから取り出してsetup
    • Dealer.load(config, table, round_count, street, agree_num, next_player)
    • RoundManager.load(street, agree_num, next_player)