272 lines
5.0 KiB
Go
272 lines
5.0 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 PlayroomTrigger(Time int64, Num int) (int64, int) {
|
|
if Num == 0 {
|
|
return 0, 0
|
|
}
|
|
Now := Now()
|
|
if Time > Now {
|
|
return Time, Num
|
|
}
|
|
var Duration int64
|
|
for {
|
|
if Num > 50 {
|
|
Duration = 1200
|
|
|
|
} else {
|
|
Duration = 3600
|
|
}
|
|
if Time+Duration > Now {
|
|
return Time + Duration, Num
|
|
}
|
|
Time += Duration
|
|
Num -= 10
|
|
if Num <= 0 {
|
|
return 0, 0
|
|
}
|
|
}
|
|
}
|
|
|
|
func SplitInt(str, sep string) []int {
|
|
var ret []int
|
|
for _, v := range strings.Split(str, sep) {
|
|
ret = append(ret, Int(v))
|
|
}
|
|
return ret
|
|
}
|