pet_home_server/src/server/GoUtil/GoUtil.go
2025-02-06 16:54:18 +08:00

245 lines
4.6 KiB
Go

package GoUtil
import (
"bytes"
"crypto/aes"
"crypto/cipher"
crand "crypto/rand"
"encoding/base64"
"encoding/gob"
"fmt"
"io"
"math/rand"
"reflect"
"strconv"
"strings"
"time"
)
// 实例化一个通过字符串映射函数切片的map
var eventByName = make(map[string][]*EventObj)
type EventObj struct {
Callback func([]interface{})
Obj interface{}
}
const (
SECRET_KEY = ")VQbB(vpy=U(wcp)"
)
// 加密字符串
func Encrypt(plainText string) (string, error) {
block, err := aes.NewCipher([]byte(SECRET_KEY))
if err != nil {
return "", err
}
cipherText := make([]byte, aes.BlockSize+len(plainText))
iv := cipherText[:aes.BlockSize]
if _, err := io.ReadFull(crand.Reader, iv); err != nil {
return "", err
}
stream := cipher.NewCFBEncrypter(block, iv)
stream.XORKeyStream(cipherText[aes.BlockSize:], []byte(plainText))
return base64.URLEncoding.EncodeToString(cipherText), nil
}
// 解密字符串
func Decrypt(cipherText string) (string, error) {
cipherTextBytes, err := base64.URLEncoding.DecodeString(cipherText)
if err != nil {
return "", err
}
block, err := aes.NewCipher([]byte(SECRET_KEY))
if err != nil {
return "", err
}
if len(cipherTextBytes) < aes.BlockSize {
return "", fmt.Errorf("cipherText too short")
}
iv := cipherTextBytes[:aes.BlockSize]
cipherTextBytes = cipherTextBytes[aes.BlockSize:]
stream := cipher.NewCFBDecrypter(block, iv)
stream.XORKeyStream(cipherTextBytes, cipherTextBytes)
return string(cipherTextBytes), nil
}
func (o *EventObj) isEqual(tar *EventObj) bool {
if reflect.ValueOf(o.Callback).Pointer() == reflect.ValueOf(tar.Callback).Pointer() && o.Obj == tar.Obj {
return true
}
return false
}
// 注册事件,提供事件名和回调函数
func RegisterEvent(name string, callback func([]interface{}), Obj interface{}) {
eo := new(EventObj)
eo.Callback = callback
eo.Obj = Obj
// 通过名字查找事件列表
list := eventByName[name]
// 在列表切片中添加函数
list = append(list, eo)
// 将修改的事件列表切片保存回去
eventByName[name] = list
}
// 调用事件
func CallEvent(name string, param []interface{}) {
// 通过名字找到事件列表
list := eventByName[name]
// 遍历这个事件的所有回调
for _, eo := range list {
// 传入参数调用回调
eo.Callback(param)
}
}
func RemoveEvent(name string, callback func([]interface{}), Obj interface{}) {
// 通过名字找到事件列表
list := eventByName[name]
j := 0
eo := new(EventObj)
eo.Callback = callback
eo.Obj = Obj
// 遍历这个事件的所有回调
for _, v := range list {
if !v.isEqual(eo) {
list[j] = v
j++
}
}
eventByName[name] = list[:j]
}
func DeleteEleByValue(list []int, ele int) []int {
j := 0
for _, v := range list {
if v != ele {
list[j] = v
j++
}
}
ret := list[:j]
return ret
}
func BoolToInt32(b bool) int32 {
if b {
return 1
}
return 0
}
func IfTrue(a bool, b, c interface{}) interface{} {
if a {
return b
}
return c
}
func Int64(a interface{}) int64 {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return int64(v)
case int32:
return int64(v)
case int64:
return v
case float64:
return int64(v)
}
return 0
}
func Int(a interface{}) int {
if a == nil {
return 0
}
switch v := a.(type) {
case int:
return v
case int32:
return int(v)
case int64:
return int(v)
case float64:
return int(v)
case string:
r, err := strconv.Atoi(v)
if err != nil {
return 0
}
return r
}
return 0
}
func GobMarshal(data interface{}) ([]byte, error) {
var buf bytes.Buffer
encode := gob.NewEncoder(&buf)
err := encode.Encode(data)
if err != nil {
return nil, err
}
return buf.Bytes(), nil
}
func GobUnmarshal(data []byte, obj interface{}) error {
decode := gob.NewDecoder(bytes.NewReader(data))
err := decode.Decode(obj)
if err != nil {
return err
}
return nil
}
func GetServerIdByUid(uid int) int {
return int((uid % 100000000) / 100000)
}
func CreateOrderSn(uid int) string {
Now := time.Now()
return "order_" + strconv.Itoa(uid) + "_" + Now.Format("20060102150405") + RandString(6)
}
// 生成指定长度的随机字符串
func RandString(n int) string {
const letters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
r := rand.New(rand.NewSource(time.Now().UnixNano()))
b := make([]byte, n)
for i := range b {
b[i] = letters[r.Intn(len(letters))]
}
return string(b)
}
// 生成索要卡牌唯一id
func CreateCardId(From, To, CardId int) string {
return fmt.Sprintf("%d_%d_%d_%d_%s", From, To, CardId, Now(), RandString(3))
}
func SplitInt(str, sep string) []int {
var ret []int
for _, v := range strings.Split(str, sep) {
ret = append(ret, Int(v))
}
return ret
}