go: Implement voting
There are currently no ways to start vote so the code cannot be tested currently.pull/6/head
							parent
							
								
									7fed3d8dd3
								
							
						
					
					
						commit
						8d51fb02b8
					
				@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					package main
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"errors"
 | 
				
			||||||
 | 
						"time"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						forceRejectionVote = -1
 | 
				
			||||||
 | 
						nuclearOptionVote  = 10
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getVoteName(id int) (string, error) {
 | 
				
			||||||
 | 
						rows, err := db.Query("SELECT name FROM vote WHERE id=?", id)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return "", err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rows.Next() {
 | 
				
			||||||
 | 
							var name string
 | 
				
			||||||
 | 
							err := rows.Scan(&name)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return "", err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return name, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return "", errNotFound
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getVoteFromMessageID(msgID string) (int, error) {
 | 
				
			||||||
 | 
						rows, err := db.Query("SELECT id FROM vote WHERE messageId=?", msgID)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return 0, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if rows.Next() {
 | 
				
			||||||
 | 
							var id int
 | 
				
			||||||
 | 
							err := rows.Scan(&id)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return 0, err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							return id, nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return 0, errNotFound
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func updateVote(voteID int, userID string, voteValue int) error {
 | 
				
			||||||
 | 
						if voteValue == forceRejectionVote {
 | 
				
			||||||
 | 
							//Check if they used it within a month.
 | 
				
			||||||
 | 
							rows, err := db.Query("SELECT voteId FROM choices WHERE date >= ? AND value=?", time.Now().AddDate(0, -1, 0))
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								return err
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if rows.Next() {
 | 
				
			||||||
 | 
								return errForceRejectionVoteReuse
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						//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)
 | 
				
			||||||
 | 
						if rows.Next() {
 | 
				
			||||||
 | 
							return errVoteIsOver
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, err = db.Exec("REPLACE INTO choices (voteId, userId, date, value) VALUES (?, ?, ?, ?)", voteID, userID, time.Now(), voteValue)
 | 
				
			||||||
 | 
						return err
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue