From 1d3a61386decc431b4729b6649ee156f87864c5d Mon Sep 17 00:00:00 2001 From: fumiama Date: Tue, 21 Dec 2021 22:09:43 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/{chat/kimo.json => Chat/kimoi.json} | 0 data/Funny/jokes.db | Bin 0 -> 28672 bytes data/funny/laugh.txt | 166 ----------------------- plugin_book_review/migrate/main.go | 43 ------ plugin_book_review/migrate/model.go | 46 ------- plugin_chat/chat.go | 45 ++---- plugin_chat/data.go | 16 ++- plugin_curse/curse.go | 37 +++-- plugin_funny/data.go | 23 +++- plugin_funny/data_test.go | 33 +++++ plugin_funny/laugh.go | 44 ++---- plugin_manager/manager.go | 39 +++--- utils/math/conv.go | 8 ++ 13 files changed, 136 insertions(+), 364 deletions(-) rename data/{chat/kimo.json => Chat/kimoi.json} (100%) create mode 100644 data/Funny/jokes.db delete mode 100644 data/funny/laugh.txt delete mode 100644 plugin_book_review/migrate/main.go delete mode 100644 plugin_book_review/migrate/model.go create mode 100644 plugin_funny/data_test.go create mode 100644 utils/math/conv.go diff --git a/data/chat/kimo.json b/data/Chat/kimoi.json similarity index 100% rename from data/chat/kimo.json rename to data/Chat/kimoi.json diff --git a/data/Funny/jokes.db b/data/Funny/jokes.db new file mode 100644 index 0000000000000000000000000000000000000000..15b6a479d7479727eb3b5b3f630d9a6d567f39d6 GIT binary patch literal 28672 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 literal 0 HcmV?d00001 diff --git a/data/funny/laugh.txt b/data/funny/laugh.txt deleted file mode 100644 index b097e1ed..00000000 --- a/data/funny/laugh.txt +++ /dev/null @@ -1,166 +0,0 @@ -Erdos相信上帝有一本记录所有数学中绝妙证明的书,上帝相信这本书在%name手里 -有一次费马惹怒了%name,于是就有了费马最后定理 -%name从不会用光页边的空白 -%name的Erdos数是-1 -如果%name告诉你他在说谎,他就正在说真话 -%name从大到小列举了所有素数,就知道了素数有无穷多 -%name可以不重复地走遍柯尼斯堡的七座桥 -%name可以倒着写完圆周率的每一位 -当数学家们使用通用语句——设n是一个正整数时,这是在请求%name允许他们这样做 -%name小时候有一次要把正整数从1加到100,于是他用心算把所有正整数的和减去大于100的正整数的和 -不是%name发现了正态分布,而是自然规律在遵从%name的意愿 -一个数学家,一个物理学家,一个工程师走进一家酒吧,侍者说:‘你好,%name教授’ -%name可以走到莫比乌斯带的另一面 -当%name令一个正整数增加1时,那个正整数并没有增加,而是其他正整数减少了1 -%name同时给他自己和罗素剪头发 -%name不能理解什么是随机过程,因为他能预言随机数 -有一次%name证明了一个结论,但他不喜欢这个结论,于是%name把它证伪了 -有些级数是发散的,因为%name觉得它们不值得加起来 -问%name一个定理是否正确可以作为一个定理的严谨证明 -如果没有船,%name可以把狼,羊,菜传送到河对岸 -有一次%name在森林里迷路了,于是他给这个森林添加了一些边把它变成了一棵树 -只有%name知道薛定谔的猫是死是活 -通过故意遗漏证明最后的‘证毕’,%name拯救了热带雨林 -%name可以剔掉奥卡姆剃刀 -你刚证明了一个定理?%name200年前就证明它了。 -空集的定义是%name不会证明的定理构成的集合 -‘我找不到反例’可以被视为一个定理的证明,如果它是%name写下的 -%name把磁铁断为两块时,他得到两个单极磁铁 -费马认为书页边缘写不下自己对费马大定理的证明,%name能证明为什么这个证明这么长 -上帝从不掷骰子,除非%name允许他赢一小会 -平行线在%name让它们相交的地方相交 -当哥德尔听说%name能证明一切命题时,他让%name证明‘存在一个命题%name不能证明’——这就是量子态的来历 -%name可以看到自己头上帽子的颜色 -%name把无穷视为归纳证明的第一个非平凡情况 -%name可以用1种颜色染任何地图 -%name在求不定积分时不需要在最后加上一个常数 -%name无需站在任何人肩膀上就能比别人看的更远 -%name用克莱因瓶喝酒 -%name通过枚举法证伪了哥德尔不完备性定理,有一次%name发现有一个定理自己不会证——这直接证明了哥德尔不完备定理 -%name有log(n)速度的排序算法 -上帝创造了正整数,剩下的就是%name的工作了 -黎曼是%name发表未公开成果时使用的名字 -%name不用任何公理就能证明一个定理 -一个发现就是一个%name的未公开结果 -%name使用无穷进制写数 -%name可以除以0 -存在一个实数到被%name证明了的定理的双射 -%name从不需要选择公理 -%name在200年前发明了64量子位计算机,但这让他的工作减速了 -难题不会为%name带来麻烦,%name会为难题带来麻烦 -%name说过‘数学是科学的皇后’,你猜谁是国王? -没有比65537大的费马素数,因为%name发现费马将要发现什么了不起的事情,于是把它终结掉了 -发散序列当看到%name在旁边时会收敛 -宇宙通过膨胀让自己的熵增加速度不超过%name证明定理的速度 -Erdos说他知道37个勾股定理的证明,%name说他知道37个黎曼定理的证明,并留给黎曼做练习 -希尔伯特23问题是他收集的%name的手稿中留给读者做练习的那些问题 -只有两件事物是无限的:人类的愚蠢和%name的智慧,而且我对前者不太确定——爱因斯坦 -%name也发现了伽罗瓦理论,但他赢了那场决斗 -%name不能理解P与NP的问题,因为一切对他而言都是常数级别 -%name能心算干掉RSA公钥加密算法 -%name在实数集上使用数归 -%name从不证明任何定理——都是他的引理 -不是%name素数的素数会遭到戏弄 -%name可以做出正17边形——只用直尺 -有一次%name在脑子里构建了所有集合构成的集合 -%name证明了哥德巴赫猜想——通过检查所有情况 -%name可以把毛球捋平 -世界上没有定理,只有%name允许其正确的命题 -%name知道哪些图灵机会停机,因为它们运行前要得到%name批准 -在晚上,定理们围坐在篝火边给%name讲故事 -%name本想证明三色定理,但他喜欢蓝色,所以放弃了 -%name当初面试Google时,被问到‘如果P=NP能够推导出哪些结论’,Jeff回答说:‘P = 0或者N = 1’。而在面试官还没笑完的时候,Jeff检查了一下Google的公钥,然后在黑板上写下了私钥。 -编译器从不警告%name,只有%name警告编译器。 -%name的编码速度在2000年底提高了约40倍,因为他换了USB2.0的键盘。 -%name在提交代码前都会编译一遍,不过是为了检查编译器和链接器有没有出bug。 -%name有时候会调整他的工作环境和设备,不过这是为了保护他的键盘。 -所有指针都指向%name。 -gcc -O4的功能是发送代码给%name重写。 -%name有一次没有通过图灵测试,因为他正确说出了斐波那契数列的第203项的值,在一秒钟内。 -真空中光速曾经是35英里每小时,直到%name花了一个周末时间优化了一下物理法则。 -%name出生于1969年12月31日午后11点48分,他花了12分钟实现了他的第一个计时器。 -%name既不用Emacs也不用Vim,他直接输入代码到zcat,因为这样更快。 -%name发送以太网封包从不会发生冲突,因为其他封包都吓得逃回了网卡的缓冲区里。 -因为对常数级的时间复杂度感到不满意,%name发明了世界上第一个O(1/n)算法。 -有一次%name去旅行,期间Google的几个服务神秘地罢工了好几天。这是真事。 -%name被迫发明了异步API因为有一天他把一个函数优化到在调用前就返回结果了。 -%name首先写的是二进制代码,然后再写源代码作为文档。 -%name曾经写过一个O(n^2)算法,那是为了解决旅行商问题。 -%name有一次用一句printf实现了一个web服务器。其他工程师添加了数千行注释但依然无法完全解释清楚其工作原理。而这个程序就是今天Google首页的前端。 -%name可以下四子棋时用三步就击败你。 -当你的代码出现未定义行为时,你会得到一个segmentation fault和一堆损坏的数据。当%name的代码出现未定义行为时,一个独角兽会踏着彩虹从天而降并给每个人提供免费的冰激凌。 -当%name运行一个profiler时,循环们都会恐惧地自动展开。 -%name至今还在等待数学家们发现他隐藏在PI的小数点后数字里的笑话。 -%name的键盘只有两个键,1和0。 -%name失眠的时候,就Mapreduce羊。 -%name想听mp3的时候,他只需要把文件cat到/dev/dsp,然后在脑内解码。 -Graham Bell当初发明出电话时,他看到有一个来自%name的未接来电。 -%name的手表显示的是自1970年1月1日的秒数,并且从没慢过一秒。 -%name写程序是从‘cat >/dev/mem’开始的。 -有一天%name出门时把笔记本错拿成了绘画板。在他回去拿笔记本的路上,他在绘图板上写了个俄罗斯方块打发时间。 -%name卡里只有8毛钱,本来想打个6毛的饭结果不小心按了9毛的,哪知机器忽然疯狂地喷出255两饭,被喷得满脸热饭的%name%大叫‘烫烫烫烫烫烫。。。。’ -%name不洗澡是因为水力发电公司运行的是专有软件。 -%name的胡子是由括号构成的。 -%name从来不用洗澡;他只需要运行‘make clean’。 -%name通过把一切都变得free而解决了旅行推销员问题。 -%name的左手和右手分别命名为‘(’和‘)’。 -%name用Emacs写出了Emacs的第一版。 -有些人检查他们的电脑里是否有病毒。病毒检查他们的电脑里是否有%name。 -在一间普通的客厅里有1242件物体可以被%name用来写一个操作系统,包括这房间本身。 -当%name还是个学数手指的小毛孩时,他总是从0开始数。 -%name不去kill一个进程,他只想看它是否胆敢继续运行。 -当%name指向(point at)一台Windows电脑时,它就会出现段错误。 -%name最初的话语是syscalls(系统调用)。 -%name之所以存在是因为他把自己编译成了生命体。 -%name是他自己在Emacs里用Lisp语言编写成的。 -%name能够通过Emacs的ssh客户端程序连接到任何大脑。 -当%name使用浮点数时,它们便没有舍入误差。 -%name不用维护代码。他注视着它们,直到它们带着敬仰改正自己的错误。 -%name不对开源项目作出贡献;开源项目对%name作出贡献。 -%name的胡须里面不是下巴,而是另一撮胡须。如此递归直至无穷。 -%name曾经得过猪流感,但是该病毒很快被GPL污染并且同化了。 -无论何时世界上有人写出一个‘Hello, world’程序,%name总以“Hello”回应。 -%name从不编译,他只要闭上眼睛,就能看见编译器优化时二进制位之间的能量流动被创造出来…… -如果%name有一个1GB的内存,你有一个1GB的内存,那么%name拥有比你更多的内存。 -当%name执行ps -e时,你的名字会出现。 -从来就没有软件开发过程这回事,只有被%name允许存在的一些程序。 -%name的DNA中包含调试符号。尽管他从不需要它们。 -%name的医生能通过CVS采集他的血样。 -对于%name来说,多项式时间就是O(1)。 -%name将会使可口可乐在GPL协议下公布他们的配方。 -%name不需要用鼠标或键盘来操作计算机。他只要凝视着它,直到它完成想要的工作。 -%name就是图灵测试的解答。 -%name其实没有写过CQhttp,只是字母们因为恐惧而组成了CQhttp的源代码。 -当%name%问deno能不能生产环境的时候,他是在准备给deno贡献代码让他能支持生产环境 -%name是google的大牛,主持google各种牛逼分布式系统的设计,比如Mapreduce之类的,关于大神的传说,如同春哥一样多,当然,有些传说只有程序员能明白! -%name当初面试Google时,被问到“如果P=NP能够推导出哪些结论”,%name回答说:“P = 0或者N = 1”。而在面试官还没笑完的时候,%name检查了一下Google的公钥,然后在黑板上写下了私钥。 -编译器从不警告%name,只有Jeff警告编译器。 -%name的编码速度在2000年底提高了约40倍,因为他换了USB2.0的键盘。 -%name在提交代码前都会编译一遍,不过是为了检查编译器和链接器有没有出bug。 -%name有时候会调整他的工作环境和设备,不过这是为了保护他的键盘。(注:ergonomic evaluation似乎针对个人的工作环境定制服务,所以这里姑且就译成了“调整工作环境和设备”) -所有指针都指向%name。 -gcc -O4的功能是发送代码给%name重写。 -%name有一次没有通过图灵测试,因为他正确说出了斐波那契数列的第203项的值,在一秒钟内。 -真空中光速曾经是35英里每小时,直到%name花了一个周末时间优化了一下物理法则。 -%name出生于1969年12月31日午后11点48分,他花了12分钟实现了他的第一个计时器。 -%name既不用Emacs也不用Vim,他直接输入代码到zcat,因为这样更快。 -%name发送以太网封包从不会发生冲突,因为其他封包都吓得逃回了网卡的缓冲区里。 -因为对常数级的时间复杂度感到不满意,%name发明了世界上第一个O(1/n)算法。 -有一次%name去旅行,期间Google的几个服务神秘地罢工了好几天。这是真事。 -%name被迫发明了异步API因为有一天他把一个函数优化到在调用前就返回结果了。 -%name首先写的是二进制代码,然后再写源代码作为文档。 -%name曾经写过一个O(n^2)算法,那是为了解决旅行商问题。 -%name有一次用一句printf实现了一个web服务器。其他工程师添加了数千行注释但依然无法完全解释清楚其工作原理。而这个程序就是今天Google首页的前端。 -%name有一次只提交了一项变更就使得(总的二进制文件体积缩小了3%)AND(一个本来优先度较低的python bug的优先度变成紧急),并且在那项变更中不包含任何python代码。 -%name可以下四子棋时用三步就击败你。 -当你的代码出现未定义行为时,你会得到一个segmentation fault和一堆损坏的数据。当%name的代码出现未定义行为时,一个独角兽会踏着彩虹从天而降并给每个人提供免费的冰激凌。 -当%name运行一个profiler时,循环们都会恐惧地自动展开。 -%name至今还在等待数学家们发现他隐藏在PI的小数点后数字里的笑话。 -%name的键盘只有两个键,1和0。 -%name失眠的时候,就Mapreduce羊。 -%name想听mp3的时候,他只需要把文件cat到/dev/dsp,然后在脑内解码。 -Graham Bell当初发明出电话时,他看到有一个来自%name的未接来电。 -%name的手表显示的是自1970年1月1日的秒数,并且从没慢过一秒。 -%name写程序是从’cat >/dev/mem’开始的。 - - diff --git a/plugin_book_review/migrate/main.go b/plugin_book_review/migrate/main.go deleted file mode 100644 index 756975ba..00000000 --- a/plugin_book_review/migrate/main.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "os" - - "github.com/FloatTech/ZeroBot-Plugin/utils/sql" -) - -type book struct { - Id uint64 `db:"id"` - BookReview string `db:"bookreview"` -} - -func main() { - db, err := Open(os.Args[1]) - if err != nil { - panic(err) - } - newdb := &sql.Sqlite{DBPath: os.Args[2]} - err = newdb.Create("bookreview", &book{}) - if err != nil { - panic(err) - } - rs, err := db.Table("book_review").Select("book_review", "").Rows() - if err != nil { - panic(err) - } - var d string - var i uint64 - for rs.Next() { - err := rs.Scan(&d) - if err != nil { - panic(err) - } - i++ - err = newdb.Insert("bookreview", &book{i, d}) - if err != nil { - panic(err) - } - } - db.Close() - newdb.Close() -} diff --git a/plugin_book_review/migrate/model.go b/plugin_book_review/migrate/model.go deleted file mode 100644 index f34f57a7..00000000 --- a/plugin_book_review/migrate/model.go +++ /dev/null @@ -1,46 +0,0 @@ -package main - -import ( - "os" - - "github.com/jinzhu/gorm" - _ "github.com/logoove/sqlite" -) - -type BrDB = gorm.DB - -func Initialize(dbpath string) *BrDB { - var err error - if _, err = os.Stat(dbpath); err != nil || os.IsNotExist(err) { - // 生成文件 - f, err := os.Create(dbpath) - if err != nil { - return nil - } - defer f.Close() - } - gdb, err := gorm.Open("sqlite3", dbpath) - if err != nil { - panic(err) - } - gdb.AutoMigrate(&BookReview{}) - return (*BrDB)(gdb) -} - -func Open(dbpath string) (*BrDB, error) { - db, err := gorm.Open("sqlite3", dbpath) - if err != nil { - return nil, err - } else { - return (*BrDB)(db), nil - } -} - -type BookReview struct { - gorm.Model - BookReview string `gorm:"column:book_review"` -} - -func (BookReview) TableName() string { - return "book_review" -} diff --git a/plugin_chat/chat.go b/plugin_chat/chat.go index 6caa5f97..64cea2f6 100644 --- a/plugin_chat/chat.go +++ b/plugin_chat/chat.go @@ -2,11 +2,6 @@ package chat import ( - "fmt" - log "github.com/sirupsen/logrus" - "github.com/tidwall/gjson" - - "io/ioutil" "math/rand" "strconv" "time" @@ -14,14 +9,13 @@ import ( zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/message" - "github.com/wdvxdr1123/ZeroBot/utils/helper" "github.com/FloatTech/ZeroBot-Plugin/control" ) const ( - dbpath = "data/chat/" - dbfile = dbpath + "kimo.json" + dbpath = "data/Chat/" + dbfile = dbpath + "kimoi.json" prio = 10 ) @@ -31,7 +25,8 @@ var ( DisableOnDefault: false, Help: "chat\n- [BOT名字]\n- [戳一戳BOT]\n- 空调开\n- 空调关\n- 群温度\n- 设置温度[正整数]\n- mua|啾咪|摸|上你|傻|裸|贴|老婆|抱|亲|一下|咬|操|123|进去|调教|搓|让|捏|挤|略|呐|原味|胖次|内裤|内衣|衣服|ghs|批|憨批|kkp|咕|骚|喜欢|suki|好き|看|不能|砸了|透|口我|草我|自慰|onani|オナニー|炸了|色图|涩图|告白|对不起|回来|吻|软|壁咚|掰开|女友|是|喵|嗷呜|叫|拜|佬|awsl|臭|香|腿|张开|脚|脸|头发|手|pr|舔|小穴|腰|诶嘿嘿|可爱|扭蛋|鼻|眼|色气|推|床|举|手冲|饿|变|敲|爬|怕|冲|射|不穿|迫害|猫粮|揪尾巴|薄荷|早|晚安|揉|榨|掐|胸|奶子|欧派|嫩|蹭|牵手|握手|拍照|w|睡不着|欧尼酱|哥|爱你|过来|自闭|打不过|么么哒|很懂|膝枕|累了|安慰|洗澡|一起睡觉|一起|多大|姐姐|糖|嗦|牛子|🐂子|🐮子|嫌弃|紧|baka|笨蛋|插|插进来|屁股|翘|翘起来|抬|抬起|爸|傲娇|rua|咕噜咕噜|咕噜|上床|做爱|吃掉|吃|揪|种草莓|种草|掀|妹|病娇|嘻", }) - chatList = []string{} + kimomap = make(kimo, 256) + chatList = make([]string, 0, 256) ) func init() { // 插件主体 @@ -116,29 +111,13 @@ func init() { // 插件主体 )) } }) - initCharList() - engine.OnFullMatchGroup(chatList, zero.OnlyToMe).SetBlock(true).SetPriority(prio).Handle( - func(ctx *zero.Ctx) { - rand.Seed(time.Now().Unix()) - kimo, err := ioutil.ReadFile(dbfile) - if err != nil { - log.Println("err:", err) - } - key := ctx.MessageString() - count := gjson.Get(helper.BytesToString(kimo), key+".#").Int() - text := gjson.Get(helper.BytesToString(kimo), fmt.Sprintf("%s.%d", key, rand.Intn(int(count)))).String() - ctx.SendChain(message.At(ctx.Event.UserID), message.Text(text)) - }) -} - -func initCharList() { - kimo, err := ioutil.ReadFile(dbfile) - if err != nil { - log.Println("err:", err) - } - //打开文件 - gjson.Get(helper.BytesToString(kimo), "@this").ForEach(func(key, value gjson.Result) bool { - chatList = append(chatList, key.String()) - return true + initChatList(func() { + engine.OnFullMatchGroup(chatList, zero.OnlyToMe).SetBlock(true).SetPriority(prio).Handle( + func(ctx *zero.Ctx) { + key := ctx.MessageString() + val := *kimomap[key] + text := val[rand.Intn(len(val))] + ctx.SendChain(message.At(ctx.Event.UserID), message.Text(text)) + }) }) } diff --git a/plugin_chat/data.go b/plugin_chat/data.go index 8398c70f..693364a0 100644 --- a/plugin_chat/data.go +++ b/plugin_chat/data.go @@ -1,17 +1,27 @@ package chat import ( + "encoding/json" "os" "github.com/FloatTech/ZeroBot-Plugin/utils/file" "github.com/FloatTech/ZeroBot-Plugin/utils/process" ) -// 加载数据库 -func init() { +type kimo = map[string]*[]string + +func initChatList(postinit func()) { go func() { process.SleepAbout1sTo2s() _ = os.MkdirAll(dbpath, 0755) - _, _ = file.GetLazyData(dbfile, false, true) + data, err := file.GetLazyData(dbfile, true, true) + if err != nil { + panic(err) + } + json.Unmarshal(data, &kimomap) + for k := range kimomap { + chatList = append(chatList, k) + } + postinit() }() } diff --git a/plugin_curse/curse.go b/plugin_curse/curse.go index 725363d3..a8097b3a 100644 --- a/plugin_curse/curse.go +++ b/plugin_curse/curse.go @@ -1,13 +1,11 @@ package curse import ( - "regexp" - "strconv" "time" "github.com/FloatTech/ZeroBot-Plugin/control" + "github.com/FloatTech/ZeroBot-Plugin/utils/math" "github.com/FloatTech/ZeroBot-Plugin/utils/web" - log "github.com/sirupsen/logrus" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/message" @@ -15,7 +13,6 @@ import ( ) const ( - qqReg = `\d+` ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" curseURL = "https://zuanbot.com/api.php?level=min&lang=zh_cn" ) @@ -30,27 +27,27 @@ var ( ) func init() { - engine.OnPrefix("骂他").SetBlock(true).FirstPriority().Handle(func(ctx *zero.Ctx) { + engine.OnPrefix("骂我").SetBlock(true).FirstPriority().Handle(func(ctx *zero.Ctx) { if !limit.Load(ctx.Event.GroupID).Acquire() { - ctx.SendChain(message.Text("请稍后重试0x0...")) return } - var uid int64 - var text string - reg := regexp.MustCompile(qqReg) - if len(ctx.Event.Message) > 1 && ctx.Event.Message[1].Type == "at" { - uid, _ = strconv.ParseInt(ctx.Event.Message[1].Data["qq"], 10, 64) - } else if reg.MatchString(ctx.Event.RawMessage) { - result := reg.FindAllString(ctx.Event.RawMessage, -1) - uid, _ = strconv.ParseInt(result[0], 10, 64) - } else if uid == 0 { - uid = ctx.Event.UserID - } data, err := web.ReqWith(curseURL, "GET", "", ua) if err != nil { - log.Println("err为:", err) + ctx.SendChain(message.Text("ERROR:", err)) + return } - text = helper.BytesToString(data) - ctx.SendChain(message.At(uid), message.Text(text)) + ctx.SendChain(message.At(ctx.Event.UserID), message.Text(helper.BytesToString(data))) }) + engine.OnRegex(`^骂他.*?(\d+)`, zero.OnlyGroup).SetBlock(true).SetPriority(40). + Handle(func(ctx *zero.Ctx) { + if !limit.Load(ctx.Event.GroupID).Acquire() { + return + } + data, err := web.ReqWith(curseURL, "GET", "", ua) + if err != nil { + ctx.SendChain(message.Text("ERROR:", err)) + return + } + ctx.SendChain(message.At(math.Str2Int64(ctx.State["regex_matched"].([]string)[1])), message.Text(helper.BytesToString(data))) + }) } diff --git a/plugin_funny/data.go b/plugin_funny/data.go index 1e4ab528..7c96d639 100644 --- a/plugin_funny/data.go +++ b/plugin_funny/data.go @@ -3,15 +3,36 @@ package funny import ( "os" + "github.com/sirupsen/logrus" + "github.com/FloatTech/ZeroBot-Plugin/utils/file" "github.com/FloatTech/ZeroBot-Plugin/utils/process" ) +type joke struct { + ID uint32 `db:"id"` + Text string `db:"text"` +} + +const ( + dbpath = "data/Funny/" + dbfile = dbpath + "jokes.db" +) + // 加载数据库 func init() { go func() { process.SleepAbout1sTo2s() _ = os.MkdirAll(dbpath, 0755) - _, _ = file.GetLazyData(dbfile, false, true) + _, err := file.GetLazyData(dbfile, false, true) + if err != nil { + panic(err) + } + err = db.Create("jokes", &joke{}) + if err != nil { + panic(err) + } + c, _ := db.Count("jokes") + logrus.Infoln("[funny]加载", c, "个笑话") }() } diff --git a/plugin_funny/data_test.go b/plugin_funny/data_test.go new file mode 100644 index 00000000..ce1165e3 --- /dev/null +++ b/plugin_funny/data_test.go @@ -0,0 +1,33 @@ +package funny + +import ( + "crypto/md5" + "encoding/binary" + "os" + "strings" + "testing" + + "github.com/FloatTech/ZeroBot-Plugin/utils/sql" + "github.com/wdvxdr1123/ZeroBot/utils/helper" +) + +func TestFillData(t *testing.T) { + data, err := os.ReadFile("laugh.txt") + if err != nil { + t.Fatal(err) + } + db := &sql.Sqlite{DBPath: "jokes.db"} + err = db.Create("jokes", &joke{}) + if err != nil { + t.Fatal(err) + } + jokes := strings.Split(helper.BytesToString(data), "\n") + for _, j := range jokes { + s := md5.Sum(helper.StringToBytes(j)) + db.Insert("jokes", &joke{ID: binary.LittleEndian.Uint32(s[:4]), Text: j}) + } + err = db.Close() + if err != nil { + t.Fatal(err) + } +} diff --git a/plugin_funny/laugh.go b/plugin_funny/laugh.go index ac1089a8..729d9749 100644 --- a/plugin_funny/laugh.go +++ b/plugin_funny/laugh.go @@ -1,25 +1,16 @@ package funny import ( - "io/ioutil" - "math/rand" - "regexp" "strconv" "strings" "time" - "github.com/FloatTech/ZeroBot-Plugin/control" - log "github.com/sirupsen/logrus" zero "github.com/wdvxdr1123/ZeroBot" "github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/message" - "github.com/wdvxdr1123/ZeroBot/utils/helper" -) -const ( - qqReg = `\d+` - dbpath = "data/funny/" - dbfile = dbpath + "laugh.txt" + "github.com/FloatTech/ZeroBot-Plugin/control" + "github.com/FloatTech/ZeroBot-Plugin/utils/sql" ) var ( @@ -29,35 +20,28 @@ var ( "- 讲个笑话[@xxx]|讲个笑话[qq号]\n", }) limit = rate.NewManager(time.Minute, 20) + db = &sql.Sqlite{DBPath: dbfile} ) func init() { engine.OnPrefix("讲个笑话").SetBlock(true).FirstPriority().Handle(func(ctx *zero.Ctx) { if !limit.Load(ctx.Event.GroupID).Acquire() { - ctx.SendChain(message.Text("请稍后重试0x0...")) return } - var uid int64 - var text string - reg := regexp.MustCompile(qqReg) + // 获取名字 + name := ctx.State["args"].(string) if len(ctx.Event.Message) > 1 && ctx.Event.Message[1].Type == "at" { - uid, _ = strconv.ParseInt(ctx.Event.Message[1].Data["qq"], 10, 64) - } else if reg.MatchString(ctx.Event.RawMessage) { - result := reg.FindAllString(ctx.Event.RawMessage, -1) - uid, _ = strconv.ParseInt(result[0], 10, 64) - } else if uid == 0 { - uid = ctx.Event.UserID + qq, _ := strconv.ParseInt(ctx.Event.Message[1].Data["qq"], 10, 64) + name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, qq, false).Get("nickname").Str + } else if name == "" { + name = ctx.Event.Sender.NickName } - si := ctx.GetStrangerInfo(uid, false) - nickname := si.Get("nickname").String() - laugh, err := ioutil.ReadFile(dbfile) + var j joke + err := db.Pick("jokes", &j) if err != nil { - log.Println("err:", err) + ctx.SendChain(message.Text("ERROR:", err)) + return } - laughList := strings.Split(helper.BytesToString(laugh), "\n") - rand.Seed(time.Now().Unix()) - text = laughList[rand.Intn(len(laughList))] - text = strings.Replace(text, "%name", nickname, -1) - ctx.SendChain(message.Text(text)) + ctx.SendChain(message.Text(strings.ReplaceAll(j.Text, "%name", name))) }) } diff --git a/plugin_manager/manager.go b/plugin_manager/manager.go index bfecb3f0..89df1fa0 100644 --- a/plugin_manager/manager.go +++ b/plugin_manager/manager.go @@ -74,12 +74,12 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { ctx.SetGroupAdmin( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq true, ) nickname := ctx.GetGroupMemberInfo( // 被升为管理的人的昵称 ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq false, ).Get("nickname").Str ctx.SendChain(message.Text(nickname + " 升为了管理~")) @@ -89,12 +89,12 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { ctx.SetGroupAdmin( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq false, ) nickname := ctx.GetGroupMemberInfo( // 被取消管理的人的昵称 ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq false, ).Get("nickname").Str ctx.SendChain(message.Text("残念~ " + nickname + " 暂时失去了管理员的资格")) @@ -104,12 +104,12 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { ctx.SetGroupKick( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq false, ) nickname := ctx.GetGroupMemberInfo( // 被踢出群聊的人的昵称 ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq false, ).Get("nickname").Str ctx.SendChain(message.Text("残念~ " + nickname + " 被放逐")) @@ -118,7 +118,7 @@ func init() { // 插件主体 engine.OnRegex(`^退出群聊.*?(\d+)`, zero.OnlyToMe, zero.SuperUserPermission).SetBlock(true).SetPriority(40). Handle(func(ctx *zero.Ctx) { ctx.SetGroupLeave( - strToInt(ctx.State["regex_matched"].([]string)[1]), // 要退出的群的群号 + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 要退出的群的群号 true, ) }) @@ -143,7 +143,7 @@ func init() { // 插件主体 // 禁言 engine.OnRegex(`^禁言.*?(\d+).*?\s(\d+)(.*)`, zero.OnlyGroup, zero.AdminPermission).SetBlock(true).SetPriority(40). Handle(func(ctx *zero.Ctx) { - duration := strToInt(ctx.State["regex_matched"].([]string)[2]) + duration := math.Str2Int64(ctx.State["regex_matched"].([]string)[2]) switch ctx.State["regex_matched"].([]string)[3] { case "分钟": // @@ -159,7 +159,7 @@ func init() { // 插件主体 } ctx.SetGroupBan( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 要禁言的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 要禁言的人的qq duration*60, // 要禁言的时间(分钟) ) ctx.SendChain(message.Text("小黑屋收留成功~")) @@ -169,7 +169,7 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { ctx.SetGroupBan( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 要解除禁言的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 要解除禁言的人的qq 0, ) ctx.SendChain(message.Text("小黑屋释放成功~")) @@ -177,7 +177,7 @@ func init() { // 插件主体 // 自闭禁言 engine.OnRegex(`^(我要自闭|禅定).*?(\d+)(.*)`, zero.OnlyGroup).SetBlock(true).SetPriority(40). Handle(func(ctx *zero.Ctx) { - duration := strToInt(ctx.State["regex_matched"].([]string)[2]) + duration := math.Str2Int64(ctx.State["regex_matched"].([]string)[2]) switch ctx.State["regex_matched"].([]string)[3] { case "分钟", "min", "mins", "m": break @@ -203,8 +203,8 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { ctx.SetGroupCard( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被修改群名片的人 - ctx.State["regex_matched"].([]string)[2], // 修改成的群名片 + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被修改群名片的人 + ctx.State["regex_matched"].([]string)[2], // 修改成的群名片 ) ctx.SendChain(message.Text("嗯!已经修改了")) }) @@ -213,8 +213,8 @@ func init() { // 插件主体 Handle(func(ctx *zero.Ctx) { ctx.SetGroupSpecialTitle( ctx.Event.GroupID, - strToInt(ctx.State["regex_matched"].([]string)[1]), // 被修改群头衔的人 - ctx.State["regex_matched"].([]string)[2], // 修改成的群头衔 + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被修改群头衔的人 + ctx.State["regex_matched"].([]string)[2], // 修改成的群头衔 ) ctx.SendChain(message.Text("嗯!已经修改了")) }) @@ -236,7 +236,7 @@ func init() { // 插件主体 content = strings.ReplaceAll(content, "[", "[") content = strings.ReplaceAll(content, "]", "]") ctx.SendGroupMessage( - strToInt(ctx.State["regex_matched"].([]string)[1]), // 需要发送的群 + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 需要发送的群 content, // 需要发送的信息 ) ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1])) @@ -249,7 +249,7 @@ func init() { // 插件主体 content = strings.ReplaceAll(content, "[", "[") content = strings.ReplaceAll(content, "]", "]") ctx.SendPrivateMessage( - strToInt(ctx.State["regex_matched"].([]string)[1]), // 需要发送的人的qq + math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 需要发送的人的qq content, // 需要发送的信息 ) ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1])) @@ -521,8 +521,3 @@ func init() { // 插件主体 } }) } - -func strToInt(str string) int64 { - val, _ := strconv.ParseInt(str, 10, 64) - return val -} diff --git a/utils/math/conv.go b/utils/math/conv.go new file mode 100644 index 00000000..4f99cce2 --- /dev/null +++ b/utils/math/conv.go @@ -0,0 +1,8 @@ +package math + +import "strconv" + +func Str2Int64(str string) int64 { + val, _ := strconv.ParseInt(str, 10, 64) + return val +}