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 .}}{{ .Name }} | {{ .Desc }} |
{{end}}
`
+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()
}