diff --git a/cmd/discord/run.go b/cmd/discord/run.go index b1276d29..45858c90 100644 --- a/cmd/discord/run.go +++ b/cmd/discord/run.go @@ -17,7 +17,7 @@ import ( func runCommand(parentCmd *cobra.Command) { run := &cobra.Command{ Use: "run", - Short: "Runs a mainnet instance of Pagu", + Short: "Runs an instance of Pagu", } parentCmd.AddCommand(run) @@ -37,7 +37,7 @@ func runCommand(parentCmd *cobra.Command) { botEngine.RegisterAllCommands() botEngine.Start() - discordBot, err := discord.NewDiscordBot(botEngine, configs.DiscordBot.Token, configs.DiscordBot) + discordBot, err := discord.NewDiscordBot(botEngine, configs.DiscordBot, configs.BotName) pCmd.ExitOnError(cmd, err) err = discordBot.Start() diff --git a/config/config.go b/config/config.go index ab3e9d14..cf5dfde9 100644 --- a/config/config.go +++ b/config/config.go @@ -9,19 +9,19 @@ import ( ) type Config struct { - Network string `yaml:"network"` - NetworkNodes []string `yaml:"network_nodes"` - LocalNode string `yaml:"local_node"` - Database Database `yaml:"database"` - AuthIDs []string `yaml:"auth_ids"` - DiscordBot DiscordBot `yaml:"discord"` - GRPC GRPC `yaml:"grpc"` - Wallet Wallet `yaml:"main_net_wallet"` - TestNetWallet Wallet `yaml:"test_net_wallet"` - Logger Logger `yaml:"logger"` - HTTP HTTP `yaml:"http"` - Phoenix PhoenixNetwork `yaml:"phoenix"` - Telegram Telegram `yaml:"telegram"` + BotName string `yaml:"bot_name"` + Network string `yaml:"network"` + NetworkNodes []string `yaml:"network_nodes"` + LocalNode string `yaml:"local_node"` + Database Database `yaml:"database"` + AuthIDs []string `yaml:"auth_ids"` + GRPC GRPC `yaml:"grpc"` + Wallet Wallet `yaml:"wallet"` + Logger Logger `yaml:"logger"` + HTTP HTTP `yaml:"http"` + Phoenix PhoenixNetwork `yaml:"phoenix"` + DiscordBot DiscordBot `yaml:"discord"` + Telegram Telegram `yaml:"telegram"` } type Database struct { @@ -50,8 +50,7 @@ type HTTP struct { } type PhoenixNetwork struct { - NetworkNodes []string `yaml:"network_nodes"` - FaucetAmount uint `yaml:"faucet_amount"` + FaucetAmount uint `yaml:"faucet_amount"` } type Logger struct { @@ -101,18 +100,7 @@ func (cfg *Config) BasicCheck() error { } } - if cfg.TestNetWallet.Enable { - if cfg.TestNetWallet.Address == "" { - return fmt.Errorf("config: basic check error: TESTNET_WALLET_ADDRESS dose not set") - } - - // Check if the WalletPath exists. - if !util.PathExists(cfg.TestNetWallet.Path) { - return fmt.Errorf("config: basic check error: TESTNET_WALLET_PATH does not exist: %s", cfg.TestNetWallet.Path) - } - } - - if len(cfg.NetworkNodes) == 0 || len(cfg.Phoenix.NetworkNodes) == 0 { + if len(cfg.NetworkNodes) == 0 { return fmt.Errorf("config: basic check error: NETWORK_NODES is not set or incorrect") } diff --git a/config/config_test.go b/config/config_test.go index 162650bb..06f94931 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -30,9 +30,7 @@ func TestBasicCheck(t *testing.T) { Token: "MTEabc123", GuildID: "123456789", }, - Phoenix: PhoenixNetwork{ - NetworkNodes: []string{""}, - }, + Phoenix: PhoenixNetwork{}, }, wantErr: false, }, diff --git a/config/global.go b/config/global.go index 4268ec3e..be85c409 100644 --- a/config/global.go +++ b/config/global.go @@ -4,4 +4,8 @@ const ( PriceCacheKey = "PriceCacheKey" ) -var HelpCommandTemplate string = `{{range .}}{{end}}
{{ .Name }}{{ .Desc }}
` +const ( + BotNamePaguMainnet = "Pagu-Mainnet" + BotNamePaguTestnet = "Pagu-Testnet" + BotNamePaguModerator = "Pagu-Moderator" +) diff --git a/internal/engine/command/calculator/calculator.go b/internal/engine/command/calculator/calculator.go index 082c63c1..0eff9c39 100644 --- a/internal/engine/command/calculator/calculator.go +++ b/internal/engine/command/calculator/calculator.go @@ -17,9 +17,7 @@ type Calculator struct { clientMgr *client.Mgr } -func NewCalculator( - clientMgr *client.Mgr, -) Calculator { +func NewCalculator(clientMgr *client.Mgr) Calculator { return Calculator{ clientMgr: clientMgr, } @@ -71,6 +69,7 @@ func (bc *Calculator) GetCommand() command.Command { AppIDs: entity.AllAppIDs(), SubCommands: make([]command.Command, 0), Handler: nil, + TargetFlag: command.TargetMaskMain, } cmdBlockchain.AddSubCommand(subCmdCalcReward) diff --git a/internal/engine/command/command.go b/internal/engine/command/command.go index 465ee0bb..721b016f 100644 --- a/internal/engine/command/command.go +++ b/internal/engine/command/command.go @@ -7,6 +7,14 @@ import ( "github.com/pagu-project/Pagu/internal/entity" ) +var ( + TargetMaskMain = 1 + TargetMaskTest = 2 + TargetMaskModerator = 4 + + TargetMaskAll = TargetMaskMain | TargetMaskTest | TargetMaskModerator +) + type Args struct { Name string Desc string @@ -27,6 +35,7 @@ type Command struct { Middlewares []MiddlewareFunc Handler HandlerFunc User *entity.User + TargetFlag int } type CommandResult struct { diff --git a/internal/engine/command/market/market.go b/internal/engine/command/market/market.go index b4588cde..1772ed8b 100644 --- a/internal/engine/command/market/market.go +++ b/internal/engine/command/market/market.go @@ -44,6 +44,7 @@ func (m *Market) GetCommand() command.Command { AppIDs: entity.AllAppIDs(), SubCommands: make([]command.Command, 0), Handler: nil, + TargetFlag: command.TargetMaskMain, } cmdMarket.AddSubCommand(subCmdPrice) diff --git a/internal/engine/command/network/network.go b/internal/engine/command/network/network.go index 59cdd741..70f7a882 100644 --- a/internal/engine/command/network/network.go +++ b/internal/engine/command/network/network.go @@ -22,9 +22,7 @@ type Network struct { clientMgr *client.Mgr } -func NewNetwork(ctx context.Context, - clientMgr *client.Mgr, -) Network { +func NewNetwork(ctx context.Context, clientMgr *client.Mgr) Network { return Network{ ctx: ctx, clientMgr: clientMgr, @@ -106,6 +104,7 @@ func (n *Network) GetCommand() command.Command { AppIDs: entity.AllAppIDs(), SubCommands: make([]command.Command, 0), Handler: nil, + TargetFlag: command.TargetMaskAll, } cmdNetwork.AddSubCommand(subCmdHealth) diff --git a/internal/engine/command/network/status.go b/internal/engine/command/network/status.go index c1674048..f857c4b2 100644 --- a/internal/engine/command/network/status.go +++ b/internal/engine/command/network/status.go @@ -7,18 +7,18 @@ import ( utils2 "github.com/pagu-project/Pagu/pkg/utils" ) -func (be *Network) networkStatusHandler(cmd command.Command, _ entity.AppID, _ string, _ ...string) command.CommandResult { - netInfo, err := be.clientMgr.GetNetworkInfo() +func (n *Network) networkStatusHandler(cmd command.Command, _ entity.AppID, _ string, _ ...string) command.CommandResult { + netInfo, err := n.clientMgr.GetNetworkInfo() if err != nil { return cmd.ErrorResult(err) } - chainInfo, err := be.clientMgr.GetBlockchainInfo() + chainInfo, err := n.clientMgr.GetBlockchainInfo() if err != nil { return cmd.ErrorResult(err) } - cs, err := be.clientMgr.GetCirculatingSupply() + cs, err := n.clientMgr.GetCirculatingSupply() if err != nil { cs = 0 } diff --git a/internal/engine/command/phoenix/phoenix.go b/internal/engine/command/phoenix/phoenix.go index cc4333f5..f9ecbe2e 100644 --- a/internal/engine/command/phoenix/phoenix.go +++ b/internal/engine/command/phoenix/phoenix.go @@ -27,8 +27,7 @@ type Phoenix struct { faucetAmount uint } -func NewPhoenix(wallet *wallet.Wallet, faucetAmount uint, clientMgr *client.Mgr, db repository.DB, -) Phoenix { +func NewPhoenix(wallet *wallet.Wallet, faucetAmount uint, clientMgr *client.Mgr, db repository.DB) Phoenix { return Phoenix{ wallet: wallet, clientMgr: clientMgr, @@ -76,6 +75,7 @@ func (pt *Phoenix) GetCommand() command.Command { AppIDs: entity.AllAppIDs(), SubCommands: make([]command.Command, 0), Handler: nil, + TargetFlag: command.TargetMaskTest, } cmdPhoenix.AddSubCommand(subCmdFaucet) diff --git a/internal/engine/command/voucher/voucher.go b/internal/engine/command/voucher/voucher.go index ee9ff042..800de4d0 100644 --- a/internal/engine/command/voucher/voucher.go +++ b/internal/engine/command/voucher/voucher.go @@ -58,6 +58,7 @@ func (v *Voucher) GetCommand() command.Command { AppIDs: entity.AllAppIDs(), SubCommands: make([]command.Command, 0), Handler: nil, + TargetFlag: command.TargetMaskMain, } cmdVoucher.AddSubCommand(subCmdClaim) diff --git a/internal/engine/command/zealy/zealy.go b/internal/engine/command/zealy/zealy.go index 032fc699..8b91df49 100644 --- a/internal/engine/command/zealy/zealy.go +++ b/internal/engine/command/zealy/zealy.go @@ -19,9 +19,7 @@ type Zealy struct { wallet *wallet.Wallet } -func NewZealy( - db *repository.DB, wallet *wallet.Wallet, -) Zealy { +func NewZealy(db *repository.DB, wallet *wallet.Wallet) Zealy { return Zealy{ db: db, wallet: wallet, @@ -63,6 +61,7 @@ func (z *Zealy) GetCommand() command.Command { AppIDs: entity.AllAppIDs(), SubCommands: make([]command.Command, 0), Handler: nil, + TargetFlag: command.TargetMaskMain, } cmdZealy.AddSubCommand(subCmdClaim) diff --git a/internal/engine/engine.go b/internal/engine/engine.go index f70a4e08..ece003a8 100644 --- a/internal/engine/engine.go +++ b/internal/engine/engine.go @@ -50,37 +50,33 @@ type IEngine interface { func NewBotEngine(cfg *config.Config) (*BotEngine, error) { ctx, cancel := context.WithCancel(context.Background()) - // ? adding main network client manager. - cm := client2.NewClientMgr(ctx) - - localClient, err := client2.NewClient(cfg.LocalNode) + db, err := repository.NewDB(cfg.Database.URL) if err != nil { cancel() return nil, err } + log.Info("database loaded successfully") - cm.AddClient(localClient) + cm := client2.NewClientMgr(ctx) - for _, nn := range cfg.NetworkNodes { - c, err := client2.NewClient(nn) + if len(cfg.LocalNode) > 0 { + localClient, err := client2.NewClient(cfg.LocalNode) if err != nil { - log.Error("can't add new network node client", "err", err, "addr", nn) + cancel() + return nil, err } - cm.AddClient(c) + + cm.AddClient(localClient) } - // ? adding phoenix test network client manager. - phoenixCm := client2.NewClientMgr(ctx) - for _, tnn := range cfg.Phoenix.NetworkNodes { - c, err := client2.NewClient(tnn) + for _, nn := range cfg.NetworkNodes { + c, err := client2.NewClient(nn) if err != nil { - log.Error("can't add new network node client", "err", err, "addr", tnn) + log.Error("can't add new network node client", "err", err, "addr", nn) } - - phoenixCm.AddClient(c) + cm.AddClient(c) } - // ? opening wallet if it's enabled. var wal *wallet.Wallet if cfg.Wallet.Enable { // load or create wallet. @@ -95,35 +91,10 @@ func NewBotEngine(cfg *config.Config) (*BotEngine, error) { log.Info("wallet opened successfully", "address", wal.Address()) } - // ? opening testnet (Phoenix) wallet if it's enabled. - var phoenixWal *wallet.Wallet - if cfg.TestNetWallet.Enable { - // load or create wallet. - phoenixWal = wallet.Open(&cfg.TestNetWallet) - if phoenixWal == nil { - cancel() - return nil, WalletError{ - Reason: "can't open testnet wallet", - } - } - - log.Info("testnet wallet opened successfully", "address", phoenixWal.Address()) - } - - // ? loading database. - db, err := repository.NewDB(cfg.Database.URL) - if err != nil { - cancel() - return nil, err - } - log.Info("database loaded successfully") - - return newBotEngine(cm, phoenixCm, wal, phoenixWal, cfg.Phoenix.FaucetAmount, db, cfg.AuthIDs, ctx, cancel), nil + return newBotEngine(ctx, cancel, db, cm, wal, cfg.Phoenix.FaucetAmount, cfg.BotName), nil } -func newBotEngine(cm, ptcm *client2.Mgr, wallet *wallet.Wallet, phoenixWal *wallet.Wallet, phoenixFaucetAmount uint, db *repository.DB, _ []string, - ctx context.Context, cnl context.CancelFunc, -) *BotEngine { +func newBotEngine(ctx context.Context, cnl context.CancelFunc, db *repository.DB, cm *client2.Mgr, wallet *wallet.Wallet, phoenixFaucetAmount uint, botName string) *BotEngine { rootCmd := command.Command{ Emoji: "🤖", Name: "pagu", @@ -142,7 +113,7 @@ func newBotEngine(cm, ptcm *client2.Mgr, wallet *wallet.Wallet, phoenixWal *wall netCmd := network.NewNetwork(ctx, cm) bcCmd := calculator.NewCalculator(cm) - ptCmd := phoenixtestnet.NewPhoenix(phoenixWal, phoenixFaucetAmount, ptcm, *db) + ptCmd := phoenixtestnet.NewPhoenix(wallet, phoenixFaucetAmount, cm, *db) zealyCmd := zealy.NewZealy(db, wallet) voucherCmd := voucher.NewVoucher(db, wallet, cm) marketCmd := market.NewMarket(cm, priceCache) @@ -155,7 +126,7 @@ func newBotEngine(cm, ptcm *client2.Mgr, wallet *wallet.Wallet, phoenixWal *wall networkCmd: netCmd, blockchainCmd: bcCmd, phoenixCmd: ptCmd, - phoenixClientMgr: ptcm, + phoenixClientMgr: cm, zealyCmd: zealyCmd, voucherCmd: voucherCmd, marketCmd: marketCmd, diff --git a/internal/platforms/discord/discord.go b/internal/platforms/discord/discord.go index c9848a6e..6cc3c4dc 100644 --- a/internal/platforms/discord/discord.go +++ b/internal/platforms/discord/discord.go @@ -3,6 +3,8 @@ package discord import ( "time" + "github.com/pactus-project/pactus/util" + "github.com/pagu-project/Pagu/internal/entity" "github.com/pagu-project/Pagu/internal/engine" @@ -19,10 +21,11 @@ type DiscordBot struct { Session *discordgo.Session engine *engine.BotEngine cfg config.DiscordBot + target string } -func NewDiscordBot(botEngine *engine.BotEngine, token string, cfg config.DiscordBot) (*DiscordBot, error) { - s, err := discordgo.New("Bot " + token) +func NewDiscordBot(botEngine *engine.BotEngine, cfg config.DiscordBot, target string) (*DiscordBot, error) { + s, err := discordgo.New("Bot " + cfg.Token) if err != nil { return nil, err } @@ -31,6 +34,7 @@ func NewDiscordBot(botEngine *engine.BotEngine, token string, cfg config.Discord Session: s, engine: botEngine, cfg: cfg, + target: target, }, nil } @@ -72,6 +76,23 @@ func (bot *DiscordBot) registerCommands() error { continue } + switch bot.target { + case config.BotNamePaguMainnet: + if !util.IsFlagSet(beCmd.TargetFlag, command.TargetMaskMain) { + continue + } + + case config.BotNamePaguTestnet: + if !util.IsFlagSet(beCmd.TargetFlag, command.TargetMaskTest) { + continue + } + + case config.BotNamePaguModerator: + if !util.IsFlagSet(beCmd.TargetFlag, command.TargetMaskModerator) { + continue + } + } + log.Info("registering new command", "name", beCmd.Name, "desc", beCmd.Desc, "index", i, "object", beCmd) discordCmd := discordgo.ApplicationCommand{ @@ -195,7 +216,7 @@ func (bot *DiscordBot) respondResultMsg(res command.CommandResult, s *discordgo. bot.respondEmbed(resEmbed, s, i) } -func (db *DiscordBot) respondEmbed(embed *discordgo.MessageEmbed, s *discordgo.Session, i *discordgo.InteractionCreate) { +func (bot *DiscordBot) respondEmbed(embed *discordgo.MessageEmbed, s *discordgo.Session, i *discordgo.InteractionCreate) { response := &discordgo.InteractionResponse{ Type: discordgo.InteractionResponseChannelMessageWithSource, Data: &discordgo.InteractionResponseData{ @@ -209,15 +230,15 @@ func (db *DiscordBot) respondEmbed(embed *discordgo.MessageEmbed, s *discordgo.S } } -func (db *DiscordBot) UpdateStatusInfo() { +func (bot *DiscordBot) UpdateStatusInfo() { log.Info("info status started") for { - ns, err := db.engine.NetworkStatus() + ns, err := bot.engine.NetworkStatus() if err != nil { continue } - err = db.Session.UpdateStatusComplex(newStatus("validators count", utils.FormatNumber(int64(ns.ValidatorsCount)))) + err = bot.Session.UpdateStatusComplex(newStatus("validators count", utils.FormatNumber(int64(ns.ValidatorsCount)))) if err != nil { log.Error("can't set status", "err", err) continue @@ -225,7 +246,7 @@ func (db *DiscordBot) UpdateStatusInfo() { time.Sleep(time.Second * 5) - err = db.Session.UpdateStatusComplex(newStatus("total accounts", utils.FormatNumber(int64(ns.TotalAccounts)))) + err = bot.Session.UpdateStatusComplex(newStatus("total accounts", utils.FormatNumber(int64(ns.TotalAccounts)))) if err != nil { log.Error("can't set status", "err", err) continue @@ -233,7 +254,7 @@ func (db *DiscordBot) UpdateStatusInfo() { time.Sleep(time.Second * 5) - err = db.Session.UpdateStatusComplex(newStatus("height", utils.FormatNumber(int64(ns.CurrentBlockHeight)))) + err = bot.Session.UpdateStatusComplex(newStatus("height", utils.FormatNumber(int64(ns.CurrentBlockHeight)))) if err != nil { log.Error("can't set status", "err", err) continue @@ -244,7 +265,7 @@ func (db *DiscordBot) UpdateStatusInfo() { circulatingSupplyAmount := amount.Amount(ns.CirculatingSupply) formattedCirculatingSupply := circulatingSupplyAmount.Format(amount.UnitPAC) + " PAC" - err = db.Session.UpdateStatusComplex(newStatus("circ supply", formattedCirculatingSupply)) + err = bot.Session.UpdateStatusComplex(newStatus("circ supply", formattedCirculatingSupply)) if err != nil { log.Error("can't set status", "err", err) continue @@ -255,7 +276,7 @@ func (db *DiscordBot) UpdateStatusInfo() { totalNetworkPowerAmount := amount.Amount(ns.TotalNetworkPower) formattedTotalNetworkPower := totalNetworkPowerAmount.Format(amount.UnitPAC) + " PAC" - err = db.Session.UpdateStatusComplex(newStatus("total power", formattedTotalNetworkPower)) + err = bot.Session.UpdateStatusComplex(newStatus("total power", formattedTotalNetworkPower)) if err != nil { log.Error("can't set status", "err", err) continue @@ -265,8 +286,8 @@ func (db *DiscordBot) UpdateStatusInfo() { } } -func (db *DiscordBot) Stop() error { +func (bot *DiscordBot) Stop() error { log.Info("Stopping Discord Bot") - return db.Session.Close() + return bot.Session.Close() }