diff --git a/telegram.go b/telegram.go
index 3a94de2afb898c1ce973895aae3ef05bc6b9246a..d2eb7c0cdf73b6ca6087532072e839e7d19a4eb3 100644
--- a/telegram.go
+++ b/telegram.go
@@ -100,7 +100,7 @@ func respondTelegram(update tgbotapi.Update) {
 					}
 					return
 				}
-				header, _ := makeHeader(update.EditedMessage, true)
+				header, _ := telegramMakeHeader(update.EditedMessage, true)
 				content = header + content
 			}
 			if _, err := session.ChannelMessageEdit(reference.ChannelID, reference.MessageID, escape(content)); err != nil {
@@ -163,134 +163,33 @@ func respondTelegram(update tgbotapi.Update) {
 		}
 	}
 
-	header, has := makeHeader(update.Message, false)
+	header, has := telegramMakeHeader(update.Message, false)
 
 	if update.Message.Photo != nil {
-		var file *discordgo.File
 
 		p := *update.Message.Photo
-		info := p[len(p)-1]
-
-		var url string
-		if u, err := botAPI.GetFileDirectURL(info.FileID); err != nil {
-			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting URL")
-			msg.ReplyToMessageID = update.Message.MessageID
-			log.Printf("error getting URL of %s: %s", info.FileID, err)
-			_, _ = botAPI.Send(msg)
-			return
-		} else {
-			url = u
+		if telegramHandleFile(dc, update, p[len(p)-1].FileID, update.Message.Caption,
+			header, has, reference,
+			&dMessageID, &dChannelID, &dGuildID) {
+			log.Printf("T%vM%v -> D%vM%s @%s (%v) [photo]: %s; caption: %s",
+				tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, p[len(p)-1].FileID, update.Message.Caption)
 		}
 
-		if resp, err := http.Get(url); err != nil {
-			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting file")
-			msg.ReplyToMessageID = update.Message.MessageID
-			log.Printf("error getting file %s: %s", info.FileID, err)
-			_, _ = botAPI.Send(msg)
-			return
-		} else {
-			file = &discordgo.File{
-				Name:        "image.jpg",
-				ContentType: "image/jpeg",
-				Reader:      resp.Body,
-			}
-			defer func() {
-				if err = resp.Body.Close(); err != nil {
-					log.Printf("error closing request body: %s", err)
-				}
-			}()
-		}
-
-		if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{
-			Content:   escape(header + update.Message.Caption),
-			File:      file,
-			Reference: reference,
-		}); err != nil {
-			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message")
-			msg.ReplyToMessageID = update.Message.MessageID
-			log.Printf("error relaying message %v: %s", update.Message.MessageID, err)
-			_, _ = botAPI.Send(msg)
-			return
-		} else {
-			dMessageID = message.ID
-			dChannelID = message.ChannelID
-			dGuildID = message.GuildID
-		}
-
-		messageReference[update.Message.MessageID] = &discordgo.MessageReference{
-			MessageID: dMessageID,
-			ChannelID: dChannelID,
-			GuildID:   dGuildID,
-		}
-		hasHeader[update.Message.MessageID] = has
-
-		log.Printf("T%vM%v -> D%vM%s @%s (%v) [photo]: %s; caption: %s",
-			tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, info.FileID, update.Message.Caption)
 		return
 	}
 
 	if update.Message.Sticker != nil {
-		var url string
-		if u, err := botAPI.GetFileDirectURL(update.Message.Sticker.FileID); err != nil {
-			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting URL")
-			msg.ReplyToMessageID = update.Message.MessageID
-			log.Printf("error getting URL of %s: %s", update.Message.Sticker.FileID, err)
-			_, _ = botAPI.Send(msg)
-			return
-		} else {
-			url = u
-		}
-
-		var file *discordgo.File
-		if resp, err := http.Get(url); err != nil {
-			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting file")
-			msg.ReplyToMessageID = update.Message.MessageID
-			log.Printf("error getting file %s: %s", update.Message.Sticker.FileID, err)
-			_, _ = botAPI.Send(msg)
-			return
-		} else {
-			file = &discordgo.File{
-				Name:        "sticker.webp",
-				ContentType: "image/webp",
-				Reader:      resp.Body,
-			}
-			defer func() {
-				if err = resp.Body.Close(); err != nil {
-					log.Printf("error closing request body: %s", err)
-				}
-			}()
-		}
-
 		content := header
 		if config.Telegram.StickerEmoji {
 			content += update.Message.Sticker.Emoji
 		}
 
-		if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{
-			Content:   escape(content),
-			File:      file,
-			Reference: reference,
-		}); err != nil {
-			msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message")
-			msg.ReplyToMessageID = update.Message.MessageID
-			log.Printf("error relaying message %v: %s", update.Message.MessageID, err)
-			_, _ = botAPI.Send(msg)
-			return
-		} else {
-			dMessageID = message.ID
-			dChannelID = message.ChannelID
-			dGuildID = message.GuildID
-		}
-
-		messageReference[update.Message.MessageID] = &discordgo.MessageReference{
-			MessageID: dMessageID,
-			ChannelID: dChannelID,
-			GuildID:   dGuildID,
+		if telegramHandleFile(dc, update, update.Message.Sticker.FileID, content,
+			header, has, reference,
+			&dMessageID, &dChannelID, &dGuildID) {
+			log.Printf("T%vM%v -> D%vM%s @%s (%v) [sticker]: %s",
+				tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, update.Message.Sticker.FileID)
 		}
-		hasHeader[update.Message.MessageID] = has
-
-		log.Printf("T%vM%v -> D%vM%s @%s (%v) [sticker]: %s",
-			tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, update.Message.Sticker.FileID)
 		return
 	}
 
@@ -323,7 +222,7 @@ func respondTelegram(update tgbotapi.Update) {
 		tc.ID, update.Message.MessageID, dc.ID, dMessageID, username, id, update.Message.Text)
 }
 
-func makeHeader(message *tgbotapi.Message, force bool) (string, bool) {
+func telegramMakeHeader(message *tgbotapi.Message, force bool) (string, bool) {
 	if !config.System.DisplaceHeader || force || !setPreviousCaller(message.Chat.ID, message.From.ID) {
 		// TODO: check the discord side for header displace
 		space := ""
@@ -348,6 +247,67 @@ func escape(str string) string {
 		"@here", "@\u200bhere")
 }
 
+func telegramHandleFile(dc bridgePlatformConf, update tgbotapi.Update, fileID string, content string,
+	header string, has bool, reference *discordgo.MessageReference,
+	dMessageID, dChannelID, dGuildID *string) bool {
+
+	var file *discordgo.File
+	var url string
+	if u, err := botAPI.GetFileDirectURL(fileID); err != nil {
+		msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting URL")
+		msg.ReplyToMessageID = update.Message.MessageID
+		log.Printf("error getting URL of %s: %s", fileID, err)
+		_, _ = botAPI.Send(msg)
+		return false
+	} else {
+		url = u
+	}
+
+	if resp, err := http.Get(url); err != nil {
+		msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error getting file")
+		msg.ReplyToMessageID = update.Message.MessageID
+		log.Printf("error getting file %s: %s", fileID, err)
+		_, _ = botAPI.Send(msg)
+		return false
+	} else {
+		file = &discordgo.File{
+			Name:        "image.jpg",
+			ContentType: "image/jpeg",
+			Reader:      resp.Body,
+		}
+		defer func() {
+			if err = resp.Body.Close(); err != nil {
+				log.Printf("error closing request body: %s", err)
+			}
+		}()
+	}
+
+	if message, err := session.ChannelMessageSendComplex(strconv.Itoa(dc.ID), &discordgo.MessageSend{
+		Content:   escape(header + content),
+		File:      file,
+		Reference: reference,
+	}); err != nil {
+		msg := tgbotapi.NewMessage(update.Message.Chat.ID, "error relaying message")
+		msg.ReplyToMessageID = update.Message.MessageID
+		log.Printf("error relaying message %v: %s", update.Message.MessageID, err)
+		_, _ = botAPI.Send(msg)
+		return false
+	} else {
+		*dMessageID = message.ID
+		*dChannelID = message.ChannelID
+		*dGuildID = message.GuildID
+	}
+
+	messageReference[update.Message.MessageID] = &discordgo.MessageReference{
+		MessageID: *dMessageID,
+		ChannelID: *dChannelID,
+		GuildID:   *dGuildID,
+	}
+	hasHeader[update.Message.MessageID] = has
+
+	return true
+}
+
 func telegramCommand(update tgbotapi.Update) {
 	message := tgbotapi.NewMessage(update.Message.Chat.ID, "")
 	switch update.Message.Command() {