|
| 1 | +// Package qqwife 娶群友 基于“翻牌”和江林大佬的“群老婆”插件魔改作品 |
| 2 | +package qqwife |
| 3 | + |
| 4 | +import ( |
| 5 | + "math/rand" |
| 6 | + "sort" |
| 7 | + "strconv" |
| 8 | + "strings" |
| 9 | + "sync" |
| 10 | + "time" |
| 11 | + |
| 12 | + zero "github.com/wdvxdr1123/ZeroBot" |
| 13 | + "github.com/wdvxdr1123/ZeroBot/message" |
| 14 | + |
| 15 | + control "github.com/FloatTech/zbputils/control" |
| 16 | + "github.com/FloatTech/zbputils/ctxext" |
| 17 | + "github.com/FloatTech/zbputils/math" |
| 18 | +) |
| 19 | + |
| 20 | +var ( |
| 21 | + setcp = make(map[int64]int64, 60) //初始化中间的map元素,虽然取了30个人数,以防万一翻个倍储存 |
| 22 | + qqwifegroup = make(map[int64]map[int64]int64, 50) //50个群的预算大小 |
| 23 | + lastdate time.Time |
| 24 | + rock sync.Mutex |
| 25 | +) |
| 26 | + |
| 27 | +func init() { |
| 28 | + engine := control.Register("qqwife", &control.Options{ |
| 29 | + DisableOnDefault: false, |
| 30 | + Help: "一群一天一夫一妻制群老婆\n" + |
| 31 | + "-娶群友", |
| 32 | + }) |
| 33 | + engine.OnFullMatch("娶群友", zero.OnlyGroup).SetBlock(true).Limit(ctxext.LimitByUser). |
| 34 | + Handle(func(ctx *zero.Ctx) { |
| 35 | + rock.Lock() |
| 36 | + defer rock.Unlock() |
| 37 | + if time.Now().Day() != lastdate.Day() { |
| 38 | + qqwifegroup = make(map[int64]map[int64]int64, 50) //跨天就重新初始化数据 |
| 39 | + } |
| 40 | + //先判断是否已经娶过或者被娶 |
| 41 | + groupid := ctx.Event.GroupID |
| 42 | + uid := ctx.Event.UserID |
| 43 | + var status string |
| 44 | + //如果娶过 |
| 45 | + userinfo, ok := qqwifegroup[groupid][uid] |
| 46 | + if ok { |
| 47 | + ctx.SendChain( |
| 48 | + message.At(uid), |
| 49 | + message.Text("今天你的群老婆是"), |
| 50 | + message.Image("http://q4.qlogo.cn/g?b=qq&nk="+strconv.FormatInt(userinfo, 10)+"&s=640"), |
| 51 | + message.Text( |
| 52 | + "\n", |
| 53 | + "[", ctx.CardOrNickName(userinfo), "]", |
| 54 | + "(", strconv.FormatInt(userinfo, 10), ")哒", |
| 55 | + ), |
| 56 | + ) |
| 57 | + return |
| 58 | + } |
| 59 | + //如果被娶过 |
| 60 | + for k, v := range qqwifegroup[groupid] { |
| 61 | + if v == uid { //如果为0且是在本群抽的就输出 |
| 62 | + ctx.SendChain( |
| 63 | + message.At(uid), |
| 64 | + message.Text("今天你被娶了,群老公是"), |
| 65 | + message.Image("http://q4.qlogo.cn/g?b=qq&nk="+strconv.FormatInt(k, 10)+"&s=640"), |
| 66 | + message.Text( |
| 67 | + "\n", |
| 68 | + "[", ctx.CardOrNickName(k), "]", |
| 69 | + "(", strconv.FormatInt(k, 10), ")哒", |
| 70 | + ), |
| 71 | + ) |
| 72 | + return |
| 73 | + } |
| 74 | + } |
| 75 | + // 无缓存获取群员列表 |
| 76 | + temp := ctx.GetThisGroupMemberListNoCache().Array() |
| 77 | + sort.SliceStable(temp, func(i, j int) bool { |
| 78 | + return temp[i].Get("last_sent_time").Int() < temp[j].Get("last_sent_time").Int() |
| 79 | + }) |
| 80 | + temp = temp[math.Max(0, len(temp)-30):] |
| 81 | + //将已经娶过的人剔除 |
| 82 | + var qqgrouplist = []int64{} |
| 83 | + if len(qqwifegroup) == 0 { |
| 84 | + for k := 0; k < len(temp); k++ { |
| 85 | + qqgrouplist = append(qqgrouplist, temp[k].Get("user_id").Int()) |
| 86 | + } |
| 87 | + } else { |
| 88 | + for k := 0; k < len(temp); k++ { |
| 89 | + _, ok := qqwifegroup[groupid][temp[k].Get("user_id").Int()] |
| 90 | + if !ok { |
| 91 | + qqgrouplist = append(qqgrouplist, temp[k].Get("user_id").Int()) |
| 92 | + } |
| 93 | + } |
| 94 | + } |
| 95 | + //没有人(只剩自己)的时候 |
| 96 | + if len(qqgrouplist) == 0 { |
| 97 | + ctx.SendChain(message.Text("噢,此时此刻你还是一只单身狗,等待下一次情缘吧")) |
| 98 | + return |
| 99 | + } |
| 100 | + //随机抽娶 |
| 101 | + who := qqgrouplist[rand.Intn(len(qqgrouplist))] |
| 102 | + if who == uid { //如果是自己 |
| 103 | + ctx.SendChain(message.Text("噢,此时此刻你还是一只单身狗,等待下一次情缘吧")) |
| 104 | + return |
| 105 | + } |
| 106 | + //绑定CP |
| 107 | + setcp[uid] = who |
| 108 | + qqwifegroup[groupid] = setcp |
| 109 | + //输出结果 |
| 110 | + ctx.SendChain( |
| 111 | + message.Text(status), |
| 112 | + message.At(uid), |
| 113 | + message.Text("今天你的群老婆是"), |
| 114 | + message.Image("http://q4.qlogo.cn/g?b=qq&nk="+strconv.FormatInt(who, 10)+"&s=640"), |
| 115 | + message.Text( |
| 116 | + "\n", |
| 117 | + "[", ctx.CardOrNickName(who), "]", |
| 118 | + "(", strconv.FormatInt(who, 10), ")哒", |
| 119 | + ), |
| 120 | + ) |
| 121 | + //更新时间 |
| 122 | + lastdate = time.Now() |
| 123 | + }) |
| 124 | + engine.OnFullMatch("群老婆列表", zero.OnlyGroup).SetBlock(true).Limit(ctxext.LimitByUser). |
| 125 | + Handle(func(ctx *zero.Ctx) { |
| 126 | + var cplist = []string{"群老公←———→群老婆\n--------------------------"} |
| 127 | + rock.Lock() |
| 128 | + defer rock.Unlock() |
| 129 | + group, ok := qqwifegroup[ctx.Event.GroupID] |
| 130 | + if !ok { |
| 131 | + ctx.SendChain(message.Text("你群并没有任何的CP额")) |
| 132 | + return |
| 133 | + } |
| 134 | + for k, v := range group { |
| 135 | + if k != 0 { |
| 136 | + husband := ctx.CardOrNickName(k) |
| 137 | + wife := ctx.CardOrNickName(v) |
| 138 | + cplist = append(cplist, husband+" & "+wife) |
| 139 | + } else { |
| 140 | + ctx.SendChain(message.Text("你群并没有任何的CP额")) |
| 141 | + return |
| 142 | + } |
| 143 | + } |
| 144 | + ctx.SendChain(message.Text(strings.Join(cplist, "\n"))) |
| 145 | + }) |
| 146 | +} |
0 commit comments