diff --git a/go.mod b/go.mod index ebe7f1e1..3cf67c12 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.16 require ( github.com/FloatTech/AnimeAPI v1.1.10 github.com/FloatTech/ZeroBot-Plugin-Gif v0.2.4 - github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.3 github.com/FloatTech/bot-manager v1.0.0 github.com/fogleman/gg v1.3.0 github.com/gin-gonic/gin v1.7.4 diff --git a/go.sum b/go.sum index e13eeaf2..c4d764d6 100644 --- a/go.sum +++ b/go.sum @@ -4,7 +4,6 @@ github.com/FloatTech/AnimeAPI v1.1.10/go.mod h1:CC+vF30UGBlcIUxwFOcXIEHoJ4r7c5x2 github.com/FloatTech/ZeroBot-Plugin v1.1.5/go.mod h1:kWuUARvU7gs4xLggi8Sy37ja2GRL6k0X6kewe5TiZRs= github.com/FloatTech/ZeroBot-Plugin-Gif v0.2.4 h1:WW0BmmLLqAg+m6qGkrKbsfSIm91fkj3/udt3R7Myodo= github.com/FloatTech/ZeroBot-Plugin-Gif v0.2.4/go.mod h1:W7ag6hml1pZTNzRXKU74OMr6rS8awQKSU+o2g7Gj4O0= -github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.3 h1:jn/dH+OwPSRozkmeCeQQPrAGJRBudcm3OK5tXhGItRk= github.com/FloatTech/ZeroBot-Plugin-Timer v1.4.3/go.mod h1:MVOQQ4e6AVGFm993blXXU4Sd6bAsLY2+Zb+/HMrEeEc= github.com/FloatTech/bot-manager v1.0.0 h1:d63J5htLhVBc2ITG09WBJI+qAB0ubPjYhfXl6hljBNk= github.com/FloatTech/bot-manager v1.0.0/go.mod h1:8YYRJ16oroGHQGD2En0oVnmcKJkxR9O/jd5BPSfWfOQ= diff --git a/plugin_manager/manager.go b/plugin_manager/manager.go index 937b42e2..fa60522b 100644 --- a/plugin_manager/manager.go +++ b/plugin_manager/manager.go @@ -15,8 +15,7 @@ import ( "github.com/wdvxdr1123/ZeroBot/extension/rate" "github.com/wdvxdr1123/ZeroBot/message" - timer "github.com/FloatTech/ZeroBot-Plugin-Timer" - + "github.com/FloatTech/ZeroBot-Plugin/plugin_manager/timer" "github.com/FloatTech/ZeroBot-Plugin/utils/file" "github.com/FloatTech/ZeroBot-Plugin/utils/math" ) diff --git a/plugin_manager/timer/timer.go b/plugin_manager/timer/timer.go new file mode 100644 index 00000000..6007c66b --- /dev/null +++ b/plugin_manager/timer/timer.go @@ -0,0 +1,276 @@ +// Package timer 群管定时器 +package timer + +import ( + "fmt" + "io" + "os" + "strconv" + "strings" + "time" + "unicode" + + log "github.com/sirupsen/logrus" + zero "github.com/wdvxdr1123/ZeroBot" + "github.com/wdvxdr1123/ZeroBot/message" +) + +type ( + TimeStamp = Timer +) + +const ( + // 定时器存储位置 + datapath = "data/manager/" // 数据目录 + pbfile = datapath + "timers.pb" +) + +var ( + // 记录每个定时器以便取消 + timersmap TimersMap + // 定时器map + Timers *(map[string]*Timer) + // @全体成员 + atall = message.MessageSegment{ + Type: "at", + Data: map[string]string{ + "qq": "all", + }, + } +) + +func init() { + go func() { + time.Sleep(time.Second) + err := os.MkdirAll(datapath, 0755) + if err != nil { + panic(err) + } + loadTimers() + Timers = &timersmap.Timers + }() +} + +func judgeHM(ts *TimeStamp) { + if ts.Hour < 0 || ts.Hour == int32(time.Now().Hour()) { + if ts.Minute < 0 || ts.Minute == int32(time.Now().Minute()) { + zero.RangeBot(func(id int64, ctx *zero.Ctx) bool { + ctx.Event = new(zero.Event) + ctx.Event.GroupID = int64(ts.Grpid) + if ts.Url == "" { + ctx.SendChain(atall, message.Text(ts.Alert)) + } else { + ctx.SendChain(atall, message.Text(ts.Alert), message.Image(ts.Url).Add("cache", "0")) + } + return false + }) + } + } +} + +// RegisterTimer 注册计时器 +func RegisterTimer(ts *TimeStamp, save bool) { + key := GetTimerInfo(ts) + if Timers != nil { + t, ok := (*Timers)[key] + if t != ts && ok { // 避免重复注册定时器 + t.Enable = false + } + (*Timers)[key] = ts + if save { + SaveTimers() + } + } + log.Printf("[群管]注册计时器[%t]%s", ts.Enable, key) + for ts.Enable { + if ts.Month < 0 || ts.Month == int32(time.Now().Month()) { + if ts.Day < 0 || ts.Day == int32(time.Now().Day()) { + judgeHM(ts) + } else if ts.Day == 0 { + if ts.Week < 0 || ts.Week == int32(time.Now().Weekday()) { + judgeHM(ts) + } + } + } + time.Sleep(time.Minute) + } +} + +// SaveTimers 保存当前计时器 +func SaveTimers() error { + data, err := timersmap.Marshal() + if err != nil { + return err + } else if _, err := os.Stat(datapath); err == nil || os.IsExist(err) { + f, err1 := os.OpenFile(pbfile, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0644) + if err1 != nil { + return err1 + } else { + defer f.Close() + _, err2 := f.Write(data) + return err2 + } + } else { + return nil + } +} + +// ListTimers 列出本群所有计时器 +func ListTimers(grpID uint64) []string { + // 数组默认长度为map长度,后面append时,不需要重新申请内存和拷贝,效率很高 + if Timers != nil { + g := strconv.FormatUint(grpID, 10) + keys := make([]string, 0, len(*Timers)) + for k := range *Timers { + if strings.Contains(k, g) { + start := strings.Index(k, "]") + keys = append(keys, strings.ReplaceAll(k[start+1:]+"\n", "-1", "每")) + } + } + return keys + } else { + return nil + } +} + +func loadTimers() { + if _, err := os.Stat(pbfile); err == nil || os.IsExist(err) { + f, err := os.Open(pbfile) + if err == nil { + data, err1 := io.ReadAll(f) + if err1 == nil { + if len(data) > 0 { + timersmap.Unmarshal(data) + for _, t := range timersmap.Timers { + go RegisterTimer(t, false) + } + return + } + } + } + } + timersmap.Timers = make(map[string]*Timer) +} + +// GetTimerInfo 获得标准化定时字符串 +func GetTimerInfo(ts *TimeStamp) string { + return fmt.Sprintf("[%d]%d月%d日%d周%d:%d", ts.Grpid, ts.Month, ts.Day, ts.Week, ts.Hour, ts.Minute) +} + +// GetFilledTimeStamp 获得填充好的ts +func GetFilledTimeStamp(dateStrs []string, matchDateOnly bool) *TimeStamp { + monthStr := []rune(dateStrs[1]) + dayWeekStr := []rune(dateStrs[2]) + hourStr := []rune(dateStrs[3]) + minuteStr := []rune(dateStrs[4]) + + var ts TimeStamp + ts.Month = chineseNum2Int(monthStr) + if (ts.Month != -1 && ts.Month <= 0) || ts.Month > 12 { // 月份非法 + log.Println("[群管]月份非法!") + return &ts + } + lenOfDW := len(dayWeekStr) + if lenOfDW == 4 { // 包括末尾的"日" + dayWeekStr = []rune{dayWeekStr[0], dayWeekStr[2]} // 去除中间的十 + ts.Day = chineseNum2Int(dayWeekStr) + if (ts.Day != -1 && ts.Day <= 0) || ts.Day > 31 { // 日期非法 + log.Println("[群管]日期非法1!") + return &ts + } + } else if dayWeekStr[lenOfDW-1] == rune('日') { // xx日 + dayWeekStr = dayWeekStr[:lenOfDW-1] + ts.Day = chineseNum2Int(dayWeekStr) + if (ts.Day != -1 && ts.Day <= 0) || ts.Day > 31 { // 日期非法 + log.Println("[群管]日期非法2!") + return &ts + } + } else if dayWeekStr[0] == rune('每') { // 每周 + ts.Week = -1 + } else { // 周x + ts.Week = chineseNum2Int(dayWeekStr[1:]) + if ts.Week == 7 { // 周天是0 + ts.Week = 0 + } + if ts.Week < 0 || ts.Week > 6 { // 星期非法 + ts.Week = -11 + log.Println("[群管]星期非法!") + return &ts + } + } + if len(hourStr) == 3 { + hourStr = []rune{hourStr[0], hourStr[2]} // 去除中间的十 + } + ts.Hour = chineseNum2Int(hourStr) + if ts.Hour < -1 || ts.Hour > 23 { // 小时非法 + log.Println("[群管]小时非法!") + return &ts + } + if len(minuteStr) == 3 { + minuteStr = []rune{minuteStr[0], minuteStr[2]} // 去除中间的十 + } + ts.Minute = chineseNum2Int(minuteStr) + if ts.Minute < -1 || ts.Minute > 59 { // 分钟非法 + log.Println("[群管]分钟非法!") + return &ts + } + if !matchDateOnly { + urlStr := dateStrs[5] + if urlStr != "" { // 是图片url + ts.Url = urlStr[3:] // utf-8下用为3字节 + log.Println("[群管]" + ts.Url) + if !strings.HasPrefix(ts.Url, "http") { + ts.Url = "illegal" + log.Println("[群管]url非法!") + return &ts + } + } + ts.Alert = dateStrs[6] + ts.Enable = true + } + return &ts +} + +// chineseNum2Int 汉字数字转int,仅支持-10~99,最多两位数,其中"每"解释为-1,"每二"为-2,以此类推 +func chineseNum2Int(rs []rune) int32 { + 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 int32(r) +} + +// chineseChar2Int 处理单个字符的映射0~10 +func chineseChar2Int(c rune) int { + if c == rune('日') || c == rune('天') { // 周日/周天 + return 7 + } else { + match := []rune("零一二三四五六七八九十") + for i, m := range match { + if c == m { + return i + } + } + return 0 + } +} diff --git a/plugin_manager/timer/timer.pb.go b/plugin_manager/timer/timer.pb.go new file mode 100644 index 00000000..0c7bdfbf --- /dev/null +++ b/plugin_manager/timer/timer.pb.go @@ -0,0 +1,952 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: timer.proto + +package timer + +import ( + fmt "fmt" + proto "github.com/golang/protobuf/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type Timer struct { + Enable bool `protobuf:"varint,1,opt,name=enable,proto3" json:"enable,omitempty"` + Alert string `protobuf:"bytes,2,opt,name=alert,proto3" json:"alert,omitempty"` + Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` + Month int32 `protobuf:"zigzag32,4,opt,name=month,proto3" json:"month,omitempty"` + Day int32 `protobuf:"zigzag32,5,opt,name=day,proto3" json:"day,omitempty"` + Week int32 `protobuf:"zigzag32,6,opt,name=week,proto3" json:"week,omitempty"` + Hour int32 `protobuf:"zigzag32,7,opt,name=hour,proto3" json:"hour,omitempty"` + Minute int32 `protobuf:"zigzag32,8,opt,name=minute,proto3" json:"minute,omitempty"` + Grpid uint64 `protobuf:"varint,9,opt,name=grpid,proto3" json:"grpid,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Timer) Reset() { *m = Timer{} } +func (m *Timer) String() string { return proto.CompactTextString(m) } +func (*Timer) ProtoMessage() {} +func (*Timer) Descriptor() ([]byte, []int) { + return fileDescriptor_ad0307ee16b652d2, []int{0} +} +func (m *Timer) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Timer) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Timer.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Timer) XXX_Merge(src proto.Message) { + xxx_messageInfo_Timer.Merge(m, src) +} +func (m *Timer) XXX_Size() int { + return m.Size() +} +func (m *Timer) XXX_DiscardUnknown() { + xxx_messageInfo_Timer.DiscardUnknown(m) +} + +var xxx_messageInfo_Timer proto.InternalMessageInfo + +func (m *Timer) GetEnable() bool { + if m != nil { + return m.Enable + } + return false +} + +func (m *Timer) GetAlert() string { + if m != nil { + return m.Alert + } + return "" +} + +func (m *Timer) GetUrl() string { + if m != nil { + return m.Url + } + return "" +} + +func (m *Timer) GetMonth() int32 { + if m != nil { + return m.Month + } + return 0 +} + +func (m *Timer) GetDay() int32 { + if m != nil { + return m.Day + } + return 0 +} + +func (m *Timer) GetWeek() int32 { + if m != nil { + return m.Week + } + return 0 +} + +func (m *Timer) GetHour() int32 { + if m != nil { + return m.Hour + } + return 0 +} + +func (m *Timer) GetMinute() int32 { + if m != nil { + return m.Minute + } + return 0 +} + +func (m *Timer) GetGrpid() uint64 { + if m != nil { + return m.Grpid + } + return 0 +} + +type TimersMap struct { + Timers map[string]*Timer `protobuf:"bytes,1,rep,name=timers,proto3" json:"timers,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TimersMap) Reset() { *m = TimersMap{} } +func (m *TimersMap) String() string { return proto.CompactTextString(m) } +func (*TimersMap) ProtoMessage() {} +func (*TimersMap) Descriptor() ([]byte, []int) { + return fileDescriptor_ad0307ee16b652d2, []int{1} +} +func (m *TimersMap) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TimersMap) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TimersMap.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TimersMap) XXX_Merge(src proto.Message) { + xxx_messageInfo_TimersMap.Merge(m, src) +} +func (m *TimersMap) XXX_Size() int { + return m.Size() +} +func (m *TimersMap) XXX_DiscardUnknown() { + xxx_messageInfo_TimersMap.DiscardUnknown(m) +} + +var xxx_messageInfo_TimersMap proto.InternalMessageInfo + +func (m *TimersMap) GetTimers() map[string]*Timer { + if m != nil { + return m.Timers + } + return nil +} + +func init() { + proto.RegisterType((*Timer)(nil), "timer.Timer") + proto.RegisterType((*TimersMap)(nil), "timer.TimersMap") + proto.RegisterMapType((map[string]*Timer)(nil), "timer.TimersMap.TimersEntry") +} + +func init() { proto.RegisterFile("timer.proto", fileDescriptor_ad0307ee16b652d2) } + +var fileDescriptor_ad0307ee16b652d2 = []byte{ + // 278 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x4c, 0x90, 0xcd, 0x4a, 0xc3, 0x40, + 0x10, 0xc7, 0x9d, 0xe6, 0xc3, 0x66, 0xe3, 0xa1, 0x2e, 0x22, 0x83, 0x48, 0x08, 0x39, 0xe5, 0xd4, + 0x43, 0xf5, 0x20, 0x1e, 0x05, 0xf1, 0xe4, 0x65, 0xf1, 0x05, 0x52, 0xba, 0xd8, 0xd0, 0x7c, 0xb1, + 0xdd, 0x28, 0x79, 0x05, 0x9f, 0xc0, 0x17, 0x12, 0x3c, 0xfa, 0x08, 0x12, 0x5f, 0x44, 0x66, 0x36, + 0x94, 0xde, 0x7e, 0xff, 0x5f, 0xfe, 0x64, 0x67, 0x46, 0xc4, 0xb6, 0xac, 0xb5, 0x59, 0x76, 0xa6, + 0xb5, 0xad, 0x0c, 0x38, 0x64, 0x5f, 0x20, 0x82, 0x17, 0x22, 0x79, 0x29, 0x42, 0xdd, 0x14, 0xeb, + 0x4a, 0x23, 0xa4, 0x90, 0xcf, 0xd5, 0x94, 0xe4, 0x85, 0x08, 0x8a, 0x4a, 0x1b, 0x8b, 0xb3, 0x14, + 0xf2, 0x48, 0xb9, 0x20, 0x17, 0xc2, 0xeb, 0x4d, 0x85, 0x1e, 0x3b, 0x42, 0xea, 0xd5, 0x6d, 0x63, + 0xb7, 0xe8, 0xa7, 0x90, 0x9f, 0x2b, 0x17, 0xa8, 0xb7, 0x29, 0x06, 0x0c, 0xd8, 0x11, 0x4a, 0x29, + 0xfc, 0x77, 0xad, 0x77, 0x18, 0xb2, 0x62, 0x26, 0xb7, 0x6d, 0x7b, 0x83, 0xa7, 0xce, 0x11, 0xd3, + 0x3c, 0x75, 0xd9, 0xf4, 0x56, 0xe3, 0x9c, 0xed, 0x94, 0xe8, 0x9d, 0x57, 0xd3, 0x95, 0x1b, 0x8c, + 0x52, 0xc8, 0x7d, 0xe5, 0x42, 0xf6, 0x01, 0x22, 0xe2, 0x3d, 0xf6, 0xcf, 0x45, 0x27, 0x6f, 0x45, + 0xc8, 0xeb, 0xed, 0x11, 0x52, 0x2f, 0x8f, 0x57, 0xd7, 0x4b, 0xb7, 0xfa, 0xa1, 0x31, 0xd1, 0x63, + 0x63, 0xcd, 0xa0, 0xa6, 0xee, 0xd5, 0x93, 0x88, 0x8f, 0x34, 0x8d, 0xbe, 0xd3, 0x03, 0x5f, 0x23, + 0x52, 0x84, 0x32, 0x13, 0xc1, 0x5b, 0x51, 0xf5, 0x9a, 0x4f, 0x11, 0xaf, 0xce, 0x8e, 0xff, 0xaa, + 0xdc, 0xa7, 0xfb, 0xd9, 0x1d, 0x3c, 0x2c, 0xbe, 0xc7, 0x04, 0x7e, 0xc6, 0x04, 0x7e, 0xc7, 0x04, + 0x3e, 0xff, 0x92, 0x93, 0x75, 0xc8, 0x47, 0xbf, 0xf9, 0x0f, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xc7, + 0xad, 0xf8, 0x83, 0x01, 0x00, 0x00, +} + +func (m *Timer) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Timer) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Timer) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Grpid != 0 { + i = encodeVarintTimer(dAtA, i, uint64(m.Grpid)) + i-- + dAtA[i] = 0x48 + } + if m.Minute != 0 { + i = encodeVarintTimer(dAtA, i, uint64((uint32(m.Minute)<<1)^uint32((m.Minute>>31)))) + i-- + dAtA[i] = 0x40 + } + if m.Hour != 0 { + i = encodeVarintTimer(dAtA, i, uint64((uint32(m.Hour)<<1)^uint32((m.Hour>>31)))) + i-- + dAtA[i] = 0x38 + } + if m.Week != 0 { + i = encodeVarintTimer(dAtA, i, uint64((uint32(m.Week)<<1)^uint32((m.Week>>31)))) + i-- + dAtA[i] = 0x30 + } + if m.Day != 0 { + i = encodeVarintTimer(dAtA, i, uint64((uint32(m.Day)<<1)^uint32((m.Day>>31)))) + i-- + dAtA[i] = 0x28 + } + if m.Month != 0 { + i = encodeVarintTimer(dAtA, i, uint64((uint32(m.Month)<<1)^uint32((m.Month>>31)))) + i-- + dAtA[i] = 0x20 + } + if len(m.Url) > 0 { + i -= len(m.Url) + copy(dAtA[i:], m.Url) + i = encodeVarintTimer(dAtA, i, uint64(len(m.Url))) + i-- + dAtA[i] = 0x1a + } + if len(m.Alert) > 0 { + i -= len(m.Alert) + copy(dAtA[i:], m.Alert) + i = encodeVarintTimer(dAtA, i, uint64(len(m.Alert))) + i-- + dAtA[i] = 0x12 + } + if m.Enable { + i-- + if m.Enable { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *TimersMap) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TimersMap) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TimersMap) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Timers) > 0 { + for k := range m.Timers { + v := m.Timers[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTimer(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintTimer(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintTimer(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func encodeVarintTimer(dAtA []byte, offset int, v uint64) int { + offset -= sovTimer(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Timer) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Enable { + n += 2 + } + l = len(m.Alert) + if l > 0 { + n += 1 + l + sovTimer(uint64(l)) + } + l = len(m.Url) + if l > 0 { + n += 1 + l + sovTimer(uint64(l)) + } + if m.Month != 0 { + n += 1 + sozTimer(uint64(m.Month)) + } + if m.Day != 0 { + n += 1 + sozTimer(uint64(m.Day)) + } + if m.Week != 0 { + n += 1 + sozTimer(uint64(m.Week)) + } + if m.Hour != 0 { + n += 1 + sozTimer(uint64(m.Hour)) + } + if m.Minute != 0 { + n += 1 + sozTimer(uint64(m.Minute)) + } + if m.Grpid != 0 { + n += 1 + sovTimer(uint64(m.Grpid)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TimersMap) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Timers) > 0 { + for k, v := range m.Timers { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovTimer(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovTimer(uint64(len(k))) + l + n += mapEntrySize + 1 + sovTimer(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovTimer(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTimer(x uint64) (n int) { + return sovTimer(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Timer) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Timer: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Timer: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Enable", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Enable = bool(v != 0) + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Alert", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTimer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTimer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Alert = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Url", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTimer + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTimer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Url = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Month", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + v = int32((uint32(v) >> 1) ^ uint32(((v&1)<<31)>>31)) + m.Month = v + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Day", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + v = int32((uint32(v) >> 1) ^ uint32(((v&1)<<31)>>31)) + m.Day = v + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Week", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + v = int32((uint32(v) >> 1) ^ uint32(((v&1)<<31)>>31)) + m.Week = v + case 7: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Hour", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + v = int32((uint32(v) >> 1) ^ uint32(((v&1)<<31)>>31)) + m.Hour = v + case 8: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Minute", wireType) + } + var v int32 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + v = int32((uint32(v) >> 1) ^ uint32(((v&1)<<31)>>31)) + m.Minute = v + case 9: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Grpid", wireType) + } + m.Grpid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Grpid |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipTimer(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTimer + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TimersMap) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TimersMap: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TimersMap: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Timers", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTimer + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTimer + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Timers == nil { + m.Timers = make(map[string]*Timer) + } + var mapkey string + var mapvalue *Timer + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthTimer + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthTimer + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var mapmsglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTimer + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthTimer + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthTimer + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &Timer{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipTimer(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTimer + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Timers[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTimer(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTimer + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTimer(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTimer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTimer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTimer + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTimer + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTimer + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTimer + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTimer = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTimer = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTimer = fmt.Errorf("proto: unexpected end of group") +) diff --git a/plugin_manager/timer/timer.proto b/plugin_manager/timer/timer.proto new file mode 100644 index 00000000..2d95f12e --- /dev/null +++ b/plugin_manager/timer/timer.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; +package timer; + +message Timer { + bool enable = 1; + string alert = 2; + string url = 3; + sint32 month = 4; + sint32 day = 5; + sint32 week = 6; + sint32 hour = 7; + sint32 minute = 8; + uint64 grpid = 9; +} + +message TimersMap { + map timers = 1; +} \ No newline at end of file