Token expired time fucntion is ready

This commit is contained in:
RockYang 2023-04-06 09:56:56 +08:00
parent d8cb2c220e
commit 7e1e408b64
6 changed files with 68 additions and 46 deletions

View File

@ -4,6 +4,7 @@ import (
"bufio" "bufio"
"bytes" "bytes"
"encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gorilla/websocket" "github.com/gorilla/websocket"
@ -76,7 +77,14 @@ func (s *Server) sendMessage(session types.ChatSession, role types.ChatRole, pro
if user.Status == false { if user.Status == false {
replyMessage(ws, "当前 TOKEN 已经被禁用,如果疑问,请联系管理员!", false) replyMessage(ws, "当前 TOKEN 已经被禁用,如果疑问,请联系管理员!", false)
replyMessage(ws, "![](images/wx.png)", true) replyMessage(ws, "![](images/wx.png)", true)
return err return errors.New("当前 TOKEN " + user.Name + "已经被禁用")
}
if time.Now().Unix() > user.ExpiredTime {
exTime := time.Unix(user.ExpiredTime, 0).Format("2006-01-02 15:04:05")
replyMessage(ws, "当前 TOKEN 已过期,过期时间为:"+exTime+",如果疑问,请联系管理员!", false)
replyMessage(ws, "![](images/wx.png)", true)
return errors.New("当前 TOKEN " + user.Name + "已过期")
} }
if user.MaxCalls > 0 && user.RemainingCalls <= 0 { if user.MaxCalls > 0 && user.RemainingCalls <= 0 {

View File

@ -81,7 +81,7 @@ func (s *Server) SetDebugHandle(c *gin.Context) {
} }
err := json.NewDecoder(c.Request.Body).Decode(&data) err := json.NewDecoder(c.Request.Body).Decode(&data)
if err != nil { if err != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid args"}) c.JSON(http.StatusOK, types.BizVo{Code: types.InvalidParams, Message: "Invalid args"})
return return
} }
@ -91,16 +91,21 @@ func (s *Server) SetDebugHandle(c *gin.Context) {
// AddUserHandle 添加 Username // AddUserHandle 添加 Username
func (s *Server) AddUserHandle(c *gin.Context) { func (s *Server) AddUserHandle(c *gin.Context) {
var data types.User var data struct {
Name string `json:"name"`
MaxCalls int `json:"max_calls"`
EnableHistory bool `json:"enable_history"`
Term int `json:"term"` // 有效期
}
err := json.NewDecoder(c.Request.Body).Decode(&data) err := json.NewDecoder(c.Request.Body).Decode(&data)
if err != nil { if err != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid args"}) c.JSON(http.StatusOK, types.BizVo{Code: types.InvalidParams, Message: "Invalid args"})
return return
} }
// 参数处理 // 参数处理
if data.Name == "" || data.MaxCalls < 0 { if data.Name == "" || data.MaxCalls < 0 {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid args"}) c.JSON(http.StatusOK, types.BizVo{Code: types.InvalidParams, Message: "Invalid args"})
return return
} }
@ -111,7 +116,13 @@ func (s *Server) AddUserHandle(c *gin.Context) {
return return
} }
user := types.User{Name: data.Name, MaxCalls: data.MaxCalls, RemainingCalls: data.MaxCalls, EnableHistory: data.EnableHistory, Status: true} user := types.User{
Name: data.Name,
MaxCalls: data.MaxCalls,
RemainingCalls: data.MaxCalls,
EnableHistory: data.EnableHistory,
Term: data.Term,
Status: true}
err = PutUser(user) err = PutUser(user)
if err != nil { if err != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Failed to save configs"}) c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Failed to save configs"})
@ -127,23 +138,31 @@ func (s *Server) BatchAddUserHandle(c *gin.Context) {
Number int `json:"number"` Number int `json:"number"`
MaxCalls int `json:"max_calls"` MaxCalls int `json:"max_calls"`
EnableHistory bool `json:"enable_history"` EnableHistory bool `json:"enable_history"`
Term int `json:"term"`
} }
err := json.NewDecoder(c.Request.Body).Decode(&data) err := json.NewDecoder(c.Request.Body).Decode(&data)
if err != nil || data.MaxCalls <= 0 { if err != nil || data.MaxCalls <= 0 {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid args"}) c.JSON(http.StatusOK, types.BizVo{Code: types.InvalidParams, Message: "Invalid args"})
return return
} }
var users = make([]string, 0) var users = make([]types.User, 0)
for i := 0; i < data.Number; i++ { for i := 0; i < data.Number; i++ {
name := utils.RandString(12) name := utils.RandString(12)
_, err := GetUser(name) _, err := GetUser(name)
for err == nil { for err == nil {
name = utils.RandString(12) name = utils.RandString(12)
} }
err = PutUser(types.User{Name: name, MaxCalls: data.MaxCalls, RemainingCalls: data.MaxCalls, EnableHistory: data.EnableHistory, Status: true}) user := types.User{
Name: name,
MaxCalls: data.MaxCalls,
RemainingCalls: data.MaxCalls,
EnableHistory: data.EnableHistory,
Term: data.Term,
Status: true}
err = PutUser(user)
if err == nil { if err == nil {
users = append(users, name) users = append(users, user)
} }
} }
@ -154,7 +173,7 @@ func (s *Server) SetUserHandle(c *gin.Context) {
var data map[string]interface{} var data map[string]interface{}
err := json.NewDecoder(c.Request.Body).Decode(&data) err := json.NewDecoder(c.Request.Body).Decode(&data)
if err != nil { if err != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid args"}) c.JSON(http.StatusOK, types.BizVo{Code: types.InvalidParams, Message: "Invalid args"})
return return
} }
@ -189,6 +208,9 @@ func (s *Server) SetUserHandle(c *gin.Context) {
if v, ok := data["remaining_calls"]; ok { if v, ok := data["remaining_calls"]; ok {
user.RemainingCalls = int(v.(float64)) user.RemainingCalls = int(v.(float64))
} }
if v, ok := data["expired_time"]; ok {
user.ExpiredTime = int64(v.(float64))
}
if v, ok := data["api_key"]; ok { if v, ok := data["api_key"]; ok {
user.ApiKey = v.(string) user.ApiKey = v.(string)
} }

View File

@ -271,7 +271,8 @@ func (s *Server) LoginHandle(c *gin.Context) {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: types.ErrorMsg}) c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: types.ErrorMsg})
return return
} }
if !utils.ContainUser(GetUsers(), data.Token) { user, err := GetUser(data.Token)
if err != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid user"}) c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Invalid user"})
return return
} }
@ -285,5 +286,20 @@ func (s *Server) LoginHandle(c *gin.Context) {
} }
// 记录客户端 IP 地址 // 记录客户端 IP 地址
s.ChatSession[sessionId] = types.ChatSession{ClientIP: c.ClientIP(), Username: data.Token, SessionId: sessionId} s.ChatSession[sessionId] = types.ChatSession{ClientIP: c.ClientIP(), Username: data.Token, SessionId: sessionId}
// 更新用户激活时间
user.ActiveTime = time.Now().Unix()
if user.ExpiredTime == 0 {
activeTime := time.Unix(user.ActiveTime, 0)
if user.Term == 0 {
user.Term = 30 // 默认 30 天到期
}
user.ExpiredTime = activeTime.Add(time.Hour * 24 * time.Duration(user.Term)).Unix()
}
err = PutUser(*user)
if err != nil {
c.JSON(http.StatusOK, types.BizVo{Code: types.Failed, Message: "Save user info failed"})
return
}
c.JSON(http.StatusOK, types.BizVo{Code: types.Success, Data: sessionId}) c.JSON(http.StatusOK, types.BizVo{Code: types.Success, Data: sessionId})
} }

View File

@ -2,26 +2,9 @@ package main
import ( import (
"fmt" "fmt"
"openai/utils" "time"
) )
func main() { func main() {
// leveldb 测试 fmt.Println(time.Unix(1683336167, 0).Format("2006-01-02 15:04:05"))
db, err := utils.NewLevelDB("data")
if err != nil {
panic(err)
}
defer db.Close()
err = db.Put("name", "xiaoming")
if err != nil {
panic(err)
}
name, err := db.Get("name")
if err != nil {
panic(err)
}
fmt.Println("name: ", name)
} }

View File

@ -15,11 +15,14 @@ type Config struct {
type User struct { type User struct {
Name string `json:"name"` Name string `json:"name"`
MaxCalls int `json:"max_calls"` // 最多调用次数,如果为 0 则表示不限制 MaxCalls int `json:"max_calls"` // 最多调用次数,如果为 0 则表示不限制
RemainingCalls int `json:"remaining_calls"` // 剩余调用次数 RemainingCalls int `json:"remaining_calls"` // 剩余调用次数
EnableHistory bool `json:"enable_history"` // 是否启用聊天记录 EnableHistory bool `json:"enable_history"` // 是否启用聊天记录
Status bool `json:"status"` // 当前状态 Status bool `json:"status"` // 当前状态
ApiKey string `json:"api_key"` // OpenAI API KEY Term int `json:"term" default:"30"` // 会员有效期,单位:天
ActiveTime int64 `json:"active_time"` // 激活时间
ExpiredTime int64 `json:"expired_time"` // 到期时间
ApiKey string `json:"api_key"` // OpenAI API KEY
} }
// Chat configs struct // Chat configs struct

View File

@ -2,7 +2,6 @@ package utils
import ( import (
"math/rand" "math/rand"
"openai/types"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -40,12 +39,3 @@ func ContainsStr(slice []string, item string) bool {
} }
return false return false
} }
func ContainUser(slice []types.User, user string) bool {
for _, e := range slice {
if e.Name == user {
return true
}
}
return false
}