Commit 341b179f authored by Adrian Sutton's avatar Adrian Sutton

op-challenger: Extract method to fetch or create game player.

parent 18728390
...@@ -10,11 +10,11 @@ import ( ...@@ -10,11 +10,11 @@ import (
"github.com/ethereum/go-ethereum/log" "github.com/ethereum/go-ethereum/log"
) )
type gameAgent interface { type gamePlayer interface {
ProgressGame(ctx context.Context) bool ProgressGame(ctx context.Context) bool
} }
type gameCreator func(address common.Address) (gameAgent, error) type playerCreator func(address common.Address) (gamePlayer, error)
type blockNumberFetcher func(ctx context.Context) (uint64, error) type blockNumberFetcher func(ctx context.Context) (uint64, error)
// gameSource loads information about the games available to play // gameSource loads information about the games available to play
...@@ -25,20 +25,20 @@ type gameSource interface { ...@@ -25,20 +25,20 @@ type gameSource interface {
type gameMonitor struct { type gameMonitor struct {
logger log.Logger logger log.Logger
source gameSource source gameSource
createGame gameCreator createPlayer playerCreator
fetchBlockNumber blockNumberFetcher fetchBlockNumber blockNumberFetcher
allowedGame common.Address allowedGame common.Address
games map[common.Address]gameAgent players map[common.Address]gamePlayer
} }
func newGameMonitor(logger log.Logger, fetchBlockNumber blockNumberFetcher, allowedGame common.Address, source gameSource, createGame gameCreator) *gameMonitor { func newGameMonitor(logger log.Logger, fetchBlockNumber blockNumberFetcher, allowedGame common.Address, source gameSource, createGame playerCreator) *gameMonitor {
return &gameMonitor{ return &gameMonitor{
logger: logger, logger: logger,
source: source, source: source,
createGame: createGame, createPlayer: createGame,
fetchBlockNumber: fetchBlockNumber, fetchBlockNumber: fetchBlockNumber,
allowedGame: allowedGame, allowedGame: allowedGame,
games: make(map[common.Address]gameAgent), players: make(map[common.Address]gamePlayer),
} }
} }
...@@ -56,25 +56,26 @@ func (m *gameMonitor) progressGames(ctx context.Context) error { ...@@ -56,25 +56,26 @@ func (m *gameMonitor) progressGames(ctx context.Context) error {
m.logger.Debug("Skipping game not on allow list", "game", game.Proxy) m.logger.Debug("Skipping game not on allow list", "game", game.Proxy)
continue continue
} }
if err := m.progressGame(ctx, game); err != nil { player, err := m.fetchOrCreateGamePlayer(game)
if err != nil {
m.logger.Error("Error while progressing game", "game", game.Proxy, "err", err) m.logger.Error("Error while progressing game", "game", game.Proxy, "err", err)
continue
} }
player.ProgressGame(ctx)
} }
return nil return nil
} }
func (m *gameMonitor) progressGame(ctx context.Context, gameData FaultDisputeGame) error { func (m *gameMonitor) fetchOrCreateGamePlayer(gameData FaultDisputeGame) (gamePlayer, error) {
game, ok := m.games[gameData.Proxy] if player, ok := m.players[gameData.Proxy]; ok {
if !ok { return player, nil
newGame, err := m.createGame(gameData.Proxy)
if err != nil {
return fmt.Errorf("failed to progress game %v: %w", gameData.Proxy, err)
}
m.games[gameData.Proxy] = newGame
game = newGame
} }
game.ProgressGame(ctx) player, err := m.createPlayer(gameData.Proxy)
return nil if err != nil {
return nil, fmt.Errorf("failed to create game player %v: %w", gameData.Proxy, err)
}
m.players[gameData.Proxy] = player
return player, nil
} }
func (m *gameMonitor) MonitorGames(ctx context.Context) error { func (m *gameMonitor) MonitorGames(ctx context.Context) error {
......
...@@ -114,7 +114,7 @@ type createdGames struct { ...@@ -114,7 +114,7 @@ type createdGames struct {
created map[common.Address]*stubGame created map[common.Address]*stubGame
} }
func (c *createdGames) CreateGame(addr common.Address) (gameAgent, error) { func (c *createdGames) CreateGame(addr common.Address) (gamePlayer, error) {
if _, exists := c.created[addr]; exists { if _, exists := c.created[addr]; exists {
c.t.Fatalf("game %v already exists", addr) c.t.Fatalf("game %v already exists", addr)
} }
......
...@@ -46,7 +46,7 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se ...@@ -46,7 +46,7 @@ func NewService(ctx context.Context, logger log.Logger, cfg *config.Config) (*se
} }
loader := NewGameLoader(factory) loader := NewGameLoader(factory)
monitor := newGameMonitor(logger, client.BlockNumber, cfg.GameAddress, loader, func(addr common.Address) (gameAgent, error) { monitor := newGameMonitor(logger, client.BlockNumber, cfg.GameAddress, loader, func(addr common.Address) (gamePlayer, error) {
return NewGamePlayer(ctx, logger, cfg, addr, txMgr, client) return NewGamePlayer(ctx, logger, cfg, addr, txMgr, client)
}) })
return &service{ return &service{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment