| @@ -1,98 +0,0 @@ | |||
| package phone | |||
| import ( | |||
| "fmt" | |||
| "time" | |||
| "code.gitea.io/gitea/modules/log" | |||
| "code.gitea.io/gitea/modules/phone" | |||
| "code.gitea.io/gitea/modules/redis/redis_client" | |||
| "code.gitea.io/gitea/modules/setting" | |||
| "github.com/gomodule/redigo/redis" | |||
| ) | |||
| //验证码存储前缀 使用时%s用手机号替代 | |||
| const CODE_PREFIX = "P_C:%s" | |||
| //手机号发送验证码次数Hkey,%s对应日期, 存储在hset中,值是hashet,记录手机号和发送次数 | |||
| const TIMES_PREFIX = "P_T:%s" | |||
| func GetPhoneNumberSendTimes(conn redis.Conn, phoneNumber string) (int, error) { | |||
| i, err := redis_client.HGET(conn, GetPhoneTimesHKey(), phoneNumber) | |||
| return redis.Int(i, err) | |||
| } | |||
| func GetPhoneCodeTTL(conn redis.Conn, phoneNumber string) (int, error) { | |||
| return redis_client.Ttl(conn, GetPhoneCodeKey(phoneNumber)) | |||
| } | |||
| func SendVerifyCode(conn redis.Conn, phoneNumber string) error { | |||
| timesKey := GetPhoneTimesHKey() | |||
| exists, err := redis_client.EXISTS(conn, timesKey) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| code := phone.GenerateVerifyCode(setting.PhoneService.VerifyCodeLength) | |||
| err = phone.SendVerifyCode(phoneNumber, code) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| redis_client.SETNX(conn, GetPhoneCodeKey(phoneNumber), code, setting.PhoneService.CodeTimeout) | |||
| if !exists { | |||
| err = redis_client.HSETNX(conn, timesKey, phoneNumber, 1) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| err = redis_client.Expire(conn, timesKey, getRemainSecondOfDay(time.Now())) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| } else { | |||
| timesPhoneExists, err := redis_client.HEXISTS(conn, timesKey, phoneNumber) | |||
| if err != nil { | |||
| return err | |||
| } | |||
| if timesPhoneExists { | |||
| err = redis_client.HINCRBY(conn, timesKey, phoneNumber, 1) | |||
| } else { | |||
| err = redis_client.HSETNX(conn, timesKey, phoneNumber, 1) | |||
| } | |||
| if err != nil { | |||
| return err | |||
| } | |||
| } | |||
| return nil | |||
| } | |||
| func IsVerifyCodeRight(phoneNumer string, verifyCode string) bool { | |||
| if phoneNumer == "" { | |||
| return false | |||
| } | |||
| value, err := redis_client.Get(GetPhoneCodeKey(phoneNumer)) | |||
| if err != nil { | |||
| log.Warn("redis err", err) | |||
| return false | |||
| } else { | |||
| return value == verifyCode | |||
| } | |||
| } | |||
| func GetPhoneCodeKey(phoneNumber string) string { | |||
| return fmt.Sprintf(CODE_PREFIX, phoneNumber) | |||
| } | |||
| func GetPhoneTimesHKey() string { | |||
| today := time.Now().Format("2006-01-02") | |||
| return fmt.Sprintf(TIMES_PREFIX, today) | |||
| } | |||
| func getRemainSecondOfDay(t time.Time) int { | |||
| return 86400 - 60*60*t.Hour() + 60*t.Minute() + t.Second() | |||
| } | |||