cloud-game/pkg/worker/cloudsave.go
2023-03-26 00:14:19 +03:00

56 lines
1.3 KiB
Go

package worker
import "os"
type CloudSaveRoom struct {
GamingRoom
storage CloudStorage // a cloud storage to store room state online
}
func WithCloudStorage(room GamingRoom, storage CloudStorage) *CloudSaveRoom {
cr := CloudSaveRoom{
GamingRoom: room,
storage: storage,
}
if err := cr.Download(); err != nil {
room.GetLog().Warn().Err(err).Msg("The room is not in the cloud")
}
return &cr
}
func (c *CloudSaveRoom) Download() error {
// saveOnlineRoomToLocal save online room to local.
// !Supports only one file of main save state.
data, err := c.storage.Load(c.GetId())
if err != nil {
return err
}
// Save the data fetched from a cloud provider to the local server
if data != nil {
if err := os.WriteFile(c.GetEmulator().GetHashPath(), data, 0644); err != nil {
return err
}
c.GetLog().Debug().Msg("Successfully downloaded cloud save")
}
return nil
}
func (c *CloudSaveRoom) HasSave() bool {
_, err := c.storage.Load(c.GetId())
if err == nil {
return true
}
return c.GamingRoom.HasSave()
}
func (c *CloudSaveRoom) SaveGame() error {
if err := c.GamingRoom.SaveGame(); err != nil {
return err
}
if err := c.storage.Save(c.GetId(), c.GetEmulator().GetHashPath()); err != nil {
return err
}
c.GetLog().Debug().Msg("Cloud save is successful")
return nil
}