Address PR #15 round 2: fail-closed admin guard, sync init, error reporting
1. /refresh now fail-closed: rejects all if ADMIN_CHAT_ID unset or invalid 2. Initial pair cache fill is synchronous — bot waits before accepting queries 3. /refresh reports failure when API fetch fails instead of always saying success Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -17,5 +17,5 @@ type IMarket interface {
|
||||
// Trading pair methods
|
||||
IsSpotPair(symbol string) bool
|
||||
IsFuturesPair(symbol string) bool
|
||||
RefreshTradingPairCache()
|
||||
RefreshTradingPairCache() error
|
||||
}
|
||||
|
||||
@@ -36,6 +36,9 @@ func NewMarketData() *MarketData {
|
||||
futuresClient: futures.NewClient("", ""),
|
||||
}
|
||||
|
||||
if err := ms.refreshTradingPairCache(); err != nil {
|
||||
log.Error().Err(err).Msg("Failed initial trading pair cache load")
|
||||
}
|
||||
go ms.pairCacheRefreshLoop()
|
||||
go ms.alphaCacheRefreshLoop()
|
||||
|
||||
|
||||
@@ -7,20 +7,20 @@ import (
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func (ms *MarketData) refreshTradingPairCache() {
|
||||
func (ms *MarketData) refreshTradingPairCache() error {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second)
|
||||
defer cancel()
|
||||
|
||||
spotInfo, err := ms.spotClient.NewExchangeInfoService().Do(ctx)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to fetch spot exchange info")
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
futuresInfo, err := ms.futuresClient.NewExchangeInfoService().Do(ctx)
|
||||
if err != nil {
|
||||
log.Error().Err(err).Msg("Failed to fetch futures exchange info")
|
||||
return
|
||||
return err
|
||||
}
|
||||
|
||||
ms.pairCacheMutex.Lock()
|
||||
@@ -45,6 +45,7 @@ func (ms *MarketData) refreshTradingPairCache() {
|
||||
Int("spot", len(ms.spotPairs)).
|
||||
Int("futures", len(ms.futuresPairs)).
|
||||
Msg("Trading pair cache refreshed")
|
||||
return nil
|
||||
}
|
||||
|
||||
func (ms *MarketData) pairCacheRefreshLoop() {
|
||||
@@ -68,6 +69,6 @@ func (ms *MarketData) IsFuturesPair(symbol string) bool {
|
||||
return ms.futuresPairs[symbol]
|
||||
}
|
||||
|
||||
func (ms *MarketData) RefreshTradingPairCache() {
|
||||
ms.refreshTradingPairCache()
|
||||
func (ms *MarketData) RefreshTradingPairCache() error {
|
||||
return ms.refreshTradingPairCache()
|
||||
}
|
||||
|
||||
@@ -23,10 +23,12 @@ func OnGetTopFundingFee(context telebot.Context) error {
|
||||
}
|
||||
|
||||
func OnRefreshPairCache(context telebot.Context) error {
|
||||
adminID, _ := strconv.ParseInt(os.Getenv(key.AdminChatID), 10, 64)
|
||||
if adminID != 0 && context.Sender().ID != adminID {
|
||||
adminID, err := strconv.ParseInt(os.Getenv(key.AdminChatID), 10, 64)
|
||||
if err != nil || adminID == 0 || context.Sender().ID != adminID {
|
||||
return nil
|
||||
}
|
||||
data.Market.RefreshTradingPairCache()
|
||||
if err := data.Market.RefreshTradingPairCache(); err != nil {
|
||||
return chat.ReplyMessage(context, "Failed to refresh trading pair cache")
|
||||
}
|
||||
return chat.ReplyMessage(context, "Trading pair cache refreshed")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user