package main import ( "encoding/json" "log" "net/http" "os" "strconv" "strings" ) func main() { log.Println("Go Chat Bridge запущен.") telegramToken := os.Getenv("TELEGRAM_TOKEN") discordToken := os.Getenv("DISCORD_TOKEN") vkToken := os.Getenv("VK_TOKEN") if telegramToken == "" || discordToken == "" || vkToken == "" { log.Fatal("Необходимо задать переменные окружения TELEGRAM_TOKEN, DISCORD_TOKEN, VK_TOKEN") } bridge, err := NewBridge(telegramToken, discordToken, vkToken) if err != nil { log.Fatalf("Ошибка инициализации Bridge: %v", err) } log.Println("Bridge успешно инициализирован:", bridge) // Получаем ID чатов/каналов из переменных окружения telegramChatID := os.Getenv("TELEGRAM_CHAT_ID") // int64 discordChannelID := os.Getenv("DISCORD_CHANNEL_ID") // string vkPeerID := os.Getenv("VK_PEER_ID") // int forward := func(text string, from string, sender string, media []string) { // Собираем итоговый текст с медиа 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 { case "telegram": if discordChannelID != "" { _ = bridge.SendToDiscord(discordChannelID, "[TG] "+sender+": "+msg) } if vkPeerID != "" { if id, err := strconv.Atoi(vkPeerID); err == nil { _ = bridge.SendToVK(id, "[TG] "+sender+": "+msg) } } _ = bridge.SendToSite("[TG] " + sender + ": " + msg) case "discord": if telegramChatID != "" { if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil { _ = bridge.SendToTelegram(id, "[DS] "+sender+": "+msg) } } if vkPeerID != "" { if id, err := strconv.Atoi(vkPeerID); err == nil { _ = bridge.SendToVK(id, "[DS] "+sender+": "+msg) } } _ = bridge.SendToSite("[DS] " + sender + ": " + msg) case "vk": if telegramChatID != "" { if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil { _ = bridge.SendToTelegram(id, "[VK] "+sender+": "+msg) } } if discordChannelID != "" { _ = bridge.SendToDiscord(discordChannelID, "[VK] "+sender+": "+msg) } _ = bridge.SendToSite("[VK] " + sender + ": " + msg) case "site": if telegramChatID != "" { if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil { _ = bridge.SendToTelegram(id, "[SITE] "+sender+": "+msg) } } if discordChannelID != "" { _ = bridge.SendToDiscord(discordChannelID, "[SITE] "+sender+": "+msg) } if vkPeerID != "" { if id, err := strconv.Atoi(vkPeerID); err == nil { _ = bridge.SendToVK(id, "[SITE] "+sender+": "+msg) } } } } bridge.StartTelegramListener(func(text string, sender string, media []string) { forward(text, "telegram", sender, media) }) bridge.StartDiscordListener(func(text string, sender string, media []string) { forward(text, "discord", sender, media) }) bridge.StartVKListener(func(text string, sender string, media []string) { forward(text, "vk", sender, media) }) // webhook endpoint http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "Method not allowed", http.StatusMethodNotAllowed) return } apiKey := os.Getenv("WEBHOOK_API_KEY") if apiKey == "" { http.Error(w, "Webhook API key not set", http.StatusInternalServerError) return } key := r.URL.Query().Get("key") if key == "" { // также можно принимать ключ в теле запроса var req struct { Key string `json:"key"` Text string `json:"text"` Sender string `json:"sender"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { http.Error(w, "Bad request", http.StatusBadRequest) return } if req.Key != apiKey { http.Error(w, "Forbidden", http.StatusForbidden) return } forward(req.Text, "site", req.Sender, nil) w.WriteHeader(http.StatusOK) w.Write([]byte("ok")) return } if key != apiKey { http.Error(w, "Forbidden", http.StatusForbidden) return } var req struct { Text string `json:"text"` Sender string `json:"sender"` } if err := json.NewDecoder(r.Body).Decode(&req); err != nil { http.Error(w, "Bad request", http.StatusBadRequest) return } forward(req.Text, "site", req.Sender, nil) w.WriteHeader(http.StatusOK) w.Write([]byte("ok")) }) log.Println("Webhook listening on :8080 (/webhook)") log.Fatal(http.ListenAndServe(":8080", nil)) }