добавил отображение логинов, сборка в докере

This commit is contained in:
taz
2025-08-13 18:36:56 +02:00
parent d80277c4f1
commit c4962a32fd
7 changed files with 90 additions and 43 deletions
+3
View File
@@ -0,0 +1,3 @@
Dockerfile
docker-compose.yml
.env
+1
View File
@@ -0,0 +1 @@
.env
+20
View File
@@ -0,0 +1,20 @@
# Go Chat Bridge Dockerfile
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY . .
RUN go mod tidy && go build -o chat-bridge .
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/chat-bridge .
# Переменные окружения (можно задать через docker run -e ...)
ENV TELEGRAM_TOKEN=""
ENV DISCORD_TOKEN=""
ENV VK_TOKEN=""
ENV TELEGRAM_CHAT_ID=""
ENV DISCORD_CHANNEL_ID=""
ENV VK_PEER_ID=""
ENV VK_GROUP_ID=""
CMD ["./chat-bridge"]
+10
View File
@@ -1,11 +1,21 @@
package main package main
import ( import (
"strconv"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
"github.com/SevereCloud/vksdk/v2/api" "github.com/SevereCloud/vksdk/v2/api"
) )
// Получить имя пользователя VK по id
func (b *Bridge) GetVKUserName(userID int) (string, error) {
resp, err := b.VK.UsersGet(api.Params{"user_ids": userID})
if err != nil || len(resp) == 0 {
return strconv.Itoa(userID), err
}
return resp[0].FirstName + " " + resp[0].LastName, nil
}
// Структура для хранения клиентов // Структура для хранения клиентов
type Bridge struct { type Bridge struct {
Telegram *tgbotapi.BotAPI Telegram *tgbotapi.BotAPI
+14
View File
@@ -0,0 +1,14 @@
version: '3.8'
services:
chat-bridge:
build: .
container_name: chat-bridge
environment:
TELEGRAM_TOKEN: "${TELEGRAM_TOKEN}"
DISCORD_TOKEN: "${DISCORD_TOKEN}"
VK_TOKEN: "${VK_TOKEN}"
TELEGRAM_CHAT_ID: "${TELEGRAM_CHAT_ID}"
DISCORD_CHANNEL_ID: "${DISCORD_CHANNEL_ID}"
VK_PEER_ID: "${VK_PEER_ID}"
VK_GROUP_ID: "${VK_GROUP_ID}"
restart: unless-stopped
+15 -20
View File
@@ -29,50 +29,45 @@ 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) { forward := func(text string, from string, sender string) {
log.Printf("[Bridge] Пересылка сообщения от %s: %s", from, text) log.Printf("[Bridge] Пересылка сообщения от %s (%s): %s", from, sender, text)
// Определяем источник и рассылаем в остальные платформы switch from {
switch { case "telegram":
case from == "telegram":
// В Discord и VK
if discordChannelID != "" { if discordChannelID != "" {
_ = bridge.SendToDiscord(discordChannelID, "[TG] "+text) _ = bridge.SendToDiscord(discordChannelID, "[TG] "+sender+": "+text)
} }
if vkPeerID != "" { if vkPeerID != "" {
// конвертация vkPeerID в int
if id, err := strconv.Atoi(vkPeerID); err == nil { if id, err := strconv.Atoi(vkPeerID); err == nil {
_ = bridge.SendToVK(id, "[TG] "+text) _ = bridge.SendToVK(id, "[TG] "+sender+": "+text)
} }
} }
case from == "discord": case "discord":
// В Telegram и 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, "[DS] "+text) _ = bridge.SendToTelegram(id, "[DS] "+sender+": "+text)
} }
} }
if vkPeerID != "" { if vkPeerID != "" {
if id, err := strconv.Atoi(vkPeerID); err == nil { if id, err := strconv.Atoi(vkPeerID); err == nil {
_ = bridge.SendToVK(id, "[DS] "+text) _ = bridge.SendToVK(id, "[DS] "+sender+": "+text)
} }
} }
case from == "vk": case "vk":
// В Telegram и 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, "[VK] "+text) _ = bridge.SendToTelegram(id, "[VK] "+sender+": "+text)
} }
} }
if discordChannelID != "" { if discordChannelID != "" {
_ = bridge.SendToDiscord(discordChannelID, "[VK] "+text) _ = bridge.SendToDiscord(discordChannelID, "[VK] "+sender+": "+text)
} }
} }
} }
bridge.StartTelegramListener(func(text, _ string) { forward(text, "telegram") }) bridge.StartTelegramListener(func(text, sender string) { forward(text, "telegram", sender) })
bridge.StartDiscordListener(func(text, _ string) { forward(text, "discord") }) bridge.StartDiscordListener(func(text, sender string) { forward(text, "discord", sender) })
bridge.StartVKListener(func(text, _ string) { forward(text, "vk") }) bridge.StartVKListener(func(text, sender string) { forward(text, "vk", sender) })
select {} // Блокируем main, чтобы слушатели работали select {} // Блокируем main, чтобы слушатели работали
} }
+5 -1
View File
@@ -29,7 +29,11 @@ func (b *Bridge) StartVKListener(forward func(text string, from string)) {
lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) { lp.MessageNew(func(_ context.Context, obj events.MessageNewObject) {
log.Printf("[VK] %d: %s", obj.Message.FromID, obj.Message.Text) log.Printf("[VK] %d: %s", obj.Message.FromID, obj.Message.Text)
forward(obj.Message.Text, "vk:"+strconv.Itoa(obj.Message.FromID)) sender := "vk:" + strconv.Itoa(obj.Message.FromID)
if name, err := b.GetVKUserName(obj.Message.FromID); err == nil {
sender = name
}
forward(obj.Message.Text, sender)
}) })
go lp.Run() go lp.Run()
} }