telegram-mcp-read-only/internal/tg/helpers.go
2025-04-04 00:49:27 +03:00

100 lines
1.8 KiB
Go

package tg
import (
"encoding/json"
"github.com/gotd/td/tg"
"github.com/tidwall/gjson"
)
func getName(source any) string {
var name string
switch u := source.(type) {
case *tg.User:
name = u.FirstName
if u.LastName != "" {
name += " " + u.LastName
}
if username, ok := u.GetUsername(); ok && username != "" {
name += " @" + username + ""
}
case *tg.Chat:
name = u.Title
case *tg.Channel:
name = u.Title
if username, ok := u.GetUsername(); ok && username != "" {
name += " @" + username + ""
}
}
return name
}
// cleanJSON removes empty/default fields from JSON
func cleanJSON(data []byte) []byte {
result := gjson.ParseBytes(data)
cleaned := cleanValue(result)
if cleaned == nil {
return data // Return original if cleaning failed
}
cleanedJSON, err := json.Marshal(cleaned)
if err != nil {
return data // Return original if marshaling failed
}
return cleanedJSON
}
func cleanValue(v gjson.Result) interface{} {
switch v.Type {
case gjson.String:
if v.String() == "" {
return nil
}
return v.String()
case gjson.Number:
// return nil
if v.Int() == 0 && v.Float() == 0 {
return nil
}
return v.Value()
case gjson.True:
return nil
// return true
case gjson.False:
return nil
case gjson.Null:
return nil
case gjson.JSON:
if v.IsArray() {
arr := make([]interface{}, 0)
v.ForEach(func(_, item gjson.Result) bool {
if cleaned := cleanValue(item); cleaned != nil {
arr = append(arr, cleaned)
}
return true
})
if len(arr) == 0 {
return nil
}
return arr
}
if v.IsObject() {
obj := make(map[string]interface{})
v.ForEach(func(key, val gjson.Result) bool {
if cleaned := cleanValue(val); cleaned != nil {
obj[key.String()] = cleaned
}
return true
})
if len(obj) == 0 {
return nil
}
return obj
}
}
return nil
}