Skip to content
Snippets Groups Projects
Commit 5705675f authored by Ophestra's avatar Ophestra
Browse files

handle start command and return invite URL, move command handler to its own...

handle start command and return invite URL, move command handler to its own function, fix image relay, escape everyone mentions
parent 14412f9a
Branches
No related tags found
No related merge requests found
...@@ -44,6 +44,7 @@ type discordConf struct { ...@@ -44,6 +44,7 @@ type discordConf struct {
Token string Token string
NameFormat string NameFormat string
StickerText bool StickerText bool
NoMentionEveryone bool
} }
type bridgeConf struct { type bridgeConf struct {
...@@ -117,6 +118,7 @@ var defConf = conf{ ...@@ -117,6 +118,7 @@ var defConf = conf{
Token: "INSERT_TOKEN_HERE", Token: "INSERT_TOKEN_HERE",
NameFormat: "$USER#$DISCRIMINATOR", NameFormat: "$USER#$DISCRIMINATOR",
StickerText: true, StickerText: true,
NoMentionEveryone: true,
}, },
Bridges: struct{ Item []bridgeConf }{Item: []bridgeConf{ Bridges: struct{ Item []bridgeConf }{Item: []bridgeConf{
{ {
......
...@@ -5,7 +5,10 @@ import ( ...@@ -5,7 +5,10 @@ import (
"log" "log"
) )
var session *discordgo.Session var (
session *discordgo.Session
application *discordgo.Application
)
func init() { func init() {
discordgo.Logger = func(msgL, _ int, format string, a ...interface{}) { discordgo.Logger = func(msgL, _ int, format string, a ...interface{}) {
...@@ -45,6 +48,13 @@ func openDiscord() { ...@@ -45,6 +48,13 @@ func openDiscord() {
session.State.User.Username, session.State.User.Discriminator, session.State.User.ID) session.State.User.Username, session.State.User.Discriminator, session.State.User.ID)
} }
if app, err := session.Application("@me"); err != nil {
log.Fatalf("error getting application: %s", err)
} else {
log.Printf("fetched self discord application %s (%s)", app.Name, app.ID)
application = app
}
ready <- struct{}{} ready <- struct{}{}
} }
......
package main package main
import ( import (
"fmt"
"github.com/bwmarrin/discordgo" "github.com/bwmarrin/discordgo"
tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api" tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
"log" "log"
...@@ -102,7 +103,7 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -102,7 +103,7 @@ func respondTelegram(update tgbotapi.Update) {
header, _ := makeHeader(update.EditedMessage, true) header, _ := makeHeader(update.EditedMessage, true)
content = header + content content = header + content
} }
if _, err := session.ChannelMessageEdit(reference.ChannelID, reference.MessageID, content); err != nil { if _, err := session.ChannelMessageEdit(reference.ChannelID, reference.MessageID, escape(content)); err != nil {
msg := tgbotapi.NewMessage(update.EditedMessage.Chat.ID, "error relaying edit") msg := tgbotapi.NewMessage(update.EditedMessage.Chat.ID, "error relaying edit")
msg.ReplyToMessageID = update.EditedMessage.MessageID msg.ReplyToMessageID = update.EditedMessage.MessageID
log.Printf("error relaying edit of %v: %s", update.EditedMessage.MessageID, err) log.Printf("error relaying edit of %v: %s", update.EditedMessage.MessageID, err)
...@@ -126,19 +127,7 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -126,19 +127,7 @@ func respondTelegram(update tgbotapi.Update) {
} }
if update.Message.IsCommand() { if update.Message.IsCommand() {
message := tgbotapi.NewMessage(update.Message.Chat.ID, "") go telegramCommand(update)
switch update.Message.Command() {
case "id":
message.Text = strconv.Itoa(int(update.Message.Chat.ID))
default:
}
if message.Text != "" {
message.ReplyToMessageID = update.Message.MessageID
if _, err := botAPI.Send(message); err != nil {
log.Printf("error responding to command %v, %s", update.Message.Chat.ID, err)
}
return
}
} }
var ( var (
...@@ -176,14 +165,11 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -176,14 +165,11 @@ func respondTelegram(update tgbotapi.Update) {
header, has := makeHeader(update.Message, false) header, has := makeHeader(update.Message, false)
if update.Message.Photo != nil && (len(*update.Message.Photo)/4) > 0 { if update.Message.Photo != nil {
fids := "" var file *discordgo.File
files := make([]*discordgo.File, len(*update.Message.Photo)/4)
p := *update.Message.Photo p := *update.Message.Photo
for i := 0; i < len(files); i++ { info := p[len(p)-1]
// FIXME: multiple images
info := p[((i+1)*4)-1]
var url string var url string
if u, err := botAPI.GetFileDirectURL(info.FileID); err != nil { if u, err := botAPI.GetFileDirectURL(info.FileID); err != nil {
...@@ -203,12 +189,11 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -203,12 +189,11 @@ func respondTelegram(update tgbotapi.Update) {
_, _ = botAPI.Send(msg) _, _ = botAPI.Send(msg)
return return
} else { } else {
files[i] = &discordgo.File{ file = &discordgo.File{
Name: "image.jpg", Name: "image.jpg",
ContentType: "image/jpeg", ContentType: "image/jpeg",
Reader: resp.Body, Reader: resp.Body,
} }
//goland:noinspection GoDeferInLoop
defer func() { defer func() {
if err = resp.Body.Close(); err != nil { if err = resp.Body.Close(); err != nil {
log.Printf("error closing request body: %s", err) log.Printf("error closing request body: %s", err)
...@@ -216,15 +201,9 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -216,15 +201,9 @@ func respondTelegram(update tgbotapi.Update) {
}() }()
} }
if i != 0 {
fids += ", "
}
fids += info.FileID
}
if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{ if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{
Content: header + update.Message.Caption, Content: escape(header + update.Message.Caption),
Files: files, File: file,
Reference: reference, Reference: reference,
}); err != nil { }); err != nil {
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message") msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message")
...@@ -246,7 +225,7 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -246,7 +225,7 @@ func respondTelegram(update tgbotapi.Update) {
hasHeader[update.Message.MessageID] = has hasHeader[update.Message.MessageID] = has
log.Printf("T%vM%v -> D%vM%s @%s (%v) [photo]: %s; caption: %s", log.Printf("T%vM%v -> D%vM%s @%s (%v) [photo]: %s; caption: %s",
tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, fids, update.Message.Caption) tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, info.FileID, update.Message.Caption)
return return
} }
...@@ -288,7 +267,7 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -288,7 +267,7 @@ func respondTelegram(update tgbotapi.Update) {
} }
if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{ if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{
Content: content, Content: escape(content),
File: file, File: file,
Reference: reference, Reference: reference,
}); err != nil { }); err != nil {
...@@ -322,7 +301,7 @@ func respondTelegram(update tgbotapi.Update) { ...@@ -322,7 +301,7 @@ func respondTelegram(update tgbotapi.Update) {
return return
} }
if message, err := session.ChannelMessageSendReply(strconv.Itoa(dc.ID), header+update.Message.Text, reference); err != nil { if message, err := session.ChannelMessageSendReply(strconv.Itoa(dc.ID), escape(header+update.Message.Text), reference); err != nil {
msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message") msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message")
msg.ReplyToMessageID = update.Message.MessageID msg.ReplyToMessageID = update.Message.MessageID
log.Printf("error relaying message %v: %s", update.Message.MessageID, err.Error()) log.Printf("error relaying message %v: %s", update.Message.MessageID, err.Error())
...@@ -359,3 +338,39 @@ func makeHeader(message *tgbotapi.Message, force bool) (string, bool) { ...@@ -359,3 +338,39 @@ func makeHeader(message *tgbotapi.Message, force bool) (string, bool) {
} }
return "", false return "", false
} }
func escape(str string) string {
if !config.Discord.NoMentionEveryone {
return str
}
return strings.ReplaceAll(strings.ReplaceAll(str,
"@everyone", "@\u200beveryone"),
"@here", "@\u200bhere")
}
func telegramCommand(update tgbotapi.Update) {
message := tgbotapi.NewMessage(update.Message.Chat.ID, "")
switch update.Message.Command() {
case "start":
if update.Message.Chat.ID == int64(update.Message.From.ID) {
message.ParseMode = "Markdown"
message.Text = "Thanks for using BridgeThing!\n" +
"To find the ID of a Telegram chat, use /id\n" +
"To get the invite URL, use /invite\n" +
"Have fun!"
}
case "id":
message.Text = strconv.Itoa(int(update.Message.Chat.ID))
case "invite":
message.DisableWebPagePreview = true
message.Text = fmt.Sprintf("https://discord.com/oauth2/authorize?client_id=%s&scope=bot&permissions=8192",
application.ID)
}
if message.Text != "" {
message.ReplyToMessageID = update.Message.MessageID
if _, err := botAPI.Send(message); err != nil {
log.Printf("error responding to command %v, %s", update.Message.Chat.ID, err)
}
return
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment