-
Notifications
You must be signed in to change notification settings - Fork 0
/
proposal.go
92 lines (75 loc) · 2.65 KB
/
proposal.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"context"
"fmt"
"strconv"
"strings"
"time"
govtypes "github.com/cosmos/cosmos-sdk/x/gov/types"
tb "gopkg.in/tucnak/telebot.v2"
)
func getProposalInfo(message *tb.Message) {
args := strings.SplitAfterN(message.Text, " ", 2)
if len(args) < 2 {
log.Info().Msg("getProposalInfo: args length < 2")
sendMessage(message, "Usage: proposal <proposal ID>")
return
}
id, err := strconv.ParseUint(args[1], 10, 64)
if err != nil {
log.Error().Err(err).Msg("Could not parse proposal ID")
sendMessage(message, "Proposal ID should be a number")
return
}
log.Debug().Uint64("id", id).Msg("getProposalInfo: id")
// --------------------------------
proposal, err := getProposal(id)
if err != nil {
log.Error().Err(err).Msg("Could not get proposal")
sendMessage(message, "Could not find proposal")
return
}
// --------------------------------
serializedProposal, err := serializeProposal(proposal)
if err != nil {
sendMessage(message, "Error getting proposal")
log.Info().
Uint64("id", proposal.ProposalId).
Str("user", message.Sender.Username).
Msg("Successfully returned proposal info")
} else {
sendMessage(message, serializedProposal)
}
}
func serializeProposal(proposal govtypes.Proposal) (string, error) {
proposalInfo, err := getProposalInfoAsStruct(proposal)
if err != nil {
return "", err
}
var sb strings.Builder
sb.WriteString(fmt.Sprintf("<strong>Proposal #%d</strong>\n", proposal.ProposalId))
sb.WriteString(fmt.Sprintf("<code>%s</code>\n", proposalInfo.Title))
sb.WriteString(fmt.Sprintf("Submit time: <code>%s</code>\n", proposal.SubmitTime.Format(time.RFC822)))
sb.WriteString(fmt.Sprintf("Deposit time: <code>%s</code>\n", proposal.DepositEndTime.Format(time.RFC822)))
sb.WriteString(fmt.Sprintf("Voting starts: <code>%s</code>\n", proposal.VotingStartTime.Format(time.RFC822)))
sb.WriteString(fmt.Sprintf("Voting ends: <code>%s</code>\n", proposal.VotingEndTime.Format(time.RFC822)))
sb.WriteString(fmt.Sprintf("Status: <code>%s</code>\n", proposal.Status))
sb.WriteString(fmt.Sprintf("<a href=\"https://mintscan.io/%s/proposals/%d\">Mintscan</a>\n\n", MintscanPrefix, proposal.ProposalId))
sb.WriteString(fmt.Sprintf("<pre>%s</pre>", proposalInfo.Description))
return sb.String(), nil
}
func getProposal(id uint64) (govtypes.Proposal, error) {
govClient := govtypes.NewQueryClient(grpcConn)
proposalResponse, err := govClient.Proposal(
context.Background(),
&govtypes.QueryProposalRequest{ProposalId: id},
)
if err != nil {
log.Error().
Uint64("id", id).
Err(err).
Msg("Could not get proposal")
return govtypes.Proposal{}, err
}
return proposalResponse.Proposal, nil
}