Добавлена пересылка медиа файлов

This commit is contained in:
Taz
2025-09-04 13:32:58 +02:00
parent 7e941e1497
commit 2e1fb49d9a
4 changed files with 203 additions and 130 deletions
+10 -2
View File
@@ -2,16 +2,24 @@ package main
import ( import (
"log" "log"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
) )
func (b *Bridge) StartDiscordListener(forward func(text string, from string)) { func (b *Bridge) StartDiscordListener(forward func(text string, sender string, media []string)) {
b.Discord.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) { b.Discord.AddHandler(func(s *discordgo.Session, m *discordgo.MessageCreate) {
if m.Author.Bot { if m.Author.Bot {
return return
} }
// Собираем URL вложений
media := make([]string, 0)
for _, a := range m.Attachments {
if a.URL != "" {
media = append(media, a.URL)
}
}
log.Printf("[Discord] %s: %s", m.Author.Username, m.Content) log.Printf("[Discord] %s: %s", m.Author.Username, m.Content)
forward(m.Content, m.Author.Username) forward(m.Content, m.Author.Username, media)
}) })
_ = b.Discord.Open() _ = b.Discord.Open()
} }
+30 -21
View File
@@ -1,11 +1,12 @@
package main package main
import ( import (
"encoding/json"
"log" "log"
"net/http"
"os" "os"
"strconv" "strconv"
"net/http" "strings"
"encoding/json"
) )
func main() { func main() {
@@ -31,62 +32,70 @@ func main() {
discordChannelID := os.Getenv("DISCORD_CHANNEL_ID") // string discordChannelID := os.Getenv("DISCORD_CHANNEL_ID") // string
vkPeerID := os.Getenv("VK_PEER_ID") // int vkPeerID := os.Getenv("VK_PEER_ID") // int
forward := func(text string, from string, sender string) { forward := func(text string, from string, sender string, media []string) {
log.Printf("[Bridge] Пересылка сообщения от %s (%s): %s", from, sender, text) // Собираем итоговый текст с медиа URL, если есть
msg := text
if len(media) > 0 {
if msg != "" {
msg += "\n"
}
msg += strings.Join(media, "\n")
}
log.Printf("[Bridge] Пересылка сообщения от %s (%s): %s", from, sender, msg)
switch from { switch from {
case "telegram": case "telegram":
if discordChannelID != "" { if discordChannelID != "" {
_ = bridge.SendToDiscord(discordChannelID, "[TG] "+sender+": "+text) _ = bridge.SendToDiscord(discordChannelID, "[TG] "+sender+": "+msg)
} }
if vkPeerID != "" { if vkPeerID != "" {
if id, err := strconv.Atoi(vkPeerID); err == nil { if id, err := strconv.Atoi(vkPeerID); err == nil {
_ = bridge.SendToVK(id, "[TG] "+sender+": "+text) _ = bridge.SendToVK(id, "[TG] "+sender+": "+msg)
} }
} }
_ = bridge.SendToSite("[TG] " + sender + ": " + text) _ = bridge.SendToSite("[TG] " + sender + ": " + msg)
case "discord": case "discord":
if telegramChatID != "" { if telegramChatID != "" {
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil { if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
_ = bridge.SendToTelegram(id, "[DS] "+sender+": "+text) _ = bridge.SendToTelegram(id, "[DS] "+sender+": "+msg)
} }
} }
if vkPeerID != "" { if vkPeerID != "" {
if id, err := strconv.Atoi(vkPeerID); err == nil { if id, err := strconv.Atoi(vkPeerID); err == nil {
_ = bridge.SendToVK(id, "[DS] "+sender+": "+text) _ = bridge.SendToVK(id, "[DS] "+sender+": "+msg)
} }
} }
_ = bridge.SendToSite("[DS] " + sender + ": " + text) _ = bridge.SendToSite("[DS] " + sender + ": " + msg)
case "vk": case "vk":
if telegramChatID != "" { if telegramChatID != "" {
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil { if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
_ = bridge.SendToTelegram(id, "[VK] "+sender+": "+text) _ = bridge.SendToTelegram(id, "[VK] "+sender+": "+msg)
} }
} }
if discordChannelID != "" { if discordChannelID != "" {
_ = bridge.SendToDiscord(discordChannelID, "[VK] "+sender+": "+text) _ = bridge.SendToDiscord(discordChannelID, "[VK] "+sender+": "+msg)
} }
_ = bridge.SendToSite("[VK] " + sender + ": " + text) _ = bridge.SendToSite("[VK] " + sender + ": " + msg)
case "site": case "site":
if telegramChatID != "" { if telegramChatID != "" {
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil { if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
_ = bridge.SendToTelegram(id, "[SITE] "+sender+": "+text) _ = bridge.SendToTelegram(id, "[SITE] "+sender+": "+msg)
} }
} }
if discordChannelID != "" { if discordChannelID != "" {
_ = bridge.SendToDiscord(discordChannelID, "[SITE] "+sender+": "+text) _ = bridge.SendToDiscord(discordChannelID, "[SITE] "+sender+": "+msg)
} }
if vkPeerID != "" { if vkPeerID != "" {
if id, err := strconv.Atoi(vkPeerID); err == nil { if id, err := strconv.Atoi(vkPeerID); err == nil {
_ = bridge.SendToVK(id, "[SITE] "+sender+": "+text) _ = bridge.SendToVK(id, "[SITE] "+sender+": "+msg)
} }
} }
} }
} }
bridge.StartTelegramListener(func(text, sender string) { forward(text, "telegram", sender) }) bridge.StartTelegramListener(func(text string, sender string, media []string) { forward(text, "telegram", sender, media) })
bridge.StartDiscordListener(func(text, sender string) { forward(text, "discord", sender) }) bridge.StartDiscordListener(func(text string, sender string, media []string) { forward(text, "discord", sender, media) })
bridge.StartVKListener(func(text, sender string) { forward(text, "vk", sender) }) bridge.StartVKListener(func(text string, sender string, media []string) { forward(text, "vk", sender, media) })
// webhook endpoint // webhook endpoint
http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) { http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {
@@ -115,7 +124,7 @@ func main() {
http.Error(w, "Forbidden", http.StatusForbidden) http.Error(w, "Forbidden", http.StatusForbidden)
return return
} }
forward(req.Text, "site", req.Sender) forward(req.Text, "site", req.Sender, nil)
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte("ok")) w.Write([]byte("ok"))
return return
@@ -132,7 +141,7 @@ func main() {
http.Error(w, "Bad request", http.StatusBadRequest) http.Error(w, "Bad request", http.StatusBadRequest)
return return
} }
forward(req.Text, "site", req.Sender) forward(req.Text, "site", req.Sender, nil)
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
w.Write([]byte("ok")) w.Write([]byte("ok"))
}) })
+58 -3
View File
@@ -1,12 +1,13 @@
package main package main
import ( import (
"fmt"
"log" "log"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
) )
func (b *Bridge) StartTelegramListener(forward func(text string, from string)) { func (b *Bridge) StartTelegramListener(forward func(text string, sender string, media []string)) {
u := tgbotapi.NewUpdate(0) u := tgbotapi.NewUpdate(0)
u.Timeout = 60 u.Timeout = 60
@@ -22,9 +23,63 @@ func (b *Bridge) StartTelegramListener(forward func(text string, from string)) {
if update.Message.From.UserName != "" { if update.Message.From.UserName != "" {
userInfo += " " + update.Message.From.UserName userInfo += " " + update.Message.From.UserName
} }
// Собираем медиа URL'ы
media := make([]string, 0)
getFileURL := func(fileID string) (string, error) {
file, err := b.Telegram.GetFile(tgbotapi.FileConfig{FileID: fileID})
if err != nil {
return "", err
}
return fmt.Sprintf("https://api.telegram.org/file/bot%s/%s", b.Telegram.Token, file.FilePath), nil
}
// Фото (берём самое большое)
if len(update.Message.Photo) > 0 {
photo := update.Message.Photo[len(update.Message.Photo)-1]
if url, err := getFileURL(photo.FileID); err == nil {
media = append(media, url)
}
}
// Document
if update.Message.Document != nil {
if url, err := getFileURL(update.Message.Document.FileID); err == nil {
media = append(media, url)
}
}
// Video
if update.Message.Video != nil {
if url, err := getFileURL(update.Message.Video.FileID); err == nil {
media = append(media, url)
}
}
// Audio
if update.Message.Audio != nil {
if url, err := getFileURL(update.Message.Audio.FileID); err == nil {
media = append(media, url)
}
}
// Voice
if update.Message.Voice != nil {
if url, err := getFileURL(update.Message.Voice.FileID); err == nil {
media = append(media, url)
}
}
// Animation (GIF)
if update.Message.Animation != nil {
if url, err := getFileURL(update.Message.Animation.FileID); err == nil {
media = append(media, url)
}
}
log.Printf("[Telegram] %s: %s", userInfo, update.Message.Text) log.Printf("[Telegram] %s: %s", userInfo, update.Message.Text)
// Передаём имя отправителя // Передаём имя отправителя и медиа
forward(update.Message.Text, userInfo) forward(update.Message.Text, userInfo, media)
} }
}() }()
} }
+4 -3
View File
@@ -1,15 +1,16 @@
package main package main
import ( import (
"context"
"log" "log"
"os" "os"
"strconv" "strconv"
"context"
"github.com/SevereCloud/vksdk/v2/events" "github.com/SevereCloud/vksdk/v2/events"
"github.com/SevereCloud/vksdk/v2/longpoll-bot" "github.com/SevereCloud/vksdk/v2/longpoll-bot"
) )
func (b *Bridge) StartVKListener(forward func(text string, from string)) { func (b *Bridge) StartVKListener(forward func(text string, sender string, media []string)) {
groupIDStr := os.Getenv("VK_GROUP_ID") groupIDStr := os.Getenv("VK_GROUP_ID")
if groupIDStr == "" { if groupIDStr == "" {
log.Println("VK_GROUP_ID не задана в переменных окружения") log.Println("VK_GROUP_ID не задана в переменных окружения")
@@ -33,7 +34,7 @@ func (b *Bridge) StartVKListener(forward func(text string, from string)) {
if name, err := b.GetVKUserName(obj.Message.FromID); err == nil { if name, err := b.GetVKUserName(obj.Message.FromID); err == nil {
sender = name sender = name
} }
forward(obj.Message.Text, sender) forward(obj.Message.Text, sender, nil)
}) })
go lp.Run() go lp.Run()
} }