package middleware

import (
	"github.com/gin-gonic/gin"

	"tower_api/pkg/app"
	"tower_api/pkg/errcode"
	"tower_api/pkg/setting"
	"tower_api/service"
)

var playerService = service.NewPlayerService()

// LimitMiddleware 限流器
func LimitMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		//1 得到ip地址
		ipAddr := c.Request.Header.Get("X-Real-IP")
		if ipAddr == "" {
			ipAddr = c.Request.Header.Get("X-Forwarded-For")
		}
		if ipAddr == "" {
			ipAddr = c.ClientIP()
		}
		//2 是否在黑名单中,检查最近1分钟内访问的次数
		if playerService.InBlackList(ipAddr) == true {
			app.Failed(c, errcode.ToManyRequest)
			c.Abort()
			return
		}
		//3 当前访问次数是否可继续
		maxRate := setting.Settings.Server.RateLimit
		if playerService.CanVisit(ipAddr, maxRate) == false {
			app.Failed(c, errcode.ToManyRequest)
			c.Abort()
			return
		}
		c.Next()
	}
}
