2025-08-09 22:29:41 +08:00
|
|
|
|
package share
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
|
2025-11-04 11:44:07 +08:00
|
|
|
|
"blazing/cool"
|
|
|
|
|
|
|
2025-08-09 22:29:41 +08:00
|
|
|
|
"github.com/gogf/gf/v2/os/gctx"
|
|
|
|
|
|
"github.com/gogf/gf/v2/util/gconv"
|
2025-11-23 23:38:03 +00:00
|
|
|
|
"github.com/gogf/gf/v2/util/grand"
|
2025-08-09 22:29:41 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// newSessionStore 创建会话缓存实例
|
|
|
|
|
|
func newSessionStore() *cacheStore[uint32] {
|
|
|
|
|
|
return &cacheStore[uint32]{
|
|
|
|
|
|
manager: cool.CacheManager,
|
|
|
|
|
|
prefix: "blazing:session:",
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// newUserOnlineStore 创建用户在线状态缓存实例
|
|
|
|
|
|
func newUserOnlineStore() *cacheStore[uint16] {
|
|
|
|
|
|
return &cacheStore[uint16]{
|
|
|
|
|
|
manager: cool.CacheManager,
|
|
|
|
|
|
prefix: "blazing:useronline:",
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-04 11:44:07 +08:00
|
|
|
|
// newEmailCodeStore 创建邮件注册码缓存实例
|
|
|
|
|
|
func newEmailCodeStore() *cacheStore[int] {
|
|
|
|
|
|
return &cacheStore[int]{
|
|
|
|
|
|
manager: cool.CacheManager,
|
|
|
|
|
|
prefix: "blazing:email:code:",
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-08-09 22:29:41 +08:00
|
|
|
|
// sessionManager 会话管理器
|
|
|
|
|
|
type sessionManager struct {
|
|
|
|
|
|
sessionStore *cacheStore[uint32] // 会话缓存
|
|
|
|
|
|
userOnlineStore *cacheStore[uint16] // 用户在线状态缓存
|
2025-11-04 11:44:07 +08:00
|
|
|
|
emailCodeStore *cacheStore[int] // 邮件注册码缓存
|
2025-08-09 22:29:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// newSessionManager 创建会话管理器
|
|
|
|
|
|
func newSessionManager() *sessionManager {
|
|
|
|
|
|
return &sessionManager{
|
|
|
|
|
|
sessionStore: newSessionStore(),
|
|
|
|
|
|
userOnlineStore: newUserOnlineStore(),
|
2025-11-04 11:44:07 +08:00
|
|
|
|
emailCodeStore: newEmailCodeStore(),
|
2025-08-09 22:29:41 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SetUserOnline 设置用户在线状态
|
|
|
|
|
|
func (m *sessionManager) SetUserOnline(userID uint32, serverID uint16) error {
|
|
|
|
|
|
return m.userOnlineStore.Set(gctx.New(), gconv.String(userID), serverID, 0)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetUserOnline 获取用户在线状态
|
|
|
|
|
|
func (m *sessionManager) GetUserOnline(userID uint32) (uint16, error) {
|
|
|
|
|
|
return m.userOnlineStore.Get(context.Background(), gconv.String(userID))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DeleteUserOnline 删除用户在线状态
|
|
|
|
|
|
func (m *sessionManager) DeleteUserOnline(userID uint32) error {
|
|
|
|
|
|
return m.userOnlineStore.Del(gctx.New(), gconv.String(userID))
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// UserOnlineExists 检查用户在线状态是否存在
|
|
|
|
|
|
func (m *sessionManager) UserOnlineExists(userID uint32) (bool, error) {
|
|
|
|
|
|
return m.userOnlineStore.Contains(context.Background(), gconv.String(userID))
|
|
|
|
|
|
}
|
2025-11-04 11:44:07 +08:00
|
|
|
|
|
|
|
|
|
|
// generate6DigitCode 生成6位数字注册码(100000-999999)
|
|
|
|
|
|
func (m *sessionManager) generate6DigitCode() int {
|
|
|
|
|
|
// 初始化随机数生成器(确保每次调用生成不同序列)
|
2025-11-23 23:38:03 +00:00
|
|
|
|
|
|
|
|
|
|
return grand.Intn(900000) + 100000
|
2025-11-04 11:44:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// SaveEmailCode 生成并保存邮件注册码(返回生成的验证码,支持设置过期时间)
|
|
|
|
|
|
func (m *sessionManager) SaveEmailCode(email string, expire time.Duration) (int, error) {
|
|
|
|
|
|
code := m.generate6DigitCode()
|
|
|
|
|
|
return code, m.emailCodeStore.Set(gctx.New(), email, code, expire)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GetEmailCode 获取指定邮箱的注册码
|
|
|
|
|
|
func (m *sessionManager) GetEmailCode(email string) (int, error) {
|
|
|
|
|
|
return m.emailCodeStore.Get(context.Background(), email)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// DeleteEmailCode 删除指定邮箱的注册码(验证成功后调用)
|
|
|
|
|
|
func (m *sessionManager) DeleteEmailCode(email string) error {
|
|
|
|
|
|
return m.emailCodeStore.Del(gctx.New(), email)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// EmailCodeExists 检查指定邮箱是否存在有效的注册码
|
|
|
|
|
|
func (m *sessionManager) EmailCodeExists(email string) (bool, error) {
|
|
|
|
|
|
return m.emailCodeStore.Contains(context.Background(), email)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// VerifyEmailCode 验证用户输入的注册码是否正确
|
|
|
|
|
|
func (m *sessionManager) VerifyEmailCode(email string, inputCode int) (bool, error) {
|
|
|
|
|
|
storedCode, err := m.GetEmailCode(email)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return false, err
|
|
|
|
|
|
}
|
|
|
|
|
|
return storedCode == inputCode, nil
|
|
|
|
|
|
}
|