From 1d9d56dc87372f6b4b13c71e5c58239f3fb58a2c Mon Sep 17 00:00:00 2001 From: Vladimir V Maksimov Date: Wed, 10 Dec 2025 17:14:16 +0300 Subject: [PATCH] telegram email --- email.go | 31 +++++++++++++++++++++++ go.mod | 7 +++--- go.sum | 2 ++ telegram.go | 55 ++++++++++++++++++++++++++++++++++++++++ telegram_test.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 156 insertions(+), 4 deletions(-) create mode 100644 email.go diff --git a/email.go b/email.go new file mode 100644 index 0000000..284da6e --- /dev/null +++ b/email.go @@ -0,0 +1,31 @@ +package notify + +import ( + "errors" + "net/mail" + "net/smtp" + + "github.com/scorredoira/email" +) + +type SmtpAuth struct { + Addr string + Auth smtp.Auth +} + +func SendEmailHTML(auth SmtpAuth, message, subject string, from mail.Address, to ...mail.Address) error { + if len(to) == 0 { + return errors.New("expected least one receiver") + } + mes := email.NewMessage(subject, message) + mes.BodyContentType = "text/html;" + mes.From = from + for _, ito := range to { + mes.AddTo(ito) + } + return email.Send(auth.Addr, auth.Auth, mes) +} + +func SenndEmailMessage(auth SmtpAuth, mes *email.Message) error { + return email.Send(auth.Addr, auth.Auth, mes) +} diff --git a/go.mod b/go.mod index 818761f..5f7ca4e 100644 --- a/go.mod +++ b/go.mod @@ -4,10 +4,9 @@ go 1.25.1 require ( github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 + github.com/mattn/go-runewidth v0.0.19 + github.com/scorredoira/email v0.0.0-20191107070024-dc7b732c55da gopkg.in/yaml.v2 v2.4.0 ) -require ( - github.com/clipperhouse/uax29/v2 v2.2.0 // indirect - github.com/mattn/go-runewidth v0.0.19 // indirect -) +require github.com/clipperhouse/uax29/v2 v2.2.0 // indirect diff --git a/go.sum b/go.sum index 2da05c6..a20e9f3 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1 h1:wG8n/XJQ07TmjbITcGi github.com/go-telegram-bot-api/telegram-bot-api/v5 v5.5.1/go.mod h1:A2S0CWkNylc2phvKXWBBdD3K0iGnDBGbzRpISP2zBl8= github.com/mattn/go-runewidth v0.0.19 h1:v++JhqYnZuu5jSKrk9RbgF5v4CGUjqRfBm05byFGLdw= github.com/mattn/go-runewidth v0.0.19/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= +github.com/scorredoira/email v0.0.0-20191107070024-dc7b732c55da h1:hhmnjfzz7szp75AyXxn8tDfEA0oU4REQLmpuW6zNAOY= +github.com/scorredoira/email v0.0.0-20191107070024-dc7b732c55da/go.mod h1:Q5ljvYIBpukMH+wgB8kcPV1i9NX8TqU++8GgBKq3pt0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= diff --git a/telegram.go b/telegram.go index 816ec19..ca2cced 100644 --- a/telegram.go +++ b/telegram.go @@ -55,6 +55,10 @@ func NewTelegram(token string, disableIPV6 bool) (*Bot, error) { return bot, nil } +func (s *Bot) GetAPI() *tgbotapi.BotAPI { + return s.api +} + func (s *Bot) SendTextMessage(chatID int64, text string) (tgbotapi.Message, error) { message := tgbotapi.NewMessage(chatID, text) message.ParseMode = "Markdown" @@ -66,3 +70,54 @@ func (s *Bot) SendHTMLMessage(chatID int64, text string) (tgbotapi.Message, erro message.ParseMode = "HTML" return s.api.Send(message) } + +func (s *Bot) SendPhotoFromFile(chatID int64, filePath string, caption string) (tgbotapi.Message, error) { + photo := tgbotapi.NewPhoto(chatID, tgbotapi.FilePath(filePath)) + photo.Caption = caption + photo.ParseMode = "Markdown" // или "HTML" + return s.api.Send(photo) +} + +func (s *Bot) SendPhotoFromURL(chatID int64, fileURL string, caption string) (tgbotapi.Message, error) { + photo := tgbotapi.NewPhoto(chatID, tgbotapi.FileURL(fileURL)) + photo.Caption = caption + photo.ParseMode = "Markdown" + return s.api.Send(photo) +} + +func (s *Bot) SendPhotoFromBytes(chatID int64, data []byte, filename string, caption string) (tgbotapi.Message, error) { + file := tgbotapi.FileBytes{ + Name: filename, + Bytes: data, + } + photo := tgbotapi.NewPhoto(chatID, file) + photo.Caption = caption + photo.ParseMode = "Markdown" + return s.api.Send(photo) +} + +func (s *Bot) SendDocumentFromFile(chatID int64, filePath string, caption string) (tgbotapi.Message, error) { + doc := tgbotapi.NewDocument(chatID, tgbotapi.FilePath(filePath)) + doc.Caption = caption + doc.ParseMode = "Markdown" + return s.api.Send(doc) +} + +func (s *Bot) SendDocumentFromURL(chatID int64, fileURL string, caption string) (tgbotapi.Message, error) { + doc := tgbotapi.NewDocument(chatID, tgbotapi.FileURL(fileURL)) + doc.Caption = caption + doc.ParseMode = "Markdown" + return s.api.Send(doc) +} + +func (s *Bot) SendDocumentFromBytes(chatID int64, data []byte, filename string, caption string) (tgbotapi.Message, error) { + file := tgbotapi.FileBytes{ + Name: filename, + Bytes: data, + } + + doc := tgbotapi.NewDocument(chatID, file) + doc.Caption = caption + doc.ParseMode = "Markdown" + return s.api.Send(doc) +} diff --git a/telegram_test.go b/telegram_test.go index d0911dc..120a147 100644 --- a/telegram_test.go +++ b/telegram_test.go @@ -1,10 +1,12 @@ package notify_test import ( + "encoding/json" "os" "testing" "git.gm6.ru/icewind/notify" + tgbotapi "github.com/go-telegram-bot-api/telegram-bot-api/v5" "gopkg.in/yaml.v2" ) @@ -13,6 +15,14 @@ type ConfigTelegram struct { Token string `yaml:"token"` } +func loadText(t *testing.T) []byte { + cData, err := os.ReadFile("test_data/text.txt") + if err != nil { + t.Fatal(err) + } + return cData +} + func loadConfig(t *testing.T) (conf ConfigTelegram) { cData, err := os.ReadFile("test_data/telegram.yaml") if err != nil { @@ -63,3 +73,58 @@ func TestSendTable(t *testing.T) { } t.Log(m) } + +func TestTelegramUpdate(t *testing.T) { + conf := loadConfig(t) + bot, err := notify.NewTelegram(conf.Token, true) + + if err != nil { + t.Fatal(err) + } + + u := tgbotapi.NewUpdate(0) + + u.AllowedUpdates = []string{ + "message", + "chat_member", + "my_chat_member", + } + + u.Timeout = 30 + + for { + updates, err := bot.GetAPI().GetUpdates(u) + if err != nil { + t.Fatal(err) + } + if len(updates) > 0 { + data, _ := json.Marshal(updates) + t.Log(string(data)) + } + } +} + +func TestTelegramDocument(t *testing.T) { + conf := loadConfig(t) + bot, err := notify.NewTelegram(conf.Token, true) + + text := loadText(t) + + caption := `Голотип номинативного подвида был собран на склонах горы Натсфорд в горах Оуэн-Стэнли. Он был описан английским орнитологом Чарлзом Де Висом в 1890 году. В том же году Адольф Питер Гудвин (Adolph Peter Goodwin) описал синонимичный вид Xanthomelus macgregori, полученный на том же хребте, но на горе Масгрейв[14]. Птицы этого подвида обитают в юго-восточной части Новой Гвинеи от водораздела Экути (Ekuti Divide) южнее города Вау до горы Натсфорд и Порт-Морсби[14][11]. Возможно, ареал простирается ещё южнее[14], юго-восточные границы ареала неизвестны[11]. Международный союз охраны природы (МСОП) приводит площадь ареала (англ. Estimated extent of occurrence) этого подвида 10 800 км²[15]. +Подвид C. m. sanguineus был описан австралийским орнитологом Томом Айрдейлом в 1948 году как самостоятельный вид на основе экземпляров, добытых капитаном Нептьюном Бладом (Neptune B. Blood) в 1944—1945 годах в окрестностях города Маунт-Хаген в провинции Уэстерн-Хайлендс в центральной части Папуа — Новой Гвинеи. Птицы этого подвида распространены на нагорье Кайенде, горе Гилуве, вулкане Хаген и далее на восток до гор Бисмарка и хребта Кубор[себ.] в восточной части острова. К этому же подвиду относят популяцию в центральной части острова, обитающую на высокогорьях к северу от озера Хаббема (Lake Habbema)[14]. МСОП приводит площадь ареала этого подвида 87 600 км²[16]. У самцов C. m. sanguineus длина крыла составляет 110—118 мм, у самок — 101—115 мм, длина хвоста — 86-96 мм и 80—97 мм, клюва — 26—31 мм и 23—28 мм, цевки — 38—44 мм и 38—43 мм, соответственно[14]. +Синонимичным ему является подвид C. m. kuboriensis, который был описан американскими орнитологами Эрнстом Майром и Эрнестом Гиллиардом[англ.] в 1954 году на основе экземпляра самца, пойманного на хребте Кубор на высоте 2760 метров в мае 1952 года. Причиной выделения в отдельный подвид был назван более насыщенный красноватый верх и менее красный налёт снизу, а также более короткий хвост и более длинные крылья[14]. Экземпляр птицы, полученный британским орнитологом Реджиналдом Симсом (Reginald William Sims) в тех же горах в 1953 году, не отличался раскраской оперения от C. m. sanguineus[17]. Современные учёные синонимизируют C. m. kuboriensis и C. m. sanguineus в силу изменчивости и незначительности указанных признаков[14]. +Основное отличие подвидов заключается в окраске самцов в верхней части тела, оттенки окраски остального оперения менее показательны. Чёткое разделение подвидов затруднено из-за промежуточного положения птиц, обитающих на хребте Кратке[англ.] в восточной части острова[14]. Не совсем ясно, к какому подвиду отнести популяцию на западе ареала (то есть на границе двух стран). Американские учёные Брюс Билер[англ.] и Тейн Пратт[англ.] в 2016 году предлагали выделить её в отдельный таксон, для которого, однако, не смогли определить географические границы[14]. ` + + if err != nil { + t.Fatal(err, bot) + } + _, err = bot.SendDocumentFromBytes( + conf.GroupID, + text, + "1.txt", + caption, + ) + if err != nil { + t.Fatal(err) + } +}