7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
113 lines
4.1 KiB
Go
113 lines
4.1 KiB
Go
// mautrix-telegram - A Matrix-Telegram puppeting bridge.
|
|
// Copyright (C) 2024 Sumner Evans
|
|
//
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
package matrixfmt
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"maunium.net/go/mautrix/event"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
|
|
|
|
"go.mau.fi/mautrix-telegram/pkg/connector/ids"
|
|
"go.mau.fi/mautrix-telegram/pkg/connector/telegramfmt"
|
|
)
|
|
|
|
func toTelegramEntity(br telegramfmt.BodyRange) tg.MessageEntityClass {
|
|
switch val := br.Value.(type) {
|
|
case telegramfmt.Mention:
|
|
if val.Username != "" {
|
|
return &tg.MessageEntityMention{Offset: br.Start, Length: br.Length}
|
|
} else {
|
|
peerType, userID, _ := ids.ParseUserID(val.UserID)
|
|
if peerType != ids.PeerTypeUser {
|
|
panic(fmt.Errorf("unexpected peer type in mention %T", peerType))
|
|
}
|
|
return &tg.InputMessageEntityMentionName{
|
|
Offset: br.Start,
|
|
Length: br.Length,
|
|
UserID: &tg.InputUser{UserID: userID, AccessHash: val.AccessHash},
|
|
}
|
|
}
|
|
case telegramfmt.Style:
|
|
switch val.Type {
|
|
case telegramfmt.StyleBold:
|
|
return &tg.MessageEntityBold{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleItalic:
|
|
return &tg.MessageEntityItalic{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleUnderline:
|
|
return &tg.MessageEntityUnderline{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleStrikethrough:
|
|
return &tg.MessageEntityStrike{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleBlockquote:
|
|
return &tg.MessageEntityBlockquote{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleCode:
|
|
return &tg.MessageEntityCode{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StylePre:
|
|
return &tg.MessageEntityPre{Offset: br.Start, Length: br.Length, Language: val.Language}
|
|
case telegramfmt.StyleEmail:
|
|
return &tg.MessageEntityEmail{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleTextURL:
|
|
return &tg.MessageEntityTextURL{Offset: br.Start, Length: br.Length, URL: val.URL}
|
|
case telegramfmt.StyleURL:
|
|
return &tg.MessageEntityURL{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleBotCommand:
|
|
return &tg.MessageEntityBotCommand{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleHashtag:
|
|
return &tg.MessageEntityHashtag{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleCashtag:
|
|
return &tg.MessageEntityCashtag{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StylePhone:
|
|
return &tg.MessageEntityPhone{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleSpoiler:
|
|
return &tg.MessageEntitySpoiler{Offset: br.Start, Length: br.Length}
|
|
case telegramfmt.StyleBankCard:
|
|
return &tg.MessageEntityBankCard{Offset: br.Start, Length: br.Length}
|
|
default:
|
|
panic("unsupported style type")
|
|
}
|
|
default:
|
|
panic("unknown body range value")
|
|
}
|
|
}
|
|
|
|
func Parse(ctx context.Context, parser *HTMLParser, content *event.MessageEventContent) (string, []tg.MessageEntityClass) {
|
|
if content.MsgType.IsMedia() && (content.FileName == "" || content.FileName == content.Body) {
|
|
// The body is the filename.
|
|
return "", nil
|
|
}
|
|
|
|
if content.Format != event.FormatHTML {
|
|
return content.Body, nil
|
|
}
|
|
parseCtx := NewContext(ctx)
|
|
parseCtx.AllowedMentions = content.Mentions
|
|
parsed := parser.Parse(content.FormattedBody, parseCtx)
|
|
if parsed == nil {
|
|
return "", nil
|
|
}
|
|
var entities []tg.MessageEntityClass
|
|
if len(parsed.Entities) > 0 {
|
|
entities = make([]tg.MessageEntityClass, len(parsed.Entities))
|
|
for i, ent := range parsed.Entities {
|
|
entities[i] = toTelegramEntity(ent)
|
|
}
|
|
}
|
|
return parsed.String.String(), entities
|
|
}
|