Public Access
добавил отображение логинов, сборка в докере
This commit is contained in:
@@ -0,0 +1,3 @@
|
|||||||
|
Dockerfile
|
||||||
|
docker-compose.yml
|
||||||
|
.env
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.env
|
||||||
+20
@@ -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"]
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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":
|
if discordChannelID != "" {
|
||||||
// В Discord и VK
|
_ = bridge.SendToDiscord(discordChannelID, "[TG] "+sender+": "+text)
|
||||||
if discordChannelID != "" {
|
}
|
||||||
_ = bridge.SendToDiscord(discordChannelID, "[TG] "+text)
|
if vkPeerID != "" {
|
||||||
}
|
if id, err := strconv.Atoi(vkPeerID); err == nil {
|
||||||
if vkPeerID != "" {
|
_ = bridge.SendToVK(id, "[TG] "+sender+": "+text)
|
||||||
// конвертация vkPeerID в int
|
}
|
||||||
if id, err := strconv.Atoi(vkPeerID); err == nil {
|
}
|
||||||
_ = bridge.SendToVK(id, "[TG] "+text)
|
case "discord":
|
||||||
}
|
if telegramChatID != "" {
|
||||||
}
|
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
|
||||||
case from == "discord":
|
_ = bridge.SendToTelegram(id, "[DS] "+sender+": "+text)
|
||||||
// В Telegram и VK
|
}
|
||||||
if telegramChatID != "" {
|
}
|
||||||
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
|
if vkPeerID != "" {
|
||||||
_ = bridge.SendToTelegram(id, "[DS] "+text)
|
if id, err := strconv.Atoi(vkPeerID); err == nil {
|
||||||
}
|
_ = bridge.SendToVK(id, "[DS] "+sender+": "+text)
|
||||||
}
|
}
|
||||||
if vkPeerID != "" {
|
}
|
||||||
if id, err := strconv.Atoi(vkPeerID); err == nil {
|
case "vk":
|
||||||
_ = bridge.SendToVK(id, "[DS] "+text)
|
if telegramChatID != "" {
|
||||||
}
|
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
|
||||||
}
|
_ = bridge.SendToTelegram(id, "[VK] "+sender+": "+text)
|
||||||
case from == "vk":
|
}
|
||||||
// В Telegram и Discord
|
}
|
||||||
if telegramChatID != "" {
|
if discordChannelID != "" {
|
||||||
if id, err := strconv.ParseInt(telegramChatID, 10, 64); err == nil {
|
_ = bridge.SendToDiscord(discordChannelID, "[VK] "+sender+": "+text)
|
||||||
_ = bridge.SendToTelegram(id, "[VK] "+text)
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if discordChannelID != "" {
|
|
||||||
_ = bridge.SendToDiscord(discordChannelID, "[VK] "+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
@@ -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()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user