From 0bffc38be40a4fc6928a24b540c62a644015885f Mon Sep 17 00:00:00 2001 From: fumiama Date: Wed, 8 Sep 2021 13:45:23 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20=20Diana=20=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E5=AE=9E=E8=A3=85=E6=95=99=E4=BD=A0=E4=B8=80=E7=AF=87?= =?UTF-8?q?=E5=B0=8F=E4=BD=9C=E6=96=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugin_diana/data/text.go | 68 ++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 15 deletions(-) diff --git a/plugin_diana/data/text.go b/plugin_diana/data/text.go index 838c7714..3b6afbc2 100644 --- a/plugin_diana/data/text.go +++ b/plugin_diana/data/text.go @@ -2,10 +2,13 @@ package data import ( + "crypto/md5" "io" "net/http" "os" + "sync" "time" + "unsafe" log "github.com/sirupsen/logrus" ) @@ -20,6 +23,10 @@ var ( compo Composition // Array 小作文数组指针 Array = &compo.Array + // m 小作文保存锁 + m sync.Mutex + // md5s 验证重复 + md5s [][16]byte ) func init() { @@ -31,7 +38,12 @@ func init() { } err1 := LoadText() if err1 == nil { - log.Printf("[Diana]读取%d条小作文", len(*Array)) + arrl := len(*Array) + log.Printf("[Diana]读取%d条小作文", arrl) + md5s = make([][16]byte, arrl) + for i, t := range *Array { + md5s[i] = md5.Sum(str2bytes(t)) + } } else { log.Printf("[Diana]读取小作文错误:%v", err1) } @@ -79,21 +91,47 @@ func LoadText() error { // AddText 添加小作文 func AddText(txt string) error { - if txt != "" { + sum := md5.Sum(str2bytes(txt)) + if txt != "" && !isin(sum) { compo.Array = append(compo.Array, txt) - data, err := compo.Marshal() - if err == nil { - if _, err := os.Stat(datapath); err == nil || os.IsExist(err) { - f, err1 := os.OpenFile(pbfile, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) - if err1 == nil { - defer f.Close() - _, err2 := f.Write(data) - return err2 - } - return err1 - } - } - return err + md5s = append(md5s, sum) + savecompo() } return nil } + +func isin(sum [16]byte) bool { + for _, t := range md5s { + if t == sum { + return true + } + } + return false +} + +// savecompo 同步保存作文 +func savecompo() error { + data, err := compo.Marshal() + if err == nil { + if _, err := os.Stat(datapath); err == nil || os.IsExist(err) { + m.Lock() + defer m.Unlock() + f, err1 := os.OpenFile(pbfile, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err1 == nil { + _, err2 := f.Write(data) + f.Close() + + return err2 + } + return err1 + } + } + return err +} + +// str2bytes Fast convert +func str2bytes(s string) []byte { + x := (*[2]uintptr)(unsafe.Pointer(&s)) + h := [3]uintptr{x[0], x[1], x[1]} + return *(*[]byte)(unsafe.Pointer(&h)) +}