diff --git a/README.md b/README.md index 0586a764..204c1c29 100644 --- a/README.md +++ b/README.md @@ -133,6 +133,9 @@ - [x] ?? [缩写] - **选择困难症帮手** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_choose"` - [x] 选择[选择项1]还是[选项2]还是[更多选项] +- **投胎** `import _ "github.com/FloatTech/ZeroBot-Plugin/plugin_reborn"` + - [x] reborn + - 注:本插件来源于[tgbot](https://github.com/YukariChiba/tgbot/blob/main/modules/Reborn.py) - **TODO...** ## 使用方法 diff --git a/data/Reborn/rate.json b/data/Reborn/rate.json new file mode 100644 index 00000000..4e4085dd --- /dev/null +++ b/data/Reborn/rate.json @@ -0,0 +1,906 @@ +[ + { + "name": "印度", + "weight": 0.179369185 + }, + { + "weight": 0.116660088, + "name": "中华人民共和国" + }, + { + "name": "尼日利亚", + "weight": 0.052104876 + }, + { + "weight": 0.04490831, + "name": "巴基斯坦" + }, + { + "weight": 0.029767875, + "name": "印尼" + }, + { + "weight": 0.02917347, + "name": "美国" + }, + { + "name": "刚果民主共和国", + "weight": 0.026980482 + }, + { + "weight": 0.02653533, + "name": "埃塞俄比亚" + }, + { + "name": "孟加拉国", + "weight": 0.022001723 + }, + { + "name": "巴西", + "weight": 0.020641351 + }, + { + "name": "埃及", + "weight": 0.019722924 + }, + { + "name": "菲律宾", + "weight": 0.017944256 + }, + { + "name": "墨西哥", + "weight": 0.015798468 + }, + { + "weight": 0.015156998, + "name": "坦桑尼亚" + }, + { + "weight": 0.013686862, + "name": "乌干达" + }, + { + "weight": 0.010405389, + "name": "俄罗斯" + }, + { + "weight": 0.010217107, + "name": "苏丹" + }, + { + "weight": 0.010079201, + "name": "越南" + }, + { + "name": "阿富汗", + "weight": 0.009796745 + }, + { + "name": "伊朗", + "weight": 0.009789926 + }, + { + "name": "肯尼亚", + "weight": 0.009216044 + }, + { + "weight": 0.008870993, + "name": "安哥拉" + }, + { + "name": "土耳其", + "weight": 0.008815318 + }, + { + "weight": 0.008267509, + "name": "莫桑比克" + }, + { + "name": "南非", + "weight": 0.007826801 + }, + { + "weight": 0.00755071, + "name": "尼日尔" + }, + { + "name": "伊拉克", + "weight": 0.007350484 + }, + { + "name": "喀麦隆", + "weight": 0.006786572 + }, + { + "weight": 0.006782117, + "name": "缅甸" + }, + { + "name": "日本", + "weight": 0.006518972 + }, + { + "weight": 0.006384764, + "name": "加纳" + }, + { + "weight": 0.006183538, + "name": "阿尔及利亚" + }, + { + "weight": 0.006075416, + "name": "马里" + }, + { + "name": "法国", + "weight": 0.00571344 + }, + { + "name": "英国", + "weight": 0.005662409 + }, + { + "name": "马达加斯加", + "weight": 0.00559132 + }, + { + "weight": 0.005562893, + "name": "也门" + }, + { + "name": "哥伦比亚", + "weight": 0.005525953 + }, + { + "name": "布基纳法索", + "weight": 0.005378297 + }, + { + "name": "科特迪瓦", + "weight": 0.005352997 + }, + { + "name": "阿根廷", + "weight": 0.005171935 + }, + { + "name": "赞比亚", + "weight": 0.005147159 + }, + { + "name": "德国", + "weight": 0.005096501 + }, + { + "weight": 0.005067552, + "name": "泰国" + }, + { + "name": "马拉维", + "weight": 0.005017242 + }, + { + "name": "乍得", + "weight": 0.004825619 + }, + { + "name": "摩洛哥", + "weight": 0.004571552 + }, + { + "weight": 0.004266592, + "name": "马来西亚" + }, + { + "weight": 0.004130712, + "name": "南苏丹" + }, + { + "name": "委内瑞拉", + "weight": 0.00410843 + }, + { + "weight": 0.003903682, + "name": "乌兹别克斯坦" + }, + { + "weight": 0.003891083, + "name": "秘鲁" + }, + { + "weight": 0.003854943, + "name": "尼泊尔" + }, + { + "name": "沙特阿拉伯", + "weight": 0.003683713 + }, + { + "name": "塞内加尔", + "weight": 0.003671814 + }, + { + "name": "津巴布韦", + "weight": 0.003628572 + }, + { + "name": "意大利", + "weight": 0.003591173 + }, + { + "weight": 0.003564036, + "name": "贝宁" + }, + { + "weight": 0.003318383, + "name": "索马里" + }, + { + "name": "几内亚", + "weight": 0.003229938 + }, + { + "name": "韩国", + "weight": 0.00302709 + }, + { + "name": "危地马拉", + "weight": 0.002989448 + }, + { + "weight": 0.002933277, + "name": "西班牙" + }, + { + "name": "布隆迪", + "weight": 0.002916273 + }, + { + "name": "乌克兰", + "weight": 0.002865519 + }, + { + "name": "叙利亚", + "weight": 0.002803866 + }, + { + "name": "加拿大", + "weight": 0.002769376 + }, + { + "name": "朝鲜", + "weight": 0.002663995 + }, + { + "name": "柬埔寨", + "weight": 0.002507218 + }, + { + "weight": 0.002459301, + "name": "卢旺达" + }, + { + "weight": 0.002433661, + "name": "波兰" + }, + { + "weight": 0.002264484, + "name": "澳大利亚" + }, + { + "name": "斯里兰卡", + "weight": 0.002205474 + }, + { + "weight": 0.00217928, + "name": "哈萨克斯坦" + }, + { + "name": "厄瓜多尔", + "weight": 0.002114416 + }, + { + "name": "塞拉利昂", + "weight": 0.002042686 + }, + { + "name": "海地", + "weight": 0.001815248 + }, + { + "name": "智利", + "weight": 0.001761297 + }, + { + "name": "多哥", + "weight": 0.001756614 + }, + { + "name": "约旦", + "weight": 0.001738363 + }, + { + "weight": 0.001716995, + "name": "玻利维亚" + }, + { + "weight": 0.001432103, + "name": "巴布亚新几内亚" + }, + { + "weight": 0.001424043, + "name": "塔吉克斯坦" + }, + { + "name": "多米尼加", + "weight": 0.001376899 + }, + { + "name": "荷兰", + "weight": 0.001365722 + }, + { + "name": "罗马尼亚", + "weight": 0.001342703 + }, + { + "weight": 0.001340039, + "name": "台湾" + }, + { + "name": "突尼斯", + "weight": 0.001327688 + }, + { + "name": "中非", + "weight": 0.001269639 + }, + { + "name": "洪都拉斯", + "weight": 0.001219191 + }, + { + "name": "刚果共和国", + "weight": 0.001209073 + }, + { + "weight": 0.001189154, + "name": "利比里亚" + }, + { + "weight": 0.001150376, + "name": "以色列" + }, + { + "weight": 0.001149654, + "name": "厄立特里亚" + }, + { + "weight": 0.001119049, + "name": "老挝" + }, + { + "name": "阿塞拜疆", + "weight": 0.001039837 + }, + { + "name": "利比亚", + "weight": 0.001029222 + }, + { + "name": "巴勒斯坦", + "weight": 0.000992651 + }, + { + "name": "吉尔吉斯斯坦", + "weight": 0.000957294 + }, + { + "weight": 0.000907425, + "name": "比利时" + }, + { + "name": "瑞典", + "weight": 0.000890654 + }, + { + "name": "巴拉圭", + "weight": 0.00085764 + }, + { + "name": "毛里塔尼亚", + "weight": 0.000842302 + }, + { + "weight": 0.000830493, + "name": "古巴" + }, + { + "name": "萨尔瓦多", + "weight": 0.000822881 + }, + { + "name": "尼加拉瓜", + "weight": 0.000782782 + }, + { + "weight": 0.000764766, + "name": "阿曼" + }, + { + "name": "黎巴嫩", + "weight": 0.000751395 + }, + { + "name": "土库曼斯坦", + "weight": 0.000743841 + }, + { + "weight": 0.000680867, + "name": "阿联酋" + }, + { + "weight": 0.000677997, + "name": "捷克" + }, + { + "weight": 0.000643037, + "name": "白俄罗斯" + }, + { + "weight": 0.000642255, + "name": "瑞士" + }, + { + "name": "匈牙利", + "weight": 0.000612393 + }, + { + "name": "奥地利", + "weight": 0.000602473 + }, + { + "name": "希腊", + "weight": 0.000595922 + }, + { + "weight": 0.000592992, + "name": "葡萄牙" + }, + { + "weight": 0.000566764, + "name": "科威特" + }, + { + "weight": 0.000538867, + "name": "哥斯达黎加" + }, + { + "name": "巴拿马", + "weight": 0.000513904 + }, + { + "name": "挪威", + "weight": 0.000466485 + }, + { + "name": "丹麦", + "weight": 0.000460789 + }, + { + "name": "爱尔兰", + "weight": 0.000455762 + }, + { + "name": "新西兰", + "weight": 0.000451486 + }, + { + "name": "纳米比亚", + "weight": 0.000450165 + }, + { + "name": "香港", + "weight": 0.000448826 + }, + { + "weight": 0.000441931, + "name": "冈比亚" + }, + { + "weight": 0.000436542, + "name": "塞尔维亚" + }, + { + "name": "芬兰", + "weight": 0.000417327 + }, + { + "weight": 0.00041658, + "name": "几内亚比绍" + }, + { + "weight": 0.000410456, + "name": "保加利亚" + }, + { + "weight": 0.000382945, + "name": "蒙古" + }, + { + "name": "莱索托", + "weight": 0.00037228 + }, + { + "weight": 0.000361607, + "name": "新加坡" + }, + { + "name": "斯洛伐克", + "weight": 0.000361482 + }, + { + "weight": 0.00035722, + "name": "加蓬" + }, + { + "name": "博茨瓦纳", + "weight": 0.000348221 + }, + { + "weight": 0.000323338, + "name": "乌拉圭" + }, + { + "name": "赤道几内亚", + "weight": 0.000318155 + }, + { + "name": "东帝汶", + "weight": 0.000316195 + }, + { + "name": "牙买加", + "weight": 0.000312724 + }, + { + "name": "格鲁吉亚", + "weight": 0.000307685 + }, + { + "weight": 0.000265076, + "name": "阿尔巴尼亚" + }, + { + "weight": 0.000252622, + "name": "克罗地亚" + }, + { + "weight": 0.000250708, + "name": "亚美尼亚" + }, + { + "name": "波黑", + "weight": 0.000232069 + }, + { + "name": "摩尔多瓦", + "weight": 0.000204405 + }, + { + "name": "科索沃", + "weight": 0.000196993 + }, + { + "weight": 0.000189047, + "name": "立陶宛" + }, + { + "weight": 0.000182006, + "name": "卡塔尔" + }, + { + "name": "波多黎各", + "weight": 0.000182004 + }, + { + "name": "吉布提", + "weight": 0.000174383 + }, + { + "name": "北马其顿", + "weight": 0.000158321 + }, + { + "weight": 0.000146886, + "name": "科摩罗" + }, + { + "weight": 0.000144027, + "name": "巴林" + }, + { + "weight": 0.000129782, + "name": "斯洛文尼亚" + }, + { + "weight": 0.000126232, + "name": "西撒哈拉" + }, + { + "name": "拉脱维亚", + "weight": 0.000124966 + }, + { + "name": "所罗门群岛", + "weight": 0.000120169 + }, + { + "name": "斐济", + "weight": 0.000110985 + }, + { + "weight": 0.000110769, + "name": "特立尼达和多巴哥" + }, + { + "weight": 0.000109656, + "name": "毛里求斯" + }, + { + "weight": 8.8e-5, + "name": "爱沙尼亚" + }, + { + "weight": 8.61e-5, + "name": "圭亚那" + }, + { + "name": "不丹", + "weight": 8.61e-5 + }, + { + "weight": 7.49e-5, + "name": "佛得角" + }, + { + "name": "塞浦路斯", + "weight": 6.8e-5 + }, + { + "name": "伯利兹", + "weight": 6.4e-5 + }, + { + "weight": 6.01e-5, + "name": "苏里南" + }, + { + "name": "文莱", + "weight": 5.2e-5 + }, + { + "weight": 5.1e-5, + "name": "黑山" + }, + { + "name": "瓦努阿图", + "weight": 5.1e-5 + }, + { + "name": "卢森堡", + "weight": 5.07e-5 + }, + { + "name": "马尔代夫", + "weight": 4.27e-5 + }, + { + "name": "巴哈马", + "weight": 4.06e-5 + }, + { + "weight": 3.82e-5, + "name": "澳门" + }, + { + "weight": 3.48e-5, + "name": "马耳他" + }, + { + "name": "冰岛", + "weight": 3.45e-5 + }, + { + "weight": 3.03e-5, + "name": "新喀里多尼亚" + }, + { + "name": "萨摩亚", + "weight": 2.83e-5 + }, + { + "weight": 2.8e-5, + "name": "法属波利尼西亚" + }, + { + "name": "关岛", + "weight": 2.36e-5 + }, + { + "weight": 2.32e-5, + "name": "巴巴多斯" + }, + { + "name": "基里巴斯", + "weight": 1.83e-5 + }, + { + "weight": 1.71e-5, + "name": "圣卢西亚" + }, + { + "name": "库拉索", + "weight": 1.51e-5 + }, + { + "weight": 1.5e-5, + "name": "汤加" + }, + { + "weight": 1.42e-5, + "name": "密克罗尼西亚联邦" + }, + { + "weight": 1.13e-5, + "name": "格林纳达" + }, + { + "name": "安提瓜和巴布达", + "weight": 1.05e-5 + }, + { + "weight": 9.93e-6, + "name": "圣文森特和格林纳丁斯" + }, + { + "name": "泽西", + "weight": 9.66e-6 + }, + { + "weight": 9.64e-6, + "name": "阿鲁巴" + }, + { + "weight": 9.15e-6, + "name": "美属维尔京群岛" + }, + { + "weight": 9.08e-6, + "name": "马绍尔群岛" + }, + { + "weight": 8.9e-6, + "name": "塞舌尔" + }, + { + "name": "美属萨摩亚", + "weight": 7.97e-6 + }, + { + "name": "多米尼克", + "weight": 7.57e-6 + }, + { + "weight": 6.41e-6, + "name": "马恩岛" + }, + { + "weight": 6.09e-6, + "name": "北马里亚纳群岛" + }, + { + "name": "开曼群岛", + "weight": 5.77e-6 + }, + { + "name": "格陵兰", + "weight": 5.63e-6 + }, + { + "weight": 5.54e-6, + "name": "法罗群岛" + }, + { + "weight": 5.17e-6, + "name": "圣基茨和尼维斯" + }, + { + "weight": 5.11e-6, + "name": "百慕大" + }, + { + "weight": 4.38e-6, + "name": "根西" + }, + { + "weight": 4.31e-6, + "name": "特克斯和凯科斯群岛" + }, + { + "name": "荷属圣马丁", + "weight": 4.14e-6 + }, + { + "weight": 3.87e-6, + "name": "安道尔" + }, + { + "name": "法国(法属圣马丁)", + "weight": 3.6e-6 + }, + { + "name": "直布罗陀", + "weight": 3.2e-6 + }, + { + "weight": 2.87e-6, + "name": "列支敦士登" + }, + { + "name": "英属维尔京群岛", + "weight": 2.57e-6 + }, + { + "weight": 2.1e-6, + "name": "圣马力诺" + }, + { + "weight": 1.75e-6, + "name": "瑙鲁" + }, + { + "name": "摩纳哥", + "weight": 1.75e-6 + }, + { + "name": "图瓦卢", + "weight": 1.72e-6 + }, + { + "name": "库克群岛", + "weight": 1.44e-6 + }, + { + "name": "帕劳", + "weight": 1.44e-6 + }, + { + "weight": 1.41e-6, + "name": "安圭拉" + }, + { + "weight": 1.05e-6, + "name": "法国(瓦利斯和富图纳)" + }, + { + "weight": 6.6e-7, + "name": "法国(圣巴泰勒米)" + }, + { + "name": "蒙特塞拉特", + "weight": 4.35e-7 + }, + { + "weight": 3.77e-7, + "name": "圣赫勒拿、阿森松和特里斯坦-达库尼亚" + }, + { + "name": "法国(圣皮埃尔和密克隆)", + "weight": 2.86e-7 + }, + { + "name": "福克兰群岛", + "weight": 2.48e-7 + } +] \ No newline at end of file diff --git a/go.mod b/go.mod index 2a9c043f..5c8b002b 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,7 @@ require ( github.com/golang/protobuf v1.5.2 github.com/gorilla/websocket v1.4.2 github.com/imroc/req v0.3.0 + github.com/mroth/weightedrand v0.4.1 github.com/robfig/cron v1.2.0 github.com/shirou/gopsutil v3.21.8+incompatible github.com/sirupsen/logrus v1.8.1 diff --git a/go.sum b/go.sum index 733b29e1..3cc212d5 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2-0.20210109003243-333559e1834b h1:6Xjqolv/0DDdUqlpnsTomXQvjvvkz7Ux7TcMALvozEw= github.com/modern-go/reflect2 v1.0.2-0.20210109003243-333559e1834b/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mroth/weightedrand v0.4.1 h1:rHcbUBopmi/3x4nnrvwGJBhX9d0vk+KgoLUZeDP6YyI= +github.com/mroth/weightedrand v0.4.1/go.mod h1:3p2SIcC8al1YMzGhAIoXD+r9olo/g/cdJgAD905gyNE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= diff --git a/main.go b/main.go index 8bbf1ad6..6bb05419 100644 --- a/main.go +++ b/main.go @@ -27,6 +27,7 @@ import ( _ "github.com/FloatTech/ZeroBot-Plugin/plugin_minecraft" // MCSManager _ "github.com/FloatTech/ZeroBot-Plugin/plugin_music" // 点歌 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_omikuji" // 浅草寺求签 + _ "github.com/FloatTech/ZeroBot-Plugin/plugin_reborn" // 投胎 _ "github.com/FloatTech/ZeroBot-Plugin/plugin_shindan" // 测定 // b站相关 diff --git a/plugin_diana/data/text.go b/plugin_diana/data/text.go index cee8ab46..d5e7325e 100644 --- a/plugin_diana/data/text.go +++ b/plugin_diana/data/text.go @@ -16,7 +16,7 @@ import ( const ( datapath = "data/Diana" pbfile = datapath + "/text.pb" - pburl = "https://codechina.csdn.net/u011570312/ZeroBot-Plugin/-/raw/master/data/Diana/text.pb" + pburl = "https://codechina.csdn.net/u011570312/ZeroBot-Plugin/-/raw/master/" + pbfile ) var ( diff --git a/plugin_omikuji/sensou.go b/plugin_omikuji/sensou.go index 12a2686e..6c1571f4 100644 --- a/plugin_omikuji/sensou.go +++ b/plugin_omikuji/sensou.go @@ -17,8 +17,6 @@ const ( ) func init() { // 插件主体 - // TODO: 1.17 特性暂不增加 - // rand.Seed(time.Now().UnixMicro()) rand.Seed(time.Now().UnixNano()) control.Register("omikuji", &control.Options{ DisableOnDefault: false, diff --git a/plugin_reborn/born.go b/plugin_reborn/born.go new file mode 100644 index 00000000..5255bbfd --- /dev/null +++ b/plugin_reborn/born.go @@ -0,0 +1,21 @@ +package reborn + +import ( + wr "github.com/mroth/weightedrand" +) + +var ( + gender, _ = wr.NewChooser( + wr.Choice{Item: "男孩子", Weight: 50707}, + wr.Choice{Item: "女孩子", Weight: 48292}, + wr.Choice{Item: "雌雄同体", Weight: 1001}, + ) +) + +func randcoun() string { + return areac.Pick().(string) +} + +func randgen() string { + return gender.Pick().(string) +} diff --git a/plugin_reborn/load.go b/plugin_reborn/load.go new file mode 100644 index 00000000..b2f5975b --- /dev/null +++ b/plugin_reborn/load.go @@ -0,0 +1,82 @@ +package reborn + +import ( + "encoding/json" + "io" + "log" + "net/http" + "os" + + wr "github.com/mroth/weightedrand" +) + +const ( + datapath = "data/Reborn" + jsonfile = datapath + "/rate.json" + pburl = "https://codechina.csdn.net/u011570312/ZeroBot-Plugin/-/raw/master/" + jsonfile +) + +type rate []struct { + Name string `json:"name"` + Weight float64 `json:"weight"` +} + +var ( + areac *wr.Chooser +) + +func init() { + area := make(rate, 226) + err := load(&area) + if err != nil { + panic(err) + } + choices := make([]wr.Choice, len(area)) + for i, a := range area { + choices[i].Item = a.Name + choices[i].Weight = uint(a.Weight * 1e9) + } + areac, err = wr.NewChooser(choices...) + if err != nil { + panic(err) + } +} + +// load 加载rate数据 +func load(area *rate) error { + if _, err := os.Stat(jsonfile); err == nil || os.IsExist(err) { + f, err := os.Open(jsonfile) + if err == nil { + defer f.Close() + data, err1 := io.ReadAll(f) + if err1 == nil { + if len(data) > 0 { + return json.Unmarshal(data, area) + } + } + return err1 + } + } else { // 如果没有小作文,则从 url 下载 + f, err := os.Create(jsonfile) + if err != nil { + return err + } + defer f.Close() + resp, err := http.Get(pburl) + if err == nil { + defer resp.Body.Close() + if resp.ContentLength > 0 { + log.Printf("[Reborn] 从镜像下载国家和地区%d字节...", resp.ContentLength) + data, err := io.ReadAll(resp.Body) + if err == nil && len(data) > 0 { + _, _ = f.Write(data) + return json.Unmarshal(data, area) + } + return err + } + return nil + } + return err + } + return nil +} diff --git a/plugin_reborn/main.go b/plugin_reborn/main.go new file mode 100644 index 00000000..1048b355 --- /dev/null +++ b/plugin_reborn/main.go @@ -0,0 +1,27 @@ +// Package reborn 投胎 来自 https://github.com/YukariChiba/tgbot/blob/main/modules/Reborn.py +package reborn + +import ( + "fmt" + "math/rand" + "time" + + "github.com/FloatTech/ZeroBot-Plugin/control" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +func init() { + rand.Seed(time.Now().UnixNano()) + control.Register("reborn", &control.Options{ + DisableOnDefault: false, + Help: "投胎\n- reborn", + }).OnFullMatch("reborn").SetBlock(true). + Handle(func(ctx *zero.Ctx) { + if rand.Int31() > 1<<27 { + ctx.SendChain(message.At(ctx.Event.UserID), message.Text(fmt.Sprintf("投胎成功!\n您出生在 %s, 是 %s。", randcoun(), randgen()))) + } else { + ctx.SendChain(message.At(ctx.Event.UserID), message.Text("投胎失败!\n您没能活到出生,祝您下次好运!")) + } + }) +}