예제 #1
0
파일: team.go 프로젝트: pjherring/ggc
func validateJoinTeam(ctx *_Context) error {
	if phrase, ok := ctx.urlParams["phrase"]; !ok || phrase == "" {
		return util.NewHttpError("Please provide a phrase", 400)
	}

	return nil
}
예제 #2
0
파일: answer.go 프로젝트: pjherring/ggc
package clues

import (
	"github.com/pjherring/ggc/biz/progress"
	"github.com/pjherring/ggc/table"
	"github.com/pjherring/ggc/util"
)

var (
	WrongAnswer = util.NewHttpError("Incorrent answer.", 400)
)

//Answer will try the potential answer and advance the progress if correct
func Answer(clueId, teamId int64, potential string) error {
	clue, err := table.FindClue(clueId)
	if err != nil {
		return err
	}

	if !clue.TryAnswer(potential) {
		return WrongAnswer
	}

	return progress.Advance(clueId, teamId)
}
예제 #3
0
파일: track.go 프로젝트: pjherring/ggc
package record

import (
	"strconv"
	"strings"
	"time"

	"github.com/go-sql-driver/mysql"
	"github.com/pjherring/ggc/util"
)

var (
	WrongTrack    = util.NewHttpError("Incorrect track", 500)
	NoCluesRemain = util.NewHttpError("No clues left in track.", 400)
)

type Track struct {
	TrackId            int64
	Name               string
	questionIdOrderRaw string
	QuestionIdOrder    PipeSeparatedList
	StartTime          mysql.NullTime
	EndTime            mysql.NullTime
}

func (t Track) Active(now time.Time) bool {
	return (t.EndTime.Valid && t.EndTime.Time.After(now)) && (t.StartTime.Valid && t.StartTime.Time.Before(now))
}

func ExtractClueIdsFromTracks(tracks []*Track) (clueIds []int64) {
	unique := map[int64]bool{}
예제 #4
0
파일: user.go 프로젝트: pjherring/ggc
package table

import (
	"database/sql"

	"github.com/pjherring/ggc/record"
	"github.com/pjherring/ggc/util"
)

var (
	InvalidTelephone = util.NewHttpError("Invalid Telephone", 400)
	DuplicateUser    = util.NewHttpError("Duplicate User", 400)
	NoUser           = util.NewHttpError("User does not exist", 400)
)

func CreateUser(telephone string, teamId int64) (*record.User, error) {
	telephone = util.FormatTelephone(telephone)

	if len(telephone) != 10 {
		return nil, InvalidTelephone
	}

	if dup, err := isDuplicateUserTelephone(telephone); err != nil {
		return nil, err
	} else if dup {
		return nil, DuplicateUser
	}

	u := &record.User{
		Telephone:       telephone,
		TeamId:          teamId,
예제 #5
0
	"github.com/pjherring/ggc/record"
	"github.com/pjherring/ggc/util"
)

const (
	startProgressQuery = `
	INSERT INTO team_progress
	(team_id, question_id, start_time)
	VALUES
	(?, ?, ?)
	`
)

var (
	TeamProgressExists = util.NewHttpError("Team already in progress", 400)
	NoProgress         = util.NewHttpError("No progress for team", 400)
)

func StartProgress(clueId, teamId int64) error {
	_, err := db.Exec(startProgressQuery, teamId, clueId, time.Now())
	return err
}

const updateClueTeamQuery = `
UPDATE team_progress
SET answer_time = ?
WHERE question_id = ? AND team_id = ?
`

func FinishProgressForClueTeam(now time.Time, clueId, teamId int64) error {
예제 #6
0
파일: ask.go 프로젝트: pjherring/ggc
package hint

import (
	"github.com/pjherring/ggc/table"
	"github.com/pjherring/ggc/util"
)

var NoHintsLeft error = util.NewHttpError(
	"No hints remain", 400,
)

//Ask should get the current hint for team
//It should return nothing when all hints have been taken
//This assumes each clue only has two hints
func Ask(teamId int64) (string, error) {

	currentClue, err := table.FindClueWithProgressForTeam(teamId)
	if err != nil {
		return "", err
	}

	if currentClue.HintCnt < 2 {
		err = table.IncrementHintsTakenForClueTeam(currentClue.Clue.ClueId, teamId)
		if err != nil {
			return "", err
		}
	}

	switch currentClue.HintCnt {
	case 0:
		return currentClue.Clue.HintOne, nil
예제 #7
0
파일: team.go 프로젝트: pjherring/ggc
package table

import (
	"database/sql"
	"strings"
	"time"

	"github.com/pjherring/ggc/record"
	"github.com/pjherring/ggc/util"
)

var (
	ErrBadPhrase = util.NewHttpError("No team matches that phrase", 400)
)

const updateTeamStartTimeQuery = `
UPDATE teams SET start_time = ? WHERE team_id = ?
`

//sets the team start time
func UpdateTeamStartTime(teamId int64, t time.Time) error {
	_, err := db.Exec(updateTeamStartTimeQuery, t, teamId)
	return err
}

func UpdateTeamFinishTime(teamId int64, t *time.Time) error {

	var err error

	if t == nil {
		_, err = db.Exec(
예제 #8
0
파일: clue.go 프로젝트: pjherring/ggc
package biz

import (
	"time"

	"github.com/pjherring/ggc/record"
	"github.com/pjherring/ggc/table"
	"github.com/pjherring/ggc/util"
)

const (
	clueDisabledAdvancement = "You have gone to the next clue because the previous clue was disabled."
	clueAnsweredAdvancement = "You have gone to the next clue because the previous clue was answered by a teammate of yours."
)

var (
	WrongAnswerForClue   = util.NewHttpError("Incorrect answer.", 400)
	WrongLocationForClue = util.NewHttpError("Incorrect location.", 400)
)

func FindCurrentClues(now time.Time) ([]*record.Clue, error) {
	//find current tracks
	tracks, err := table.FindCurrentTracks(now)
	if err != nil {
		return nil, err
	}

	clueIds := record.ExtractClueIdsFromTracks(tracks)
	return table.FindManyClues(clueIds)
}