From be2946fcf8501ba62eb0a9cbf54d12f88d811790 Mon Sep 17 00:00:00 2001
From: RandomChars <random@chars.jp>
Date: Tue, 9 Nov 2021 09:49:26 +0900
Subject: [PATCH] accept discord user IDs as negative integers and create user
 channels for them automatically

---
 config.go  | 13 +++++++++----
 discord.go | 20 +++++++++++++++++++-
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/config.go b/config.go
index 25ca85c..3ec2e91 100644
--- a/config.go
+++ b/config.go
@@ -13,8 +13,9 @@ var (
 	confPath string
 	parsed   = false
 
-	discordBridge  = make(map[string]bridgeConf)
-	telegramBridge = make(map[int64]bridgeConf)
+	discordPMQueue = make(map[string]*bridgeConf)
+	discordBridge  = make(map[string]*bridgeConf)
+	telegramBridge = make(map[int64]*bridgeConf)
 )
 
 func init() {
@@ -95,10 +96,14 @@ func setupConfig() {
 
 	for _, c := range config.Bridges.Item {
 		if c.Discord.Enable {
-			discordBridge[strconv.Itoa(c.Discord.ID)] = c
+			if c.Discord.ID < 0 {
+				discordPMQueue[strconv.Itoa(c.Discord.ID)] = &c
+			} else {
+				discordBridge[strconv.Itoa(c.Discord.ID)] = &c
+			}
 		}
 		if c.Telegram.Enable {
-			telegramBridge[int64(c.Telegram.ID)] = c
+			telegramBridge[int64(c.Telegram.ID)] = &c
 		}
 	}
 }
diff --git a/discord.go b/discord.go
index d3bd7fb..085ab35 100644
--- a/discord.go
+++ b/discord.go
@@ -5,6 +5,7 @@ import (
 	"github.com/bwmarrin/discordgo"
 	tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api"
 	"log"
+	"strconv"
 	"strings"
 )
 
@@ -41,7 +42,7 @@ func openDiscord() {
 		session = s
 	}
 
-	session.Identify.Intents = discordgo.IntentsGuildMessages
+	session.Identify.Intents = discordgo.IntentsGuildMessages | discordgo.IntentsDirectMessages
 	session.Token = "Bot " + config.Discord.Token
 
 	if err := session.Open(); err != nil {
@@ -58,6 +59,23 @@ func openDiscord() {
 		application = app
 	}
 
+	for uid, c := range discordPMQueue {
+		id := strconv.Itoa(-c.Discord.ID)
+		if st, err := session.UserChannelCreate(id); err != nil {
+			log.Printf("error creating user channel for %s: %s", id, err)
+		} else {
+			if c.Discord.ID, err = strconv.Atoi(st.ID); err != nil {
+				log.Printf("error parsing discord response for user channel: %s", err)
+			} else {
+				if config.System.Verbose {
+					log.Printf("configured user %s with channel %s", id, st.ID)
+				}
+				discordBridge[st.ID] = c
+				delete(discordPMQueue, uid)
+			}
+		}
+	}
+
 	ready <- struct{}{}
 }
 
-- 
GitLab