func newRecordHandler(request *http.Request, resp http.ResponseWriter, redis *models.RedisLogger, user *models.Account, p Parameter) { form := p.(newRecordForm) rec := &models.Record{ Uid: user.Id, Task: form.Task, Type: form.Record.Type, StartTime: time.Unix(form.Record.BeginTime, 0), EndTime: time.Unix(form.Record.EndTime, 0), PubTime: time.Now(), } awards := Awards{} level := user.Level() switch form.Record.Type { case "post": rec.Status = models.StatusFinish if form.Task > 0 { rec.Coin = (2 + level) * models.Satoshi awards = Awards{ Score: 2 + level, Literal: 2 + level, Wealth: rec.Coin, } } else { rec.Coin = 2 * models.Satoshi awards = Awards{ Score: 2, Literal: 2, Wealth: rec.Coin, } } GiveAwards(user, awards, redis) redis.AddPost(user.Id, "", 1) user.UpdateStat(models.StatArticles, 1) case "game": if form.Task > 0 { awards = gameAwards(level, form.Record.GameScore, true) //user.AddTask(models.Tasks[form.Task-1].Type, form.Task, nil) rec.Status = models.StatusFinish } else { if form.Record.GameScore >= 100 && user.Stat != nil && user.Stat.LastGameTime < nowDate().Unix() { awards = gameAwards(level, form.Record.GameScore, false) } user.UpdateStat(models.StatLastGameTime, time.Now().Unix()) } GiveAwards(user, awards, redis) rec.Game = &models.GameRecord{ Type: form.Record.GameType, Name: form.Record.GameName, Duration: form.Record.Duration, Score: form.Record.GameScore, Magic: int(awards.Mental), } rec.Coin = awards.Wealth redis.AddGameTime(user.Id, int(form.Record.Duration)) user.UpdateStat(models.StatGameTime, form.Record.Duration) redis.SetGameMaxScore(gameType(rec.Game.Type), user.Id, rec.Game.Score) user.SetGameTime(gameType(rec.Game.Type), time.Now()) case "run": if rec.Task > 0 { rec.Delete() } rec.Sport = &models.SportRecord{ Source: form.Record.Source, Duration: form.Record.Duration, Distance: form.Record.Distance, Weight: form.Record.Weight, Mood: form.Record.Mood, HeartRate: form.Record.HeartRate, Pics: form.Record.Pics, } if rec.Sport.Weight == 0 { rec.Sport.Weight = user.Weight } // update weight if rec.Sport.Weight != user.Weight { user.SetInfo(&models.SetInfo{Weight: rec.Sport.Weight}) } if form.Record.Duration > 0 { rec.Sport.Speed = float64(form.Record.Distance) / float64(form.Record.Duration) } rec.Status = models.StatusAuth redis.AddRecord(user.Id, 1) user.UpdateStat(models.StatRecords, 1) /* if len(form.Record.Source) > 0 { level := user.Level() awards = Awards{ Physical: 30 + level, Wealth: 30 * models.Satoshi, Score: 30 + level, } GiveAwards(user, awards, redis) redis.UpdateRecLB(user.Id, rec.Sport.Distance, int(rec.Sport.Duration)) rec.Coin = awards.Wealth rec.Status = models.StatusFinish } */ default: log.Println("Unknown record type:", form.Record.Type) } // assign task id if rec.Task == 0 { rec.Task = rec.PubTime.Unix() } if err := rec.Save(); err != nil { writeResponse(request.RequestURI, resp, nil, err) return } if rec.Type == "run" { article := &models.Article{ Author: user.Id, PubTime: time.Now(), Loc: user.Loc, Record: rec.Id.Hex(), Type: models.ArticleRecord, } if !form.Public { article.Privilege = models.PrivPrivate } if err := article.Save(); err == nil { redis.AddPost(user.Id, "", 1) user.UpdateStat(models.StatArticles, 1) } } if form.Task > 0 { user.UpdateTask(int(form.Task), rec.Status) /* if rec.Status == models.StatusFinish { // ws push event := &models.Event{ Type: models.EventNotice, Time: time.Now().Unix(), Data: models.EventData{ Type: models.EventTaskDone, To: user.Id, Body: []models.MsgBody{ {Type: "task_id", Content: strconv.Itoa(int(form.Task))}, {Type: "literature_value", Content: strconv.FormatInt(awards.Literal, 10)}, {Type: "magic_value", Content: strconv.FormatInt(awards.Mental, 10)}, {Type: "coin_value", Content: strconv.FormatInt(awards.Wealth, 10)}, }, }, } event.Save() redis.PubMsg(event.Type, event.Data.To, event.Bytes()) } */ } respData := map[string]interface{}{ "record_id": rec.Id.Hex(), "ExpEffect": awards, } writeResponse(request.RequestURI, resp, respData, nil) }
func newArticleHandler(request *http.Request, resp http.ResponseWriter, client *ApnClient, redis *models.RedisLogger, user *models.Account, p Parameter) { form := p.(newArticleForm) article := &models.Article{ Author: user.Id, Contents: form.Contents, PubTime: time.Now(), Parent: form.Parent, //Tags: form.Tags, Loc: form.Location, Type: form.Type, } article.Title, article.Images = articleCover(form.Contents) if len(article.Images) > 0 { article.Image = article.Images[0] } /* if len(article.Tags) == 0 { article.Tags = []string{"SPORT_LOG"} } */ awards := Awards{} parent := &models.Article{} if len(form.Parent) > 0 { if find, err := parent.FindById(form.Parent); !find { e := errors.NewError(errors.NotExistsError, "文章不存在!") if err != nil { e = errors.NewError(errors.DbError) } writeResponse(request.RequestURI, resp, nil, e) return } if redis.Relationship(parent.Author, user.Id) == models.RelBlacklist { writeResponse(request.RequestURI, resp, nil, errors.NewError(errors.AccessError, "对方屏蔽了你!")) return } awards = Awards{Literal: 1 + user.Level(), Score: 1 + user.Level()} } else { if user.Stat != nil && user.Stat.LastArticleTime < nowDate().Unix() { awards = Awards{Literal: 2 + user.Level(), Wealth: 2 * models.Satoshi, Score: 2 + user.Level()} } user.UpdateStat(models.StatLastArticleTime, time.Now().Unix()) } if article.Type == models.ArticleRecord { article.Coaches = []string{user.Id} } if article.Type == models.ArticleCoach { if parent.Author != user.Id && user.Actor != models.ActorCoach && user.Actor != models.ActorAdmin { writeResponse(request.RequestURI, resp, nil, errors.NewError(errors.AccessError)) return } if err := article.Save(); err != nil { log.Println(err) writeResponse(request.RequestURI, resp, nil, err) return } // ws push event := &models.Event{ Type: models.EventArticle, Time: time.Now().Unix(), Data: models.EventData{ Type: models.EventCoach, Id: parent.Id.Hex(), From: user.Id, //To: parent.Author, Body: []models.MsgBody{ {Type: "total_count", Content: strconv.Itoa(parent.CoachReviewCount + 1)}, {Type: "image", Content: user.Profile}, }, }, } for _, coach := range parent.Coaches { if coach == user.Id { continue } event.Data.To = coach event.Save() redis.PubMsg(models.EventArticle, coach, event.Bytes()) } respData := map[string]interface{}{ "ExpEffect": Awards{}, } writeResponse(request.RequestURI, resp, respData, nil) return } if err := article.Save(); err != nil { log.Println(err) writeResponse(request.RequestURI, resp, nil, err) return } t := "" stat := models.StatArticles if len(form.Parent) > 0 { t = models.ArticleComment stat = models.StatComments } redis.AddPost(user.Id, t, 1) user.UpdateStat(stat, 1) if err := GiveAwards(user, awards, redis); err != nil { log.Println(err) writeResponse(request.RequestURI, resp, nil, errors.NewError(errors.DbError)) return } // comment if len(form.Parent) > 0 && parent.Author != user.Id { //u := &models.User{Id: parent.Author} author := &models.Account{} author.FindByUserid(parent.Author) // ws push event := &models.Event{ Type: models.EventArticle, Time: time.Now().Unix(), Data: models.EventData{ Type: models.EventComment, Id: parent.Id.Hex(), From: user.Id, To: parent.Author, Body: []models.MsgBody{ {Type: "total_count", Content: strconv.Itoa(parent.ReviewCount + 1)}, {Type: "image", Content: parent.Image}, }, }, } /* if err := event.Save(); err == nil { redis.IncrEventCount(parent.Author, event.Data.Type, 1) } */ event.Save() event.Data.Body = append(event.Data.Body, models.MsgBody{Type: "new_count", Content: strconv.Itoa(models.EventCount(event.Data.Type, event.Data.Id, event.Data.To))}) redis.PubMsg(models.EventArticle, parent.Author, event.Bytes()) // apple push if author.Push { go sendApn(client, user.Nickname+"评论了你的主题!", author.EventCount("", ""), author.Devs...) } } respData := map[string]interface{}{ //"articles_without_content": convertArticle(article), "ExpEffect": awards, } writeResponse(request.RequestURI, resp, respData, nil) }