Diarkis Room を使ってロックの仕組みを実装する

Room のプロパティを利用したロック機能の実装方法

Room のプロパティを使って Room のロックを実装することができます。以下の例は、Room  のロックを解除しようとするクライアントが、 Room に設定されているパスコードを持っていることを要求する Room のロックメカニズムの実装です。同様の仕組みは、Room モジュールの SetJoinCondition メソッドでも実装できます。

: 以下の例では、リモート Room のプロパティ更新手法を使用しています。

addr, err := room.GetRoomNodeAddress(roomID)
if err != nil {
// Handle error
return
}
req := make(map[string]interface{})
req["roomID"] = roomID
// passcode comes from the client
req["passcode"] = passcode
// mesh.SendRequest is a inter-pod communication function
mesh.SendRequest(cmdID, addr, req, func(err error, res map[string]interface{}) {
if err != nil {
// Handle error
return
}
// The room has been unlocked successfully
})
 
mesh.Command(cmdID, unlockRoom)

func unlockRoom(req map[string]interface{}) (error, map[string]interface{}) {
roomID := mesh.GetString(req, "roomID")
passcode := mesh.GetString(req, "passcode")
var err error
_ := room.UpdateProperties(roomID, func(props map[string]interface{}) bool {
if _, ok := props["unlocked"].(bool); !ok {
        // the room is already unlocked
        err := errors.New("Room already unlocked")
        return false
            }
            if _, ok := props["passcode"].(string); !ok {
              // missing pass code...
              err := errors.New("Room is missing passcode...")
              return false
            }
            if passcode != props["passcode"].(string) {
              // pass code the client has does not match
              err := errors.New("Pass code does not match")
              return false
            }
            // pass code the client has matches
            props["unlocked"] = true
            return true
    })
    res := make(map[string]interface{})
    return res, err
}