From 2a1cdecda7f82c33ecdf5c88a4d0b33bae2c1563 Mon Sep 17 00:00:00 2001 From: starainrt Date: Thu, 20 Jul 2023 21:59:41 +0800 Subject: [PATCH] bug fix --- when/parse.go | 35 ++++++++++++++++++++++++++++------- when/parse_test.go | 9 ++++++--- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/when/parse.go b/when/parse.go index b83d4ee..807caf1 100644 --- a/when/parse.go +++ b/when/parse.go @@ -9,11 +9,27 @@ import ( "time" ) +func legalCheck(limitCode string, baseDate time.Time, opts ...startimer.TimerOptions) (startimer.StarTimer, error) { + if limitCode == "" { + return startimer.NewTimer(baseDate, opts...) + } + timer, err := startimer.NewTimer(baseDate, opts...) + if err != nil { + return timer, err + } + if strings.Contains(limitCode, "今") { + if timer.NextTimer().Day() != time.Now().Day() { + return timer, errors.New("无法添加,指定的提醒时刻不在未来。") + } + } + return timer, err +} + func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, error) { str = transChn(str) var rpt startimer.Repeats var duration time.Duration - reg := regexp.MustCompile(`(每隔|每)?(\d{0,4}年)?(\d{0,5}个?月)?(\d{0,4}[明后大]{0,4}[日号天])?([上中下午夜早凌清晨傍晚里]+)?(\d{1,4}个?[点小时钟::]+)?(\d{0,4}半?[分::秒]?钟?)?(\d{0,10}半?秒?钟?)?(后)?`) + reg := regexp.MustCompile(`(每隔|每)?(\d{0,4}年)?(\d{0,5}个?月)?(\d{0,4}[明后大]{0,4}[日号天])?([今天日上中下午夜早凌清晨傍晚里]+)?(\d{1,4}个?[点小时钟::]+)?(\d{0,4}半?[分::秒]?钟?)?(\d{0,10}半?秒?钟?)?(后)?`) if reg.MatchString(str) { pts := reg.FindStringSubmatch(str) setAsDate := false @@ -52,11 +68,11 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro if rpt.Every { setAsDate = true } - case "明天": + case "明天", "明日": rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(now.Add(time.Hour * 24).Day())}) - case "后天": + case "后天", "后日": rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(now.Add(time.Hour * 48).Day())}) - case "大后天": + case "大后天", "大后日": rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(now.Add(time.Hour * 72).Day())}) case "大大后天": rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_DAY, Value: uint32(now.Add(time.Hour * 96).Day())}) @@ -79,7 +95,7 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro var hour uint32 if pts[6] != "" { hour = uint32(getNumbers(pts[6])) - if timeParse == "下午" || strings.Contains(timeParse, "晚") || strings.Contains(timeParse, "夜") { + if hour < 12 && (timeParse == "下午" || strings.Contains(timeParse, "晚") || strings.Contains(timeParse, "夜")) { hour += 12 } if rpt.Every == setAsDate { @@ -172,7 +188,7 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro now = now.Add(time.Duration(sr.Value) * time.Second) } } - return startimer.NewTimer(time.Now(), startimer.WithStaticDate(now), startimer.WithRunCountLimit(count)) + return legalCheck(timeParse, time.Now(), startimer.WithStaticDate(now), startimer.WithRunCountLimit(count)) } if duration.Seconds() > 0 { rpt.Repeat = append(rpt.Repeat, startimer.Repeat{Unit: startimer.STAR_SECOND, Value: uint32(duration.Seconds())}) @@ -180,12 +196,17 @@ func matchPeriodPattern01(base time.Time, str string) (startimer.StarTimer, erro if rpt.Every == setAsDate { rpt.Every = false } - return startimer.NewTimer(base, startimer.WithRepeats(&rpt), startimer.WithRunCountLimit(count)) + return legalCheck(timeParse, base, startimer.WithRepeats(&rpt), startimer.WithRunCountLimit(count)) } return startimer.StarTimer{}, errors.New("no Match") } func matchPeroidPattern02(base time.Time, str string) (startimer.StarTimer, error) { + preReg := "(周|礼拜|星期)([1-7一二三四五六七日天])([0-9一二三四五六七八九零])" + preExp := regexp.MustCompile(preReg) + if preExp.MatchString(str) { + str = preExp.ReplaceAllString(str, "${1}${2}的${3}") + } str = transChn(str) str = strings.ReplaceAll(str, "周日", "周0") str = strings.ReplaceAll(str, "礼拜天", "周0") diff --git a/when/parse_test.go b/when/parse_test.go index 9a5a0e1..e065119 100644 --- a/when/parse_test.go +++ b/when/parse_test.go @@ -10,16 +10,19 @@ func TestParse(t *testing.T) { for k, code := range []string{"一个小时后告诉我事情", "三个小时后爱我", "每两个小时提醒我吃饭", "每五个月零二十五天三小时25分15秒告诉我时间", "5月23日上午3点24分12秒打我", "周五上午11点提醒我", "5时25分提醒我", "每周一到周五上午8点提醒我吃饭", "每天晚上8点提醒我吃饭", "每月16号晚上8点提醒我吃饭", "晚上8:30提醒我", - "晚上八点半提醒我", "6分钟后提醒我", "凌晨0点半", "每20秒提醒我", "半小时后提醒我", "半分钟后提醒我", "一分半后提醒我", "00:00提醒我", "凌晨零点提醒我"} { - a, _ := WhenWithPeriod(code) + "晚上八点半提醒我", "6分钟后提醒我", "凌晨0点半", "每20秒提醒我", "半小时后提醒我", "半分钟后提醒我", "一分半后提醒我", "00:00提醒我", "凌晨零点提醒我", "今晚九点二十提醒我", "周五九点二十提醒我"} { + a, err := WhenWithPeriod(code) //fmt.Println(a.Repeats()[0]) + if err != nil { + fmt.Println(err) + } fmt.Println(a.NextTimer(), a.RunCountLimit(), code, k) fmt.Println(a.NextTimerAfterDate(time.Now().Add(time.Hour * 72))) } } func TestSigParse(t *testing.T) { - for _, code := range []string{"每周一到周五11:25提醒大家干饭了!"} { + for _, code := range []string{"周五九点二十提醒我"} { a, err := WhenWithPeriod(code) fmt.Println(err) fmt.Println(a.NextTimer(), a.RunCountLimit(), code)