/
make.go
108 lines (95 loc) · 2.52 KB
/
make.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
package polls
import (
"fmt"
"log"
"time"
"github.com/Nv7-Github/Nv7Haven/eod/types"
"github.com/Nv7-Github/sevcord/v2"
"github.com/bwmarrin/discordgo"
)
func (b *Polls) CreatePoll(c sevcord.Ctx, p *types.Poll) types.Resp {
dg := c.Dg()
p.Guild = c.Guild()
p.Creator = c.Author().User.ID
p.CreatedOn = time.Now()
// Check poll count
var pollcnt int
err := b.db.QueryRow("SELECT pollcnt FROM config WHERE guild=$1", c.Guild()).Scan(&pollcnt)
if err != nil {
return types.Error(err)
}
if pollcnt > 0 {
var cnt int
err = b.db.QueryRow("SELECT COUNT(*) FROM polls WHERE guild=$1 AND creator=$2", c.Guild(), p.Creator).Scan(&cnt)
if err != nil {
return types.Error(err)
}
if cnt >= pollcnt {
return types.Fail("Poll limit reached!")
}
}
// Get embed
emb, err := b.makePollEmbed(p)
if err != nil {
return types.Error(err)
}
v := emb.Dg()
// Get voting channel
err = b.db.QueryRow("SELECT voting FROM config WHERE guild=$1", c.Guild()).Scan(&p.Channel)
if err != nil {
return types.Error(err)
}
// Send
msg, err := dg.ChannelMessageSendEmbed(p.Channel, v)
if err != nil {
return types.Error(err)
}
p.Message = msg.ID
// Add reactions
err = dg.MessageReactionAdd(p.Channel, msg.ID, UpArrow)
if err != nil {
return types.Error(err)
}
err = dg.MessageReactionAdd(p.Channel, msg.ID, DownArrow)
if err != nil {
return types.Error(err)
}
// Add to database
_, err = b.db.NamedExec("INSERT INTO polls (guild, channel, message, kind, creator, createdon, data, upvotes, downvotes) VALUES (:guild, :channel, :message, :kind, :creator, :createdon, :data, :upvotes, :downvotes)", p)
if err != nil {
return types.Error(err)
}
return types.Ok()
}
func (b *Polls) checkPoll(p *types.Poll, votecnt int, dg *discordgo.Session) {
if p.Upvotes-p.Downvotes >= votecnt {
b.pollSuccess(p, dg)
return
}
if p.Downvotes-p.Upvotes >= votecnt {
var news string
err := b.db.QueryRow(`SELECT news FROM config WHERE guild=$1`, p.Guild).Scan(&news)
if err != nil {
log.Println("news err", err)
return
}
_, err = dg.ChannelMessageSend(news, fmt.Sprintf("❌ **Poll Rejected** %s", b.pollContextMsg(p)))
if err != nil {
log.Println("news err", err)
}
b.deletePoll(p, dg)
return
}
}
func (b *Polls) deletePoll(p *types.Poll, dg *discordgo.Session) {
// Delete from channel
err := dg.ChannelMessageDelete(p.Channel, p.Message)
if err != nil {
return
}
// Delete from DB
_, err = b.db.Exec("DELETE FROM polls WHERE guild=$1 AND message=$2", p.Guild, p.Message)
if err != nil {
return
}
}