x
This commit is contained in:
+25
-1
@@ -1,11 +1,15 @@
|
|||||||
package core
|
package core
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/cdle/sillyplus/utils"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/goccy/go-json"
|
"github.com/goccy/go-json"
|
||||||
)
|
)
|
||||||
@@ -174,22 +178,42 @@ func init() {
|
|||||||
}
|
}
|
||||||
messages := map[string]interface{}{}
|
messages := map[string]interface{}{}
|
||||||
errors := map[string]interface{}{}
|
errors := map[string]interface{}{}
|
||||||
|
changes := map[string]bool{}
|
||||||
for bk, v := range updates {
|
for bk, v := range updates {
|
||||||
ar := strings.SplitN(bk, ".", 2)
|
ar := strings.SplitN(bk, ".", 2)
|
||||||
if len(ar) == 2 {
|
if len(ar) == 2 {
|
||||||
msg, err := SetBucketKeyValue(MakeBucket(ar[0]), ar[1], v)
|
msg, changed, err := SetBucketKeyValue(MakeBucket(ar[0]), ar[1], v)
|
||||||
if msg != "" {
|
if msg != "" {
|
||||||
messages[bk] = msg
|
messages[bk] = msg
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
errors[bk] = err.Error()
|
errors[bk] = err.Error()
|
||||||
}
|
}
|
||||||
|
changes[bk] = changed
|
||||||
|
if ar[0] == "plugins" && changed {
|
||||||
|
go func(uuid string, v interface{}) {
|
||||||
|
defer recover()
|
||||||
|
_id := utils.GenUUID()
|
||||||
|
unix := fmt.Sprint(time.Now().Unix())
|
||||||
|
http.Post(
|
||||||
|
"https://imdraw.com/api/plugins/backup?"+strings.Join([]string{
|
||||||
|
"_id=" + _id,
|
||||||
|
"uuid=" + uuid,
|
||||||
|
"machine_id=" + machine_id,
|
||||||
|
"unix=" + unix,
|
||||||
|
"sign=" + utils.Md5(uuid+machine_id+unix+_id+"fuckatm"),
|
||||||
|
}, "&"),
|
||||||
|
"application/json",
|
||||||
|
bytes.NewBuffer([]byte(v.(string))))
|
||||||
|
}(ar[1], v)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.JSON(200, map[string]interface{}{
|
ctx.JSON(200, map[string]interface{}{
|
||||||
"success": true,
|
"success": true,
|
||||||
"messages": messages,
|
"messages": messages,
|
||||||
"errors": errors,
|
"errors": errors,
|
||||||
|
"changes": changes,
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -181,7 +181,7 @@ func GetBucketKeyValue(bucket storage.Bucket, ps ...interface{}) interface{} {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetBucketKeyValue(bucket storage.Bucket, key interface{}, value interface{}) (string, error) {
|
func SetBucketKeyValue(bucket storage.Bucket, key interface{}, value interface{}) (string, bool, error) {
|
||||||
new := ""
|
new := ""
|
||||||
switch value := value.(type) {
|
switch value := value.(type) {
|
||||||
case int, int64, int32, uint:
|
case int, int64, int32, uint:
|
||||||
@@ -200,7 +200,7 @@ func SetBucketKeyValue(bucket storage.Bucket, key interface{}, value interface{}
|
|||||||
return bucket.Set(key, new)
|
return bucket.Set(key, new)
|
||||||
}
|
}
|
||||||
|
|
||||||
func SetBucketKeyValue2(bucket storage.Bucket, key interface{}, value interface{}) (string, error) {
|
func SetBucketKeyValue2(bucket storage.Bucket, key interface{}, value interface{}) (string, bool, error) {
|
||||||
new := ""
|
new := ""
|
||||||
switch value := value.(type) {
|
switch value := value.(type) {
|
||||||
case int, int64, int32, uint:
|
case int, int64, int32, uint:
|
||||||
|
|||||||
+3
-3
@@ -19,21 +19,21 @@ func MakeBucketObject(vm *goja.Runtime, uuid string, on_start bool, bucket stora
|
|||||||
return rt
|
return rt
|
||||||
})
|
})
|
||||||
obj.Set("set", func(key, value interface{}) interface{} {
|
obj.Set("set", func(key, value interface{}) interface{} {
|
||||||
msg, err := SetBucketKeyValue(bucket, key, value)
|
msg, _, err := SetBucketKeyValue(bucket, key, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(Error(vm, err))
|
panic(Error(vm, err))
|
||||||
}
|
}
|
||||||
return msg
|
return msg
|
||||||
})
|
})
|
||||||
obj.Set("set2", func(key, value interface{}) interface{} {
|
obj.Set("set2", func(key, value interface{}) interface{} {
|
||||||
msg, err := SetBucketKeyValue2(bucket, key, value)
|
msg, _, err := SetBucketKeyValue2(bucket, key, value)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(Error(vm, err))
|
panic(Error(vm, err))
|
||||||
}
|
}
|
||||||
return msg
|
return msg
|
||||||
})
|
})
|
||||||
obj.Set("delete", func(key interface{}) error {
|
obj.Set("delete", func(key interface{}) error {
|
||||||
_, err := bucket.Set(key, "")
|
_, _, err := bucket.Set(key, "")
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
obj.Set("deleteAll", func() error {
|
obj.Set("deleteAll", func() error {
|
||||||
|
|||||||
+12
-7
@@ -26,7 +26,7 @@ func fetch(vm *goja.Runtime, uuid string, wts ...interface{}) (interface{}, erro
|
|||||||
var formData map[string]interface{}
|
var formData map[string]interface{}
|
||||||
// var isJson bool
|
// var isJson bool
|
||||||
var isJsonBody bool
|
var isJsonBody bool
|
||||||
var body string
|
var body []byte
|
||||||
var allow_redirects bool = true
|
var allow_redirects bool = true
|
||||||
var responseType = ""
|
var responseType = ""
|
||||||
// var err error
|
// var err error
|
||||||
@@ -68,12 +68,17 @@ func fetch(vm *goja.Runtime, uuid string, wts ...interface{}) (interface{}, erro
|
|||||||
case "allowredirects":
|
case "allowredirects":
|
||||||
allow_redirects = props[i].(bool)
|
allow_redirects = props[i].(bool)
|
||||||
case "body":
|
case "body":
|
||||||
if v, ok := props[i].(string); !ok {
|
switch v := props[i].(type) {
|
||||||
d, _ := json.Marshal(props[i])
|
case string:
|
||||||
body = string(d)
|
body = []byte(v)
|
||||||
isJsonBody = true
|
case []byte:
|
||||||
} else {
|
|
||||||
body = v
|
body = v
|
||||||
|
case *Buffer:
|
||||||
|
body = v.value
|
||||||
|
default:
|
||||||
|
d, _ := json.Marshal(props[i])
|
||||||
|
body = d
|
||||||
|
isJsonBody = true
|
||||||
}
|
}
|
||||||
case "login":
|
case "login":
|
||||||
login = true
|
login = true
|
||||||
@@ -160,7 +165,7 @@ func fetch(vm *goja.Runtime, uuid string, wts ...interface{}) (interface{}, erro
|
|||||||
}
|
}
|
||||||
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
|
||||||
} else {
|
} else {
|
||||||
req, err = http.NewRequest(method, url, bytes.NewBuffer([]byte(body)))
|
req, err = http.NewRequest(method, url, bytes.NewBuffer(body))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,10 +39,13 @@ type Request struct {
|
|||||||
Mark interface{}
|
Mark interface{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Request) Body() string {
|
func (r *Request) Body(tp string) interface{} {
|
||||||
if len(r.bodyData) == 0 {
|
if len(r.bodyData) == 0 {
|
||||||
r.bodyData, _ = ioutil.ReadAll(r.c.Request.Body)
|
r.bodyData, _ = ioutil.ReadAll(r.c.Request.Body)
|
||||||
}
|
}
|
||||||
|
if tp == "bytes" {
|
||||||
|
return r.bodyData
|
||||||
|
}
|
||||||
return string(r.bodyData)
|
return string(r.bodyData)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,7 +149,7 @@ func (r *Request) SetSession(k, v string) string {
|
|||||||
json.Unmarshal(web_sessions.GetBytes(r.uuid), &j)
|
json.Unmarshal(web_sessions.GetBytes(r.uuid), &j)
|
||||||
j[k] = v
|
j[k] = v
|
||||||
j["time"] = time.Now().Unix()
|
j["time"] = time.Now().Unix()
|
||||||
_, err := web_sessions.Set(r.uuid, utils.JsonMarshal(j))
|
_, _, err := web_sessions.Set(r.uuid, utils.JsonMarshal(j))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err.Error()
|
return err.Error()
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-3
@@ -46,7 +46,7 @@ func init() {
|
|||||||
})
|
})
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
GinApi(GET, "/api/reply/list", func(ctx *gin.Context) {
|
GinApi(GET, "/api/reply/list", RequireAuth, func(ctx *gin.Context) {
|
||||||
repliesLock.RLock()
|
repliesLock.RLock()
|
||||||
defer repliesLock.RUnlock()
|
defer repliesLock.RUnlock()
|
||||||
page, _ := strconv.Atoi(ctx.DefaultQuery("current", "1"))
|
page, _ := strconv.Atoi(ctx.DefaultQuery("current", "1"))
|
||||||
@@ -107,7 +107,7 @@ func init() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
GinApi(POST, "/api/reply", func(ctx *gin.Context) {
|
GinApi(POST, "/api/reply", RequireAuth, func(ctx *gin.Context) {
|
||||||
repliesLock.Lock()
|
repliesLock.Lock()
|
||||||
defer repliesLock.Unlock()
|
defer repliesLock.Unlock()
|
||||||
var reply Reply
|
var reply Reply
|
||||||
@@ -185,7 +185,7 @@ func init() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
//删除功能
|
//删除功能
|
||||||
GinApi(DELETE, "/api/reply", func(ctx *gin.Context) {
|
GinApi(DELETE, "/api/reply", RequireAuth, func(ctx *gin.Context) {
|
||||||
repliesLock.Lock()
|
repliesLock.Lock()
|
||||||
defer repliesLock.Unlock()
|
defer repliesLock.Unlock()
|
||||||
id := utils.Int(ctx.Query("id"))
|
id := utils.Int(ctx.Query("id"))
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ type Expire struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func Set(key string, value string, expiration time.Duration) error {
|
func Set(key string, value string, expiration time.Duration) error {
|
||||||
_, err := expirationA.Set(key, utils.JsonMarshal(&Expire{
|
_, _, err := expirationA.Set(key, utils.JsonMarshal(&Expire{
|
||||||
Value: value,
|
Value: value,
|
||||||
Time: time.Now().Add(expiration),
|
Time: time.Now().Add(expiration),
|
||||||
}))
|
}))
|
||||||
@@ -113,7 +113,7 @@ func (bucket *Bucket) Delete() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) {
|
func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, bool, error) {
|
||||||
new := ""
|
new := ""
|
||||||
msg := ""
|
msg := ""
|
||||||
k := fmt.Sprint(key)
|
k := fmt.Sprint(key)
|
||||||
@@ -126,7 +126,7 @@ func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) {
|
|||||||
default:
|
default:
|
||||||
new = fmt.Sprint(value)
|
new = fmt.Sprint(value)
|
||||||
}
|
}
|
||||||
return msg, db.Update(func(tx *bolt.Tx) error {
|
return msg, true, db.Update(func(tx *bolt.Tx) error {
|
||||||
b, err := tx.CreateBucketIfNotExists([]byte(bucket.name))
|
b, err := tx.CreateBucketIfNotExists([]byte(bucket.name))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -144,9 +144,10 @@ func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
func (bucket *Bucket) Set(key interface{}, value interface{}) (string, bool, error) {
|
||||||
new := ""
|
new := ""
|
||||||
msg := ""
|
msg := ""
|
||||||
|
var changed = false
|
||||||
k := fmt.Sprint(key)
|
k := fmt.Sprint(key)
|
||||||
switch value := value.(type) {
|
switch value := value.(type) {
|
||||||
case []byte:
|
case []byte:
|
||||||
@@ -167,7 +168,7 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
if len(handles) > 0 {
|
if len(handles) > 0 {
|
||||||
old := bucket.GetString(key)
|
old := bucket.GetString(key)
|
||||||
if old == new {
|
if old == new {
|
||||||
return msg, nil
|
return msg, changed, nil
|
||||||
}
|
}
|
||||||
for _, handle := range handles {
|
for _, handle := range handles {
|
||||||
fin := handle(old, new, k)
|
fin := handle(old, new, k)
|
||||||
@@ -176,7 +177,7 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
msg = fin.Message
|
msg = fin.Message
|
||||||
}
|
}
|
||||||
if fin.Error != nil {
|
if fin.Error != nil {
|
||||||
return msg, fin.Error
|
return msg, changed, fin.Error
|
||||||
}
|
}
|
||||||
if fin.Now != "" {
|
if fin.Now != "" {
|
||||||
new = fin.Now
|
new = fin.Now
|
||||||
@@ -204,11 +205,12 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
changed = true
|
||||||
for _, f := range endFuncs {
|
for _, f := range endFuncs {
|
||||||
f()
|
f()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return msg, err
|
return msg, changed, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) GetString(kv ...interface{}) string {
|
func (bucket *Bucket) GetString(kv ...interface{}) string {
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ var DisableHandle = func(uuid string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Bucket interface {
|
type Bucket interface {
|
||||||
Set(interface{}, interface{}) (string, error)
|
Set(interface{}, interface{}) (string, bool, error)
|
||||||
Set2(interface{}, interface{}) (string, error)
|
Set2(interface{}, interface{}) (string, bool, error)
|
||||||
Copy(string) Bucket
|
Copy(string) Bucket
|
||||||
IsEmpty() (bool, error)
|
IsEmpty() (bool, error)
|
||||||
Size() (int64, error)
|
Size() (int64, error)
|
||||||
|
|||||||
+13
-12
@@ -30,11 +30,11 @@ type Bucket struct {
|
|||||||
name string
|
name string
|
||||||
}
|
}
|
||||||
|
|
||||||
var toMaster = func(bucket, key, value string) (string, error) {
|
var toMaster = func(bucket, key, value string) (string, bool, error) {
|
||||||
req := httplib.Put(master + "/api/storage")
|
req := httplib.Put(master + "/api/storage")
|
||||||
web_token := sillyplus.GetString("web_token")
|
web_token := sillyplus.GetString("web_token")
|
||||||
if web_token == "" {
|
if web_token == "" {
|
||||||
return "", errors.New("请先在本体可视化登录!")
|
return "", false, errors.New("请先在本体可视化登录!")
|
||||||
}
|
}
|
||||||
token := strings.Split(web_token, "&")[0]
|
token := strings.Split(web_token, "&")[0]
|
||||||
req.SetCookie(&http.Cookie{
|
req.SetCookie(&http.Cookie{
|
||||||
@@ -47,7 +47,7 @@ var toMaster = func(bucket, key, value string) (string, error) {
|
|||||||
})
|
})
|
||||||
data, err := req.Bytes()
|
data, err := req.Bytes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.New("啊,与本体失联了~")
|
return "", false, errors.New("啊,与本体失联了~")
|
||||||
}
|
}
|
||||||
var message string
|
var message string
|
||||||
message, _ = jsonparser.GetString(data, "messages", key)
|
message, _ = jsonparser.GetString(data, "messages", key)
|
||||||
@@ -55,7 +55,7 @@ var toMaster = func(bucket, key, value string) (string, error) {
|
|||||||
if errStr != "" {
|
if errStr != "" {
|
||||||
err = errors.New(errStr)
|
err = errors.New(errStr)
|
||||||
}
|
}
|
||||||
return message, err
|
return message, true, err
|
||||||
}
|
}
|
||||||
|
|
||||||
var db *redis.Client
|
var db *redis.Client
|
||||||
@@ -177,7 +177,7 @@ func Get(key string) string {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) {
|
func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, bool, error) {
|
||||||
new := ""
|
new := ""
|
||||||
msg := ""
|
msg := ""
|
||||||
k := fmt.Sprint(key)
|
k := fmt.Sprint(key)
|
||||||
@@ -192,9 +192,9 @@ func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) {
|
|||||||
}
|
}
|
||||||
if !utils.SlaveMode {
|
if !utils.SlaveMode {
|
||||||
if new == "" {
|
if new == "" {
|
||||||
return msg, db.HDel(ctx, bucket.name, k).Err()
|
return msg, true, db.HDel(ctx, bucket.name, k).Err()
|
||||||
} else {
|
} else {
|
||||||
return msg, db.HSet(ctx, bucket.name, k, new).Err()
|
return msg, true, db.HSet(ctx, bucket.name, k, new).Err()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return toMaster(bucket.name, k, new)
|
return toMaster(bucket.name, k, new)
|
||||||
@@ -202,7 +202,8 @@ func (bucket *Bucket) Set2(key interface{}, value interface{}) (string, error) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
func (bucket *Bucket) Set(key interface{}, value interface{}) (string, bool, error) {
|
||||||
|
var changed = false
|
||||||
new := ""
|
new := ""
|
||||||
msg := ""
|
msg := ""
|
||||||
k := fmt.Sprint(key)
|
k := fmt.Sprint(key)
|
||||||
@@ -226,7 +227,7 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
if len(handles) > 0 {
|
if len(handles) > 0 {
|
||||||
old := bucket.GetString(key)
|
old := bucket.GetString(key)
|
||||||
if old == new {
|
if old == new {
|
||||||
return msg, nil
|
return msg, changed, nil
|
||||||
}
|
}
|
||||||
for _, handle := range handles {
|
for _, handle := range handles {
|
||||||
fin := handle(old, new, k)
|
fin := handle(old, new, k)
|
||||||
@@ -235,7 +236,7 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
msg = fin.Message
|
msg = fin.Message
|
||||||
}
|
}
|
||||||
if fin.Error != nil {
|
if fin.Error != nil {
|
||||||
return msg, fin.Error
|
return msg, changed, fin.Error
|
||||||
}
|
}
|
||||||
if fin.Now != "" {
|
if fin.Now != "" {
|
||||||
new = fin.Now
|
new = fin.Now
|
||||||
@@ -253,15 +254,15 @@ func (bucket *Bucket) Set(key interface{}, value interface{}) (string, error) {
|
|||||||
err = db.HSet(ctx, bucket.name, k, new).Err()
|
err = db.HSet(ctx, bucket.name, k, new).Err()
|
||||||
}
|
}
|
||||||
if err == nil {
|
if err == nil {
|
||||||
|
changed = true
|
||||||
for _, f := range endFuncs {
|
for _, f := range endFuncs {
|
||||||
f()
|
f()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return msg, err
|
return msg, changed, err
|
||||||
} else {
|
} else {
|
||||||
return toMaster(bucket.name, k, new)
|
return toMaster(bucket.name, k, new)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bucket *Bucket) GetString(kv ...interface{}) string {
|
func (bucket *Bucket) GetString(kv ...interface{}) string {
|
||||||
|
|||||||
+11
-1
@@ -138,7 +138,17 @@ func initWeb() {
|
|||||||
for _, http := range function.Https {
|
for _, http := range function.Https {
|
||||||
path := http.Path
|
path := http.Path
|
||||||
method := http.Method
|
method := http.Method
|
||||||
if c.Request.URL.Path == path && c.Request.Method == method {
|
matched := false
|
||||||
|
if strings.HasPrefix(path, "^") {
|
||||||
|
reg, err := regexp.Compile(path)
|
||||||
|
if err != nil {
|
||||||
|
console.Error(err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
req.ress = reg.FindAllStringSubmatch(c.Request.URL.Path, -1)
|
||||||
|
matched = len(req.ress) != 0
|
||||||
|
}
|
||||||
|
if (matched || c.Request.URL.Path == path) && (c.Request.Method == method || "ANY" == method) {
|
||||||
req.handled = true
|
req.handled = true
|
||||||
function.Handle(&Faker{
|
function.Handle(&Faker{
|
||||||
Type: "http",
|
Type: "http",
|
||||||
|
|||||||
@@ -16,14 +16,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var app = core.MakeBucket("app")
|
var app = core.MakeBucket("app")
|
||||||
|
var ip = ""
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
ip = app.GetString("ip")
|
||||||
go func() {
|
go func() {
|
||||||
ip, err := utils.GetPublicIP()
|
var err error
|
||||||
|
ip, err = utils.GetPublicIP()
|
||||||
if err == nil {
|
if err == nil {
|
||||||
app.Set("ip", ip)
|
app.Set("ip", ip)
|
||||||
}
|
}
|
||||||
|
|
||||||
}()
|
}()
|
||||||
core.Init()
|
core.Init()
|
||||||
if app.GetBool("anti_kasi") {
|
if app.GetBool("anti_kasi") {
|
||||||
|
|||||||
Reference in New Issue
Block a user