✏️ 优化代码结构

This commit is contained in:
fumiama 2021-12-21 22:09:43 +08:00
parent b953385bc5
commit 1d3a61386d
13 changed files with 136 additions and 364 deletions

BIN
data/Funny/jokes.db Normal file

Binary file not shown.

View File

@ -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开始的。

View File

@ -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()
}

View File

@ -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"
}

View File

@ -2,11 +2,6 @@
package chat package chat
import ( import (
"fmt"
log "github.com/sirupsen/logrus"
"github.com/tidwall/gjson"
"io/ioutil"
"math/rand" "math/rand"
"strconv" "strconv"
"time" "time"
@ -14,14 +9,13 @@ import (
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/extension/rate"
"github.com/wdvxdr1123/ZeroBot/message" "github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
"github.com/FloatTech/ZeroBot-Plugin/control" "github.com/FloatTech/ZeroBot-Plugin/control"
) )
const ( const (
dbpath = "data/chat/" dbpath = "data/Chat/"
dbfile = dbpath + "kimo.json" dbfile = dbpath + "kimoi.json"
prio = 10 prio = 10
) )
@ -31,7 +25,8 @@ var (
DisableOnDefault: false, DisableOnDefault: false,
Help: "chat\n- [BOT名字]\n- [戳一戳BOT]\n- 空调开\n- 空调关\n- 群温度\n- 设置温度[正整数]\n- mua|啾咪|摸|上你|傻|裸|贴|老婆|抱|亲|一下|咬|操|123|进去|调教|搓|让|捏|挤|略|呐|原味|胖次|内裤|内衣|衣服|ghs|批|憨批|kkp|咕|骚|喜欢|suki|好き|看|不能|砸了|透|口我|草我|自慰|onani|オナニー|炸了|色图|涩图|告白|对不起|回来|吻|软|壁咚|掰开|女友|是|喵|嗷呜|叫|拜|佬|awsl|臭|香|腿|张开|脚|脸|头发|手|pr|舔|小穴|腰|诶嘿嘿|可爱|扭蛋|鼻|眼|色气|推|床|举|手冲|饿|变|敲|爬|怕|冲|射|不穿|迫害|猫粮|揪尾巴|薄荷|早|晚安|揉|榨|掐|胸|奶子|欧派|嫩|蹭|牵手|握手|拍照|w|睡不着|欧尼酱|哥|爱你|过来|自闭|打不过|么么哒|很懂|膝枕|累了|安慰|洗澡|一起睡觉|一起|多大|姐姐|糖|嗦|牛子|🐂子|🐮子|嫌弃|紧|baka|笨蛋|插|插进来|屁股|翘|翘起来|抬|抬起|爸|傲娇|rua|咕噜咕噜|咕噜|上床|做爱|吃掉|吃|揪|种草莓|种草|掀|妹|病娇|嘻", 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() { // 插件主体 func init() { // 插件主体
@ -116,29 +111,13 @@ func init() { // 插件主体
)) ))
} }
}) })
initCharList() initChatList(func() {
engine.OnFullMatchGroup(chatList, zero.OnlyToMe).SetBlock(true).SetPriority(prio).Handle( engine.OnFullMatchGroup(chatList, zero.OnlyToMe).SetBlock(true).SetPriority(prio).Handle(
func(ctx *zero.Ctx) { func(ctx *zero.Ctx) {
rand.Seed(time.Now().Unix())
kimo, err := ioutil.ReadFile(dbfile)
if err != nil {
log.Println("err:", err)
}
key := ctx.MessageString() key := ctx.MessageString()
count := gjson.Get(helper.BytesToString(kimo), key+".#").Int() val := *kimomap[key]
text := gjson.Get(helper.BytesToString(kimo), fmt.Sprintf("%s.%d", key, rand.Intn(int(count)))).String() text := val[rand.Intn(len(val))]
ctx.SendChain(message.At(ctx.Event.UserID), message.Text(text)) 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
}) })
} }

View File

@ -1,17 +1,27 @@
package chat package chat
import ( import (
"encoding/json"
"os" "os"
"github.com/FloatTech/ZeroBot-Plugin/utils/file" "github.com/FloatTech/ZeroBot-Plugin/utils/file"
"github.com/FloatTech/ZeroBot-Plugin/utils/process" "github.com/FloatTech/ZeroBot-Plugin/utils/process"
) )
// 加载数据库 type kimo = map[string]*[]string
func init() {
func initChatList(postinit func()) {
go func() { go func() {
process.SleepAbout1sTo2s() process.SleepAbout1sTo2s()
_ = os.MkdirAll(dbpath, 0755) _ = 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()
}() }()
} }

View File

@ -1,13 +1,11 @@
package curse package curse
import ( import (
"regexp"
"strconv"
"time" "time"
"github.com/FloatTech/ZeroBot-Plugin/control" "github.com/FloatTech/ZeroBot-Plugin/control"
"github.com/FloatTech/ZeroBot-Plugin/utils/math"
"github.com/FloatTech/ZeroBot-Plugin/utils/web" "github.com/FloatTech/ZeroBot-Plugin/utils/web"
log "github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/extension/rate"
"github.com/wdvxdr1123/ZeroBot/message" "github.com/wdvxdr1123/ZeroBot/message"
@ -15,7 +13,6 @@ import (
) )
const ( 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" 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" curseURL = "https://zuanbot.com/api.php?level=min&lang=zh_cn"
) )
@ -30,27 +27,27 @@ var (
) )
func init() { 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() { if !limit.Load(ctx.Event.GroupID).Acquire() {
ctx.SendChain(message.Text("请稍后重试0x0..."))
return 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) data, err := web.ReqWith(curseURL, "GET", "", ua)
if err != nil { if err != nil {
log.Println("err为:", err) ctx.SendChain(message.Text("ERROR:", err))
return
} }
text = helper.BytesToString(data) ctx.SendChain(message.At(ctx.Event.UserID), message.Text(helper.BytesToString(data)))
ctx.SendChain(message.At(uid), message.Text(text)) })
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)))
}) })
} }

View File

@ -3,15 +3,36 @@ package funny
import ( import (
"os" "os"
"github.com/sirupsen/logrus"
"github.com/FloatTech/ZeroBot-Plugin/utils/file" "github.com/FloatTech/ZeroBot-Plugin/utils/file"
"github.com/FloatTech/ZeroBot-Plugin/utils/process" "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() { func init() {
go func() { go func() {
process.SleepAbout1sTo2s() process.SleepAbout1sTo2s()
_ = os.MkdirAll(dbpath, 0755) _ = 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, "个笑话")
}() }()
} }

33
plugin_funny/data_test.go Normal file
View File

@ -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)
}
}

View File

@ -1,25 +1,16 @@
package funny package funny
import ( import (
"io/ioutil"
"math/rand"
"regexp"
"strconv" "strconv"
"strings" "strings"
"time" "time"
"github.com/FloatTech/ZeroBot-Plugin/control"
log "github.com/sirupsen/logrus"
zero "github.com/wdvxdr1123/ZeroBot" zero "github.com/wdvxdr1123/ZeroBot"
"github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/extension/rate"
"github.com/wdvxdr1123/ZeroBot/message" "github.com/wdvxdr1123/ZeroBot/message"
"github.com/wdvxdr1123/ZeroBot/utils/helper"
)
const ( "github.com/FloatTech/ZeroBot-Plugin/control"
qqReg = `\d+` "github.com/FloatTech/ZeroBot-Plugin/utils/sql"
dbpath = "data/funny/"
dbfile = dbpath + "laugh.txt"
) )
var ( var (
@ -29,35 +20,28 @@ var (
"- 讲个笑话[@xxx]|讲个笑话[qq号]\n", "- 讲个笑话[@xxx]|讲个笑话[qq号]\n",
}) })
limit = rate.NewManager(time.Minute, 20) limit = rate.NewManager(time.Minute, 20)
db = &sql.Sqlite{DBPath: dbfile}
) )
func init() { 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() { if !limit.Load(ctx.Event.GroupID).Acquire() {
ctx.SendChain(message.Text("请稍后重试0x0..."))
return return
} }
var uid int64 // 获取名字
var text string name := ctx.State["args"].(string)
reg := regexp.MustCompile(qqReg)
if len(ctx.Event.Message) > 1 && ctx.Event.Message[1].Type == "at" { if len(ctx.Event.Message) > 1 && ctx.Event.Message[1].Type == "at" {
uid, _ = strconv.ParseInt(ctx.Event.Message[1].Data["qq"], 10, 64) qq, _ := strconv.ParseInt(ctx.Event.Message[1].Data["qq"], 10, 64)
} else if reg.MatchString(ctx.Event.RawMessage) { name = ctx.GetGroupMemberInfo(ctx.Event.GroupID, qq, false).Get("nickname").Str
result := reg.FindAllString(ctx.Event.RawMessage, -1) } else if name == "" {
uid, _ = strconv.ParseInt(result[0], 10, 64) name = ctx.Event.Sender.NickName
} else if uid == 0 {
uid = ctx.Event.UserID
} }
si := ctx.GetStrangerInfo(uid, false) var j joke
nickname := si.Get("nickname").String() err := db.Pick("jokes", &j)
laugh, err := ioutil.ReadFile(dbfile)
if err != nil { if err != nil {
log.Println("err:", err) ctx.SendChain(message.Text("ERROR:", err))
return
} }
laughList := strings.Split(helper.BytesToString(laugh), "\n") ctx.SendChain(message.Text(strings.ReplaceAll(j.Text, "%name", name)))
rand.Seed(time.Now().Unix())
text = laughList[rand.Intn(len(laughList))]
text = strings.Replace(text, "%name", nickname, -1)
ctx.SendChain(message.Text(text))
}) })
} }

View File

@ -74,12 +74,12 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupAdmin( ctx.SetGroupAdmin(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq
true, true,
) )
nickname := ctx.GetGroupMemberInfo( // 被升为管理的人的昵称 nickname := ctx.GetGroupMemberInfo( // 被升为管理的人的昵称
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被升为管理的人的qq
false, false,
).Get("nickname").Str ).Get("nickname").Str
ctx.SendChain(message.Text(nickname + " 升为了管理~")) ctx.SendChain(message.Text(nickname + " 升为了管理~"))
@ -89,12 +89,12 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupAdmin( ctx.SetGroupAdmin(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq
false, false,
) )
nickname := ctx.GetGroupMemberInfo( // 被取消管理的人的昵称 nickname := ctx.GetGroupMemberInfo( // 被取消管理的人的昵称
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被取消管理的人的qq
false, false,
).Get("nickname").Str ).Get("nickname").Str
ctx.SendChain(message.Text("残念~ " + nickname + " 暂时失去了管理员的资格")) ctx.SendChain(message.Text("残念~ " + nickname + " 暂时失去了管理员的资格"))
@ -104,12 +104,12 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupKick( ctx.SetGroupKick(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq
false, false,
) )
nickname := ctx.GetGroupMemberInfo( // 被踢出群聊的人的昵称 nickname := ctx.GetGroupMemberInfo( // 被踢出群聊的人的昵称
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被踢出群聊的人的qq
false, false,
).Get("nickname").Str ).Get("nickname").Str
ctx.SendChain(message.Text("残念~ " + nickname + " 被放逐")) ctx.SendChain(message.Text("残念~ " + nickname + " 被放逐"))
@ -118,7 +118,7 @@ func init() { // 插件主体
engine.OnRegex(`^退出群聊.*?(\d+)`, zero.OnlyToMe, zero.SuperUserPermission).SetBlock(true).SetPriority(40). engine.OnRegex(`^退出群聊.*?(\d+)`, zero.OnlyToMe, zero.SuperUserPermission).SetBlock(true).SetPriority(40).
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupLeave( ctx.SetGroupLeave(
strToInt(ctx.State["regex_matched"].([]string)[1]), // 要退出的群的群号 math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 要退出的群的群号
true, true,
) )
}) })
@ -143,7 +143,7 @@ func init() { // 插件主体
// 禁言 // 禁言
engine.OnRegex(`^禁言.*?(\d+).*?\s(\d+)(.*)`, zero.OnlyGroup, zero.AdminPermission).SetBlock(true).SetPriority(40). engine.OnRegex(`^禁言.*?(\d+).*?\s(\d+)(.*)`, zero.OnlyGroup, zero.AdminPermission).SetBlock(true).SetPriority(40).
Handle(func(ctx *zero.Ctx) { 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] { switch ctx.State["regex_matched"].([]string)[3] {
case "分钟": case "分钟":
// //
@ -159,7 +159,7 @@ func init() { // 插件主体
} }
ctx.SetGroupBan( ctx.SetGroupBan(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 要禁言的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 要禁言的人的qq
duration*60, // 要禁言的时间(分钟) duration*60, // 要禁言的时间(分钟)
) )
ctx.SendChain(message.Text("小黑屋收留成功~")) ctx.SendChain(message.Text("小黑屋收留成功~"))
@ -169,7 +169,7 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupBan( ctx.SetGroupBan(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 要解除禁言的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 要解除禁言的人的qq
0, 0,
) )
ctx.SendChain(message.Text("小黑屋释放成功~")) ctx.SendChain(message.Text("小黑屋释放成功~"))
@ -177,7 +177,7 @@ func init() { // 插件主体
// 自闭禁言 // 自闭禁言
engine.OnRegex(`^(我要自闭|禅定).*?(\d+)(.*)`, zero.OnlyGroup).SetBlock(true).SetPriority(40). engine.OnRegex(`^(我要自闭|禅定).*?(\d+)(.*)`, zero.OnlyGroup).SetBlock(true).SetPriority(40).
Handle(func(ctx *zero.Ctx) { 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] { switch ctx.State["regex_matched"].([]string)[3] {
case "分钟", "min", "mins", "m": case "分钟", "min", "mins", "m":
break break
@ -203,7 +203,7 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupCard( ctx.SetGroupCard(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被修改群名片的人 math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被修改群名片的人
ctx.State["regex_matched"].([]string)[2], // 修改成的群名片 ctx.State["regex_matched"].([]string)[2], // 修改成的群名片
) )
ctx.SendChain(message.Text("嗯!已经修改了")) ctx.SendChain(message.Text("嗯!已经修改了"))
@ -213,7 +213,7 @@ func init() { // 插件主体
Handle(func(ctx *zero.Ctx) { Handle(func(ctx *zero.Ctx) {
ctx.SetGroupSpecialTitle( ctx.SetGroupSpecialTitle(
ctx.Event.GroupID, ctx.Event.GroupID,
strToInt(ctx.State["regex_matched"].([]string)[1]), // 被修改群头衔的人 math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 被修改群头衔的人
ctx.State["regex_matched"].([]string)[2], // 修改成的群头衔 ctx.State["regex_matched"].([]string)[2], // 修改成的群头衔
) )
ctx.SendChain(message.Text("嗯!已经修改了")) ctx.SendChain(message.Text("嗯!已经修改了"))
@ -236,7 +236,7 @@ func init() { // 插件主体
content = strings.ReplaceAll(content, "[", "[") content = strings.ReplaceAll(content, "[", "[")
content = strings.ReplaceAll(content, "]", "]") content = strings.ReplaceAll(content, "]", "]")
ctx.SendGroupMessage( ctx.SendGroupMessage(
strToInt(ctx.State["regex_matched"].([]string)[1]), // 需要发送的群 math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 需要发送的群
content, // 需要发送的信息 content, // 需要发送的信息
) )
ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1])) ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1]))
@ -249,7 +249,7 @@ func init() { // 插件主体
content = strings.ReplaceAll(content, "[", "[") content = strings.ReplaceAll(content, "[", "[")
content = strings.ReplaceAll(content, "]", "]") content = strings.ReplaceAll(content, "]", "]")
ctx.SendPrivateMessage( ctx.SendPrivateMessage(
strToInt(ctx.State["regex_matched"].([]string)[1]), // 需要发送的人的qq math.Str2Int64(ctx.State["regex_matched"].([]string)[1]), // 需要发送的人的qq
content, // 需要发送的信息 content, // 需要发送的信息
) )
ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1])) 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
}

8
utils/math/conv.go Normal file
View File

@ -0,0 +1,8 @@
package math
import "strconv"
func Str2Int64(str string) int64 {
val, _ := strconv.ParseInt(str, 10, 64)
return val
}