penguin/golifehk

@golifehk bot in Telegram

utils/shortcuts.go

raw ยท 2728 bytes

package utils

import (
	"bytes"
	"io"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"
)

var MARKDOWN_ESC []string = []string{"_", "*", "[", "]", "(", ")", "~", "`", ">", "#", "+", "-", "=", "|", "{", "}", ".", "!"}

func Contains[T comparable](slice []T, target T) bool {
	for _, v := range slice {
		if v == target {
			return true
		}
	}
	return false
}

func WriteMDv2Text(sb *strings.Builder, t string) {
	for _, c := range MARKDOWN_ESC {
		t = strings.Replace(t, c, "\\"+c, -1)
	}

	sb.WriteString(t)
}

func MDv2Text(t string) string {
	sb := strings.Builder{}

	for _, c := range MARKDOWN_ESC {
		t = strings.Replace(t, c, "\\"+c, -1)
	}

	sb.WriteString(t)
	return sb.String()
}

func IsASCIIAlnum(s string) bool {
	if s == "" {
		return false
	}
	for i := 0; i < len(s); i++ {
		c := s[i]
		if !(c >= '0' && c <= '9' ||
			c >= 'A' && c <= 'Z' ||
			c >= 'a' && c <= 'z') {
			return false
		}
	}
	return true
}

func ToPower(t string) string {
	for s, r := range POWER_NUMBERS {
		t = strings.ReplaceAll(t, s, r)
	}
	return t
}

func ReadBOM(buff *bytes.Buffer) {
	b, _ := buff.ReadByte()
	if b != 0xef {
		buff.UnreadByte()
		return
	}
	b, _ = buff.ReadByte()
	if b != 0xbb {
		buff.UnreadByte()
		buff.UnreadByte()
		return
	}
	b, _ = buff.ReadByte()
	if b != 0xbf {
		buff.UnreadByte()
		buff.UnreadByte()
		buff.UnreadByte()
	}
}

func TryGetEnv[T any](name string, fallback T) T {
	v := os.Getenv(name)

	if v != "" {
		switch any(fallback).(type) {
		case uint64:
			p, err := strconv.ParseUint(v, 10, 64)
			if err == nil {
				return any(uint64(p)).(T)
			}
		case uint32:
			p, err := strconv.ParseUint(v, 10, 32)
			if err == nil {
				return any(uint32(p)).(T)
			}
		case int:
			p, err := strconv.ParseInt(v, 10, 32)
			if err == nil {
				return any(int(p)).(T)
			}
		case float64:
			p, err := strconv.ParseFloat(v, 64)
			if err == nil {
				return any(float64(p)).(T)
			}
		case float32:
			p, err := strconv.ParseFloat(v, 32)
			if err == nil {
				return any(float32(p)).(T)
			}
		default:
			return any(v).(T)
		}

	}

	return fallback
}

func HttpGet(url string) (io.ReadCloser, error) {
	client := &http.Client{
		Timeout: 15 * time.Second,
	}

	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		return nil, err
	}

	ua := "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36"
	req.Header.Set("User-Agent", ua)
	req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
	req.Header.Set("Accept-Language", "en-US,en;q=0.9")
	req.Header.Set("Connection", "keep-alive")

	resp, err := client.Do(req)
	if err != nil {
		return nil, err
	}

	return resp.Body, nil
}