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  }