TerraOceanPlugin/GoBot/db/vote.go

151 lines
3.5 KiB
Go

2019-10-12 08:07:10 +07:00
package db
import (
"errors"
"time"
2019-10-12 08:07:10 +07:00
"TerraOceanBot/common"
)
const (
2019-10-12 08:07:10 +07:00
ForceRejectionVote = -1
NuclearOptionVote = 10
)
2019-10-12 08:07:10 +07:00
var ErrForceRejectionVoteReuse = errors.New("db: the user has used force rejection vote in the last month")
var ErrVoteIsOver = errors.New("db: the vote cannot be changed once it's over")
2019-10-12 08:07:10 +07:00
func CreateCustomVote(messageID, text string) (int, error) {
2019-10-10 12:35:53 +07:00
result, err := db.Exec("INSERT INTO vote(messageId, name, type, finished) VALUES(?, ?, ?, ?)", messageID, text, "custom", false)
if err != nil {
return 0, err
}
lastID, err := result.LastInsertId()
return int(lastID), nil
}
2019-10-12 08:07:10 +07:00
func CreateInviteVote(messageID, username, reason string) (int, error) {
2019-10-12 06:40:46 +07:00
result, err := db.Exec("INSERT INTO vote(messageId, name, type, finished) VALUES(?, ?, ?, ?)", messageID, username+":"+reason, "invite", false)
if err != nil {
return 0, err
}
lastID, err := result.LastInsertId()
return int(lastID), nil
}
2019-10-12 08:07:10 +07:00
func GetVoteName(id int) (string, error) {
rows, err := db.Query("SELECT name FROM vote WHERE id=?", id)
if err != nil {
return "", err
}
2019-10-10 12:40:24 +07:00
defer rows.Close()
if rows.Next() {
var name string
err := rows.Scan(&name)
if err != nil {
return "", err
}
return name, nil
}
2019-10-12 08:07:10 +07:00
return "", ErrNotFound
}
2019-10-12 08:07:10 +07:00
func GetVoteFromMessageID(msgID string) (int, error) {
rows, err := db.Query("SELECT id FROM vote WHERE messageId=?", msgID)
if err != nil {
return 0, err
}
2019-10-10 12:40:24 +07:00
defer rows.Close()
if rows.Next() {
var id int
err := rows.Scan(&id)
if err != nil {
return 0, err
}
return id, nil
}
2019-10-12 08:07:10 +07:00
return 0, ErrNotFound
}
2019-10-12 08:07:10 +07:00
func GetMessageIDFromVote(voteID int) (string, error) {
2019-10-10 13:59:00 +07:00
rows, err := db.Query("SELECT messageId FROM vote WHERE id=?", voteID)
if err != nil {
return "", err
}
defer rows.Close()
if rows.Next() {
var id string
err := rows.Scan(&id)
if err != nil {
return "", err
}
return id, nil
}
2019-10-12 08:07:10 +07:00
return "", ErrNotFound
2019-10-10 13:59:00 +07:00
}
2019-10-12 08:07:10 +07:00
func GetVoteType(voteID int) (string, error) {
2019-10-10 13:59:00 +07:00
rows, err := db.Query("SELECT type FROM vote WHERE id=?", voteID)
if err != nil {
return "", err
}
defer rows.Close()
if rows.Next() {
var messageType string
err := rows.Scan(&messageType)
if err != nil {
return "", err
}
return messageType, nil
}
2019-10-12 08:07:10 +07:00
return "", ErrNotFound
2019-10-10 13:59:00 +07:00
}
2019-10-12 08:07:10 +07:00
func UpdateVote(voteID int, userID string, voteValue int) error {
if voteValue == ForceRejectionVote {
//Check if they used it within a month.
2019-10-17 08:49:58 +07:00
rows, err := db.Query("SELECT voteId FROM choices WHERE date >= ? AND value=?", time.Now().AddDate(0, -1, 0), ForceRejectionVote)
if err != nil {
return err
}
if rows.Next() {
2019-10-12 08:07:10 +07:00
return ErrForceRejectionVoteReuse
}
2019-10-10 12:40:24 +07:00
rows.Close()
}
//Check if the vote is finished and don't allow change of vote that way.
rows, err := db.Query("SELECT finished FROM vote WHERE id=? AND finished=?", voteID, true)
2019-10-10 12:40:24 +07:00
defer rows.Close()
if rows.Next() {
2019-10-12 08:07:10 +07:00
return ErrVoteIsOver
}
_, err = db.Exec("REPLACE INTO choices (voteId, userId, date, value) VALUES (?, ?, ?, ?)", voteID, userID, time.Now(), voteValue)
return err
}
2019-10-10 13:59:00 +07:00
2019-10-12 08:07:10 +07:00
func FinishVote(voteID int) error {
2019-10-10 13:59:00 +07:00
_, err := db.Exec("UPDATE vote SET finished=true WHERE id=?", voteID)
return err
}
2019-10-12 08:07:10 +07:00
func GetAllVoteChoices(voteID int) ([]common.VoteChoice, error) {
2019-10-10 13:59:00 +07:00
rows, err := db.Query("SELECT userId, value FROM choices WHERE voteId=?", voteID)
if err != nil {
2019-10-12 08:07:10 +07:00
return []common.VoteChoice{}, err
2019-10-10 13:59:00 +07:00
}
defer rows.Close()
2019-10-12 08:07:10 +07:00
array := make([]common.VoteChoice, 0)
2019-10-10 13:59:00 +07:00
for rows.Next() {
var userID string
var value int
rows.Scan(&userID, &value)
2019-10-12 08:07:10 +07:00
array = append(array, common.VoteChoice{
2019-10-10 13:59:00 +07:00
UserID: userID,
Value: value,
})
}
return array, nil
}