mirror of
https://github.com/FloatTech/ZeroBot-Plugin.git
synced 2025-12-20 06:20:08 +08:00
群管增加定时提醒功能
This commit is contained in:
parent
8a6587752a
commit
ef95ecb415
@ -45,6 +45,8 @@
|
|||||||
- [x] 退出群聊[群号]
|
- [x] 退出群聊[群号]
|
||||||
- [x] *入群欢迎
|
- [x] *入群欢迎
|
||||||
- [x] *退群通知
|
- [x] *退群通知
|
||||||
|
- [x] 在[月份]月[日期]日的[小时]点[分钟]分时(用[url])提醒大家[消息]
|
||||||
|
- [x] 在[月份]月[每周or周几]的[小时]点[分钟]分时(用[url])提醒大家[消息]
|
||||||
- [ ] 同意入群请求
|
- [ ] 同意入群请求
|
||||||
- [ ] 同意好友请求
|
- [ ] 同意好友请求
|
||||||
- [ ] 撤回[@xxx] [xxx]
|
- [ ] 撤回[@xxx] [xxx]
|
||||||
|
|||||||
@ -230,6 +230,55 @@ func init() { // 插件主体
|
|||||||
ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1]))
|
ctx.SendChain(message.Text("📧 --> " + ctx.State["regex_matched"].([]string)[1]))
|
||||||
return
|
return
|
||||||
})
|
})
|
||||||
|
// 定时提醒
|
||||||
|
zero.OnRegex(`^在(.{1,2})月(.{1,3}日|每?周.?)的(.{1,3})点(.{1,3})分时(用.+)?提醒大家(.*)`, zero.AdminPermission).SetBlock(true).SetPriority(40).
|
||||||
|
Handle(func(ctx *zero.Ctx) {
|
||||||
|
dateStrs := ctx.State["regex_matched"].([]string)
|
||||||
|
monthStr := []rune(dateStrs[1])
|
||||||
|
dayWeekStr := []rune(dateStrs[2])
|
||||||
|
hourStr := []rune(dateStrs[3])
|
||||||
|
minuteStr := []rune(dateStrs[4])
|
||||||
|
urlStr := dateStrs[5]
|
||||||
|
var ts TimeStamp
|
||||||
|
ts.month = chineseNum2Int(monthStr)
|
||||||
|
lenOfDW := len(dayWeekStr)
|
||||||
|
if lenOfDW == 4 { //包括末尾的"日"
|
||||||
|
dayWeekStr = []rune{dayWeekStr[0], dayWeekStr[2]} //去除中间的十
|
||||||
|
ts.day = chineseNum2Int(dayWeekStr)
|
||||||
|
} else if dayWeekStr[lenOfDW-1] == rune('日') { //xx日
|
||||||
|
dayWeekStr = dayWeekStr[:lenOfDW-1]
|
||||||
|
ts.day = chineseNum2Int(dayWeekStr)
|
||||||
|
} else if dayWeekStr[0] == rune('每') { //每周
|
||||||
|
ts.week = -1
|
||||||
|
} else { //周x
|
||||||
|
ts.week = chineseNum2Int(dayWeekStr[1:])
|
||||||
|
}
|
||||||
|
if len(hourStr) == 3 {
|
||||||
|
hourStr = []rune{hourStr[0], hourStr[2]} //去除中间的十
|
||||||
|
}
|
||||||
|
ts.hour = chineseNum2Int(hourStr)
|
||||||
|
if len(minuteStr) == 3 {
|
||||||
|
minuteStr = []rune{minuteStr[0], minuteStr[2]} //去除中间的十
|
||||||
|
}
|
||||||
|
ts.minute = chineseNum2Int(minuteStr)
|
||||||
|
if urlStr != "" { //是图片url
|
||||||
|
ts.url = urlStr[3:] //utf-8下用为3字节
|
||||||
|
if !strings.HasPrefix(ts.url, "http") {
|
||||||
|
ctx.Send("图片url非法")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ts.alert = dateStrs[6]
|
||||||
|
ts.enable = true
|
||||||
|
go timer(ts, func() {
|
||||||
|
if ts.url == "" {
|
||||||
|
ctx.SendChain(AtAll(), message.Text(ts.alert))
|
||||||
|
} else {
|
||||||
|
ctx.SendChain(AtAll(), message.Text(ts.alert), ImageNoCache(ts.url))
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return
|
||||||
|
})
|
||||||
// 入群欢迎
|
// 入群欢迎
|
||||||
zero.OnNotice().SetBlock(false).SetPriority(40).
|
zero.OnNotice().SetBlock(false).SetPriority(40).
|
||||||
Handle(func(ctx *zero.Ctx) {
|
Handle(func(ctx *zero.Ctx) {
|
||||||
|
|||||||
105
manager/timer.go
Normal file
105
manager/timer.go
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
package manager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
|
"github.com/wdvxdr1123/ZeroBot/message"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TimeStamp struct {
|
||||||
|
enable bool
|
||||||
|
alert string
|
||||||
|
url string
|
||||||
|
month int8
|
||||||
|
day int8
|
||||||
|
week int8
|
||||||
|
hour int8
|
||||||
|
minute int8
|
||||||
|
}
|
||||||
|
|
||||||
|
func timer(ts TimeStamp, onTimeReached func()) {
|
||||||
|
fmt.Printf("注册计时器: %d月%d日%d周%d:%d触发\n", ts.month, ts.day, ts.week, ts.hour, ts.minute)
|
||||||
|
judgeHM := func() {
|
||||||
|
if ts.hour < 0 || ts.hour == int8(time.Now().Hour()) {
|
||||||
|
if ts.minute < 0 || ts.minute == int8(time.Now().Minute()) {
|
||||||
|
onTimeReached()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for ts.enable {
|
||||||
|
if ts.month < 0 || ts.month == int8(time.Now().Month()) {
|
||||||
|
if ts.day < 0 || ts.day == int8(time.Now().Day()) {
|
||||||
|
judgeHM()
|
||||||
|
} else if ts.day == 0 {
|
||||||
|
if ts.week < 0 || ts.week == int8(time.Now().Weekday()) {
|
||||||
|
judgeHM()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
time.Sleep(time.Minute)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//汉字数字转int,仅支持-10~99,最多两位数,其中"每"解释为-1,"每两"为-2,以此类推
|
||||||
|
func chineseNum2Int(rs []rune) int8 {
|
||||||
|
r := -1
|
||||||
|
l := len(rs)
|
||||||
|
mai := rune('每')
|
||||||
|
if unicode.IsDigit(rs[0]) { //默认可能存在的第二位也为int
|
||||||
|
r, _ = strconv.Atoi(string(rs))
|
||||||
|
} else {
|
||||||
|
if rs[0] == mai {
|
||||||
|
if l == 2 {
|
||||||
|
r = -chineseChar2Int(rs[1])
|
||||||
|
}
|
||||||
|
} else if l == 1 {
|
||||||
|
r = chineseChar2Int(rs[0])
|
||||||
|
} else {
|
||||||
|
ten := chineseChar2Int(rs[0])
|
||||||
|
if ten != 10 {
|
||||||
|
ten *= 10
|
||||||
|
}
|
||||||
|
ge := chineseChar2Int(rs[1])
|
||||||
|
if ge == 10 {
|
||||||
|
ge = 0
|
||||||
|
}
|
||||||
|
r = ten + ge
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return int8(r)
|
||||||
|
}
|
||||||
|
|
||||||
|
//处理单个字符的映射0~10
|
||||||
|
func chineseChar2Int(c rune) int {
|
||||||
|
match := []rune("零一二三四五六七八九十")
|
||||||
|
for i, m := range match {
|
||||||
|
if c == m {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
//@全体成员
|
||||||
|
func AtAll() message.MessageSegment {
|
||||||
|
return message.MessageSegment{
|
||||||
|
Type: "at",
|
||||||
|
Data: map[string]string{
|
||||||
|
"qq": "all",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//无缓存发送图片
|
||||||
|
func ImageNoCache(url string) message.MessageSegment {
|
||||||
|
return message.MessageSegment{
|
||||||
|
Type: "image",
|
||||||
|
Data: map[string]string{
|
||||||
|
"file": url,
|
||||||
|
"cache": "0",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user