func (this *CallHandler) handle(text []string) (result string, err error) {
	if len(text) < 2 {
		err = errors.New("i need more info\n" + this.getHelp())
		return
	}
	groupname := mainhandler.getGroupName()
	if groupname == "" {
		err = errors.New("group not found groupid:" + mainhandler.rec.Group_id)
		return
	}
	content, err := models.GetWarDatabyclanname(groupname)
	if err != nil {
		fmt.Println(err.Error())
		err = errors.New("server error")
		return
	}
	if !content.IsEnable {
		result = "no war being"
		return
	}
	num1, err := strconv.Atoi(text[1])
	if err != nil {
		err = errors.New("arg1 need a number \n" + this.getHelp())
		return
	}
	newcallnum := -1
	newbattle := content.Battles[num1]
	for num, call := range newbattle.Callers {
		if call.Callername == mainhandler.rec.Name {
			newcallnum = num
		}
	}

	if newcallnum == -1 {
		newcallp := &models.Caller{mainhandler.rec.Name, -1, time.Now()}
		newbattle.Callers = append(newbattle.Callers, *newcallp)
	} else {
		newbattle.Callers[newcallnum].Calledtime = time.Now()
	}

	err = models.UpdateWarData(content.Id, bson.M{"$set": bson.M{fmt.Sprintf("battles.%d", num1): newbattle}})
	if err != nil {
		fmt.Println(err.Error())
		err = errors.New("server error")
		return
	}
	result = fmt.Sprintf("#%d called by %s", num1, mainhandler.rec.Name)
	return
}
func (this *ScoutHandler) handle(text []string) (result string, err error) {
	if len(text) < 2 {
		err = errors.New("i need more info\n" + this.getHelp())
		return
	}
	groupname := mainhandler.getGroupName()
	if groupname == "" {
		err = errors.New("group not found groupid:" + mainhandler.rec.Group_id)
		return
	}
	content, err := models.GetWarDatabyclanname(groupname)
	if err != nil {
		fmt.Println(err.Error())
		err = errors.New("server error")
		return
	}
	if !content.IsEnable {
		result = "no war being"
		return
	}
	num1, err := strconv.Atoi(text[1])
	if err != nil {
		err = errors.New("arg1 need a number \n" + this.getHelp())
		return
	}
	if content.Battles[num1].Scoutstate == "needscout" || content.Battles[num1].Scoutstate == "scouted" {
		result = fmt.Sprintf("#%d already %s", num1, content.Battles[num1].Scoutstate)
		return
	}

	err = models.UpdateWarData(content.Id, bson.M{"$set": bson.M{fmt.Sprintf("battles.%d.scoutstate", num1): "needscout"}})
	if err != nil {
		fmt.Println(err.Error())
		err = errors.New("server error")
		return
	}
	result = fmt.Sprintf("%s mark #%d need to scout", mainhandler.rec.Name, num1)
	return
}
func (this *EditwarHandler) handle(text []string) (result string, err error) {
	groupname := mainhandler.getGroupName()
	if groupname == "" {
		err = errors.New("group not found groupid:" + mainhandler.rec.Group_id)
		return
	}
	if len(text) < 3 {
		err = errors.New("i need more info\n" + this.getHelp())
		return
	}
	num1, err := strconv.Atoi(text[1])
	if err != nil || num1 < 0 {
		err = errors.New("arg2 must be number\n" + this.getHelp())
		return
	}
	num2, err := strconv.Atoi(text[2])
	isTime := strings.HasSuffix(text[2], "am") || strings.HasSuffix(text[2], "pm")
	if (err != nil || num2 < 0) && !isTime {
		err = errors.New("arg3 must be number or time(endwith am/pm)\n" + this.getHelp())
		return
	}

	if err == nil {
		enemyname := strings.Join(text[3:len(text)], " ")
		battles := make([]models.Battle, num2)
		battlep := &models.Battle{}
		battlep.Init()
		for index := range battles {
			battles[index] = *battlep
		}
		err := models.UpdateWarData(num1, bson.M{"$set": bson.M{"teamb": enemyname, "battles": battles}})
		if err == nil {
			content, err := models.GetWarData(num1)
			if err != nil {
				fmt.Println(err.Error())
				err = errors.New("server error")
			} else if !content.IsEnable {
				result = "no war being"
			} else {
				result = fmt.Sprintf("War #%d Edited \n %s VS %s \n %d vs %d \n War starts %s", content.Id, content.TeamA, content.TeamB, len(content.Battles), len(content.Battles), content.Begintime.Format("3:04PM MST 1/2/2006"))
			}

		}
	} else if isTime {
		now := time.Now()
		var h int
		if strings.HasSuffix(text[2], "am") {
			fmt.Printf("trim time:%s\n", strings.Trim(text[2], "am"))
			h, err = strconv.Atoi(strings.Trim(text[2], "am"))
			if err != nil || h < 0 {
				err = errors.New("wrong time format")
			} else {
				mi := 0
				if h > 12 {
					mi = int(math.Mod(float64(h), 100))
					h = int(h / 100)
				}
				y, m, d := now.Date()
				if now.Hour()*60+now.Minute() > h*60+mi { //if befor now so will be tmw
					d++
				}
				newtime := time.Date(y, m, d, h, mi, 0, 0, time.Local)
				err := models.UpdateWarData(num1, bson.M{"$set": bson.M{"begintime": newtime}})
				if err == nil {
					content, err := models.GetWarData(num1)
					if err != nil {
						fmt.Println(err.Error())
						err = errors.New("server error")
					} else if !content.IsEnable {
						result = "no war being"
					} else {
						result = fmt.Sprintf("War #%d Edited \n %s VS %s \n %d vs %d \n War starts %s", content.Id, content.TeamA, content.TeamB, len(content.Battles), len(content.Battles), content.Begintime.Format("3:04PM MST 1/2/2006"))
					}
				}
			}
		} else {

			h, err = strconv.Atoi(strings.Trim(text[2], "pm"))
			fmt.Printf("trim time:%d\n", h)
			if err != nil || h < 0 {
				err = errors.New("wrong time format")
			} else {
				mi := 0
				if h > 12 {
					mi = int(math.Mod(float64(h), 100))
					h = int(h / 100)
				}
				h = h + 12
				y, m, d := now.Date()
				if now.Hour()*60+now.Minute() > h*60+mi { //if befor now so will be tmw
					d++
				}
				fmt.Printf("trim time mi:%d\n", mi)
				newtime := time.Date(y, m, d, h, mi, 0, 0, time.Local)
				err := models.UpdateWarData(num1, bson.M{"$set": bson.M{"begintime": newtime}})
				if err == nil {
					content, err := models.GetWarData(num1)
					if err != nil {
						fmt.Println(err.Error())
						err = errors.New("server error")
					} else if !content.IsEnable {
						result = "no war being"
					} else {
						result = fmt.Sprintf("War #%d Edited \n %s VS %s \n %d vs %d \n War starts %s", content.Id, content.TeamA, content.TeamB, len(content.Battles), len(content.Battles), content.Begintime.Format("3:04PM MST 1/2/2006"))
					}
				}
			}
		}

	} else {
		err = errors.New("wrong arg \n" + this.getHelp())
	}

	return

}
func (this *StarHandler) handle(text []string) (result string, err error) {
	if len(text) < 3 {
		err = errors.New("i need more info\n" + this.getHelp())
		return
	}
	num1, err := strconv.Atoi(text[1])
	if err != nil || num1 < 0 {
		err = errors.New("arg1 need a number \n" + this.getHelp())
		return
	}
	num2, err := strconv.Atoi(text[2])
	if err != nil || num2 < 0 || num2 > 3 {
		err = errors.New("arg2 need a number \n" + this.getHelp())
		return
	}
	groupname := mainhandler.getGroupName()
	if groupname == "" {
		err = errors.New("group not found groupid:" + mainhandler.rec.Group_id)
		return
	}
	content, err := models.GetWarDatabyclanname(groupname)
	if err != nil {
		fmt.Println(err.Error())
		err = errors.New("server error")
		return
	}
	if !content.IsEnable {
		result = "no war being"
		return
	}

	newcallnum := -1
	newbattle := content.Battles[num1]

	for num, call := range newbattle.Callers {
		if call.Callername == mainhandler.rec.Name {
			newcallnum = num
		}
	}

	newbattle.Scouted()
	if newcallnum == -1 {
		newcallp := &models.Caller{mainhandler.rec.Name, num2, time.Now()}
		newbattle.Callers = append(newbattle.Callers, *newcallp)
	} else {
		newbattle.Callers[newcallnum].Calledtime = time.Now()
		newbattle.Callers[newcallnum].Starstate = num2
	}

	err = models.UpdateWarData(content.Id, bson.M{"$set": bson.M{fmt.Sprintf("battles.%d", num1): newbattle}})

	if err != nil {
		fmt.Println(err.Error())
		err = errors.New("server error")
		return
	}
	switch num2 {
	case 0:
		result = fmt.Sprintf("%s win %d star at #%d\n%s", mainhandler.rec.Name, num2, num1, zerostar[rand.Intn(len(zerostar))])
	case 1:
		result = fmt.Sprintf("%s win %d star at #%d\n%s", mainhandler.rec.Name, num2, num1, onestar[rand.Intn(len(onestar))])
	case 2:
		result = fmt.Sprintf("%s win %d stars at #%d\n%s", mainhandler.rec.Name, num2, num1, twostar[rand.Intn(len(twostar))])
	case 3:
		result = fmt.Sprintf("%s win %d stars at #%d\n%s", mainhandler.rec.Name, num2, num1, threestar[rand.Intn(len(threestar))])
	}

	return
}