github.com/Mrs4s/go-cqhttp@v1.2.0/internal/param/param.go (about) 1 // Package param provide some util for param parse 2 package param 3 4 import ( 5 "math" 6 "regexp" 7 "strings" 8 "sync" 9 10 "github.com/tidwall/gjson" 11 ) 12 13 // EnsureBool 判断给定的p是否可表示为合法Bool类型,否则返回defaultVal 14 // 15 // 支持的合法类型有 16 // 17 // type bool 18 // 19 // type gjson.True or gjson.False 20 // 21 // type string "true","yes","1" or "false","no","0" (case insensitive) 22 func EnsureBool(p any, defaultVal bool) bool { 23 var str string 24 if b, ok := p.(bool); ok { 25 return b 26 } 27 if j, ok := p.(gjson.Result); ok { 28 if !j.Exists() { 29 return defaultVal 30 } 31 switch j.Type { // nolint: exhaustive 32 case gjson.True: 33 return true 34 case gjson.False: 35 return false 36 case gjson.String: 37 str = j.Str 38 default: 39 return defaultVal 40 } 41 } else if s, ok := p.(string); ok { 42 str = s 43 } 44 str = strings.ToLower(str) 45 switch str { 46 case "true", "yes", "1": 47 return true 48 case "false", "no", "0": 49 return false 50 default: 51 return defaultVal 52 } 53 } 54 55 var ( 56 // once lazy compile the reg 57 once sync.Once 58 // reg is splitURL regex pattern. 59 reg *regexp.Regexp 60 ) 61 62 // SplitURL 将给定URL字符串分割为两部分,用于URL预处理防止风控 63 func SplitURL(s string) []string { 64 once.Do(func() { // lazy init. 65 reg = regexp.MustCompile(`(?i)[a-z\d][-a-z\d]{0,62}(\.[a-z\d][-a-z\d]{0,62})+\.?`) 66 }) 67 idx := reg.FindAllStringIndex(s, -1) 68 if len(idx) == 0 { 69 return []string{s} 70 } 71 var result []string 72 last := 0 73 for i := 0; i < len(idx); i++ { 74 if len(idx[i]) != 2 { 75 continue 76 } 77 m := int(math.Abs(float64(idx[i][0]-idx[i][1]))/1.5) + idx[i][0] 78 result = append(result, s[last:m]) 79 last = m 80 } 81 result = append(result, s[last:]) 82 return result 83 }