| @@ -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() | |||||
| } | |||||