commands: add join group command

This commit is contained in:
Tulir Asokan
2026-04-03 21:52:05 +03:00
parent 795b27275f
commit 0bee8da0f8
2 changed files with 97 additions and 1 deletions
+96
View File
@@ -18,6 +18,7 @@ package connector
import (
"errors"
"regexp"
"slices"
"strings"
@@ -27,6 +28,8 @@ import (
"maunium.net/go/mautrix/format"
"go.mau.fi/mautrix-telegram/pkg/connector/ids"
"go.mau.fi/mautrix-telegram/pkg/gotd/tg"
"go.mau.fi/mautrix-telegram/pkg/gotd/tgerr"
)
var cmdSyncChats = &commands.FullHandler{
@@ -101,6 +104,99 @@ func fnUpgrade(ce *commands.Event) {
}
}
var cmdJoin = &commands.FullHandler{
Func: fnJoin,
Name: "join",
Help: commands.HelpMeta{
Section: commands.HelpSectionChats,
Description: "Join a Telegram group using an invite link.",
Args: "[login ID] <invite link>",
},
RequiresLogin: true,
}
var usernameLinkRe = regexp.MustCompile(`^(?:(?:https?://)?t(?:elegram)?\.(?:me|dog)/|tg:/{0,2}resolve\?domain=)([a-zA-Z]\w{3,30}[a-zA-Z\d])(?:\?.+)?$`)
var inviteLinkRe = regexp.MustCompile(`^(?:(?:https?://)?t(?:elegram)?\.(?:me|dog)/(?:joinchat/|\+)|tg:/{0,2}join\?invite=)([a-zA-Z0-9_-]{22})(?:\?.+)?$`)
func fnJoin(ce *commands.Event) {
if len(ce.Args) == 0 || len(ce.Args) > 2 {
ce.Reply("Usage: `$cmdprefix join [login ID] <invite link>`")
return
}
var login *bridgev2.UserLogin
if len(ce.Args) == 2 {
targetLogin := ce.Bridge.GetCachedUserLoginByID(networkid.UserLoginID(ce.Args[0]))
if targetLogin == nil || targetLogin.UserMXID != ce.User.MXID {
ce.Reply("No login found with the provided ID.")
return
}
login = targetLogin
ce.Args = ce.Args[1:]
} else {
login = ce.User.GetDefaultLogin()
if login == nil {
ce.Reply("You're not logged in.")
return
}
}
t := login.Client.(*TelegramClient)
var resp tg.UpdatesClass
if usernameMatch := usernameLinkRe.FindStringSubmatch(ce.Args[0]); usernameMatch != nil {
resolve, err := t.client.API().ContactsResolveUsername(ce.Ctx, &tg.ContactsResolveUsernameRequest{Username: usernameMatch[1]})
if err != nil {
ce.Log.Err(err).Msg("Failed to resolve username from invite link")
ce.Reply("Failed to resolve username from invite link: %v", err)
return
}
peer, isChannel := resolve.Peer.(*tg.PeerChannel)
if !isChannel {
ce.Reply("That username does not belong to a channel or supergroup.")
return
}
var ch *tg.Channel
for _, chat := range resolve.Chats {
if chat.GetID() == peer.ChannelID {
ch = chat.(*tg.Channel)
}
}
if ch == nil {
ce.Reply("Channel information not found in resolve response.")
return
}
resp, err = t.client.API().ChannelsJoinChannel(ce.Ctx, ch.AsInput())
if err != nil {
ce.Log.Err(err).Msg("Failed to join chat with invite link")
ce.Reply("Failed to join chat: %v", err)
return
}
} else if inviteLinkMatch := inviteLinkRe.FindStringSubmatch(ce.Args[0]); inviteLinkMatch != nil {
_, err := t.client.API().MessagesCheckChatInvite(ce.Ctx, inviteLinkMatch[1])
if tgerr.Is(err, tg.ErrInviteHashInvalid) {
ce.Reply("Invalid invite link.")
return
} else if tgerr.Is(err, tg.ErrInviteHashExpired) {
ce.Reply("Invite link expired.")
return
}
resp, err = t.client.API().MessagesImportChatInvite(ce.Ctx, inviteLinkMatch[1])
if err != nil {
ce.Log.Err(err).Msg("Failed to join chat with invite link")
ce.Reply("Failed to join chat: %v", err)
return
}
} else {
ce.Reply("Invalid invite link format.")
return
}
err := t.dispatcher.Handle(ce.Ctx, resp)
if err != nil {
ce.Log.Err(err).Msg("Failed to handle updates from joining chat with invite link")
} else {
ce.Log.Debug().Msg("Finished handling updates from joining chat with invite link")
}
ce.React("\u2705\ufe0f")
}
var cmdEmojiPack = &commands.FullHandler{
Func: fnEmojiPack,
Name: "emoji-pack",
+1 -1
View File
@@ -41,7 +41,7 @@ var _ bridgev2.MaxFileSizeingNetwork = (*TelegramConnector)(nil)
func (tg *TelegramConnector) Init(bridge *bridgev2.Bridge) {
tg.Store = store.NewStore(bridge.DB.Database, dbutil.ZeroLogger(bridge.Log.With().Str("db_section", "telegram").Logger()))
tg.Bridge = bridge
tg.Bridge.Commands.(*commands.Processor).AddHandlers(cmdSyncChats, cmdEmojiPack, cmdUpgrade)
tg.Bridge.Commands.(*commands.Processor).AddHandlers(cmdSyncChats, cmdEmojiPack, cmdUpgrade, cmdJoin)
}
func (tg *TelegramConnector) Start(ctx context.Context) error {