diff --git a/routers/web/repo/setting/webhook.go b/routers/web/repo/setting/webhook.go index c52f5fc4b14..4d3120618f4 100644 --- a/routers/web/repo/setting/webhook.go +++ b/routers/web/repo/setting/webhook.go @@ -429,7 +429,7 @@ func telegramHookParams(ctx *context.Context) webhookParams { return webhookParams{ Type: webhook_module.TELEGRAM, - URL: fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage?chat_id=%s&message_thread_id=%s", url.PathEscape(form.BotToken), url.QueryEscape(form.ChatID), url.QueryEscape(form.ThreadID)), + URL: fmt.Sprintf("https://api.telegram.org/bot%s/sendRichMessage?chat_id=%s&message_thread_id=%s", url.PathEscape(form.BotToken), url.QueryEscape(form.ChatID), url.QueryEscape(form.ThreadID)), ContentType: webhook.ContentTypeJSON, WebhookForm: form.WebhookForm, Meta: &webhook_service.TelegramMeta{ diff --git a/services/webhook/telegram.go b/services/webhook/telegram.go index 99a0b417b8a..cae9a883c79 100644 --- a/services/webhook/telegram.go +++ b/services/webhook/telegram.go @@ -8,6 +8,7 @@ import ( "fmt" "html" "net/http" + "net/url" "strings" webhook_model "gitea.dev/models/webhook" @@ -23,9 +24,12 @@ import ( type ( // TelegramPayload represents TelegramPayload struct { - Message string `json:"text"` - ParseMode string `json:"parse_mode"` - DisableWebPreview bool `json:"disable_web_page_preview"` + RichMessage InputRichMessage `json:"rich_message"` + } + + // InputRichMessage represents input rich message + InputRichMessage struct { + HTML string `json:"html"` } // TelegramMeta contains the telegram metadata @@ -195,13 +199,21 @@ func (telegramConvertor) WorkflowJob(p *api.WorkflowJobPayload) (TelegramPayload func createTelegramPayloadHTML(msgHTML string) TelegramPayload { // https://core.telegram.org/bots/api#formatting-options return TelegramPayload{ - Message: strings.TrimSpace(string(markup.Sanitize(msgHTML))), - ParseMode: "HTML", - DisableWebPreview: true, + RichMessage: InputRichMessage{ + HTML: strings.TrimSpace(string(markup.Sanitize(msgHTML))), + }, } } func newTelegramRequest(_ context.Context, w *webhook_model.Webhook, t *webhook_model.HookTask) (*http.Request, []byte, error) { + u, err := url.Parse(w.URL) + if err != nil { + return nil, nil, err + } + if urlPrefix, ok := strings.CutSuffix(u.Path, "/sendMessage"); ok { + u.Path = urlPrefix + "/sendRichMessage" + w.URL = u.String() + } var pc payloadConvertor[TelegramPayload] = telegramConvertor{} return newJSONRequest(pc, w, t, true) } diff --git a/services/webhook/telegram_test.go b/services/webhook/telegram_test.go index 7c8209577e9..3e615af8140 100644 --- a/services/webhook/telegram_test.go +++ b/services/webhook/telegram_test.go @@ -21,9 +21,9 @@ func TestTelegramPayload(t *testing.T) { t.Run("Correct webhook params", func(t *testing.T) { p := createTelegramPayloadHTML(`testMsg `) assert.Equal(t, TelegramPayload{ - Message: `testMsg`, - ParseMode: "HTML", - DisableWebPreview: true, + RichMessage: InputRichMessage{ + HTML: `testMsg`, + }, }, p) }) @@ -33,7 +33,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Create(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] branch test created`, pl.Message) + assert.Equal(t, `[test/repo] branch test created`, pl.RichMessage.HTML) }) t.Run("Delete", func(t *testing.T) { @@ -42,7 +42,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Delete(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] branch test deleted`, pl.Message) + assert.Equal(t, `[test/repo] branch test deleted`, pl.RichMessage.HTML) }) t.Run("Fork", func(t *testing.T) { @@ -51,7 +51,7 @@ func TestTelegramPayload(t *testing.T) { pl, err := tc.Fork(p) require.NoError(t, err) - assert.Equal(t, `test/repo2 is forked to test/repo`, pl.Message) + assert.Equal(t, `test/repo2 is forked to test/repo`, pl.RichMessage.HTML) }) t.Run("Push", func(t *testing.T) { @@ -62,7 +62,7 @@ func TestTelegramPayload(t *testing.T) { assert.Equal(t, `[test/repo:test] 2 new commits [2020558] commit message - user1 -[2020558] commit message - user1`, pl.Message) +[2020558] commit message - user1`, pl.RichMessage.HTML) }) t.Run("Issue", func(t *testing.T) { @@ -74,13 +74,13 @@ func TestTelegramPayload(t *testing.T) { assert.Equal(t, `[test/repo] Issue opened: #2 crash by user1 -issue body`, pl.Message) +issue body`, pl.RichMessage.HTML) p.Action = api.HookIssueClosed pl, err = tc.Issue(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.Message) + assert.Equal(t, `[test/repo] Issue closed: #2 crash by user1`, pl.RichMessage.HTML) }) t.Run("IssueComment", func(t *testing.T) { @@ -90,7 +90,7 @@ issue body`, pl.Message) require.NoError(t, err) assert.Equal(t, `[test/repo] New comment on issue #2 crash by user1 -more info needed`, pl.Message) +more info needed`, pl.RichMessage.HTML) }) t.Run("PullRequest", func(t *testing.T) { @@ -100,7 +100,7 @@ more info needed`, pl.Message) require.NoError(t, err) assert.Equal(t, `[test/repo] Pull request opened: #12 Fix bug by user1 -fixes bug #2`, pl.Message) +fixes bug #2`, pl.RichMessage.HTML) }) t.Run("PullRequestComment", func(t *testing.T) { @@ -110,7 +110,7 @@ fixes bug #2`, pl.Message) require.NoError(t, err) assert.Equal(t, `[test/repo] New comment on pull request #12 Fix bug by user1 -changes requested`, pl.Message) +changes requested`, pl.RichMessage.HTML) }) t.Run("Review", func(t *testing.T) { @@ -121,7 +121,7 @@ changes requested`, pl.Message) require.NoError(t, err) assert.Equal(t, `[test/repo] Pull request review approved: #12 Fix bug -good job`, pl.Message) +good job`, pl.RichMessage.HTML) }) t.Run("Repository", func(t *testing.T) { @@ -130,7 +130,7 @@ good job`, pl.Message) pl, err := tc.Repository(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Repository created`, pl.Message) + assert.Equal(t, `[test/repo] Repository created`, pl.RichMessage.HTML) }) t.Run("Package", func(t *testing.T) { @@ -139,7 +139,7 @@ good job`, pl.Message) pl, err := tc.Package(p) require.NoError(t, err) - assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.Message) + assert.Equal(t, `Package created: GiteaContainer:latest by user1`, pl.RichMessage.HTML) }) t.Run("Wiki", func(t *testing.T) { @@ -149,19 +149,19 @@ good job`, pl.Message) pl, err := tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.Message) + assert.Equal(t, `[test/repo] New wiki page 'index' (Wiki change comment) by user1`, pl.RichMessage.HTML) p.Action = api.HookWikiEdited pl, err = tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.Message) + assert.Equal(t, `[test/repo] Wiki page 'index' edited (Wiki change comment) by user1`, pl.RichMessage.HTML) p.Action = api.HookWikiDeleted pl, err = tc.Wiki(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.Message) + assert.Equal(t, `[test/repo] Wiki page 'index' deleted by user1`, pl.RichMessage.HTML) }) t.Run("Release", func(t *testing.T) { @@ -170,7 +170,7 @@ good job`, pl.Message) pl, err := tc.Release(p) require.NoError(t, err) - assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.Message) + assert.Equal(t, `[test/repo] Release created: v1.0 by user1`, pl.RichMessage.HTML) }) } @@ -183,7 +183,7 @@ func TestTelegramJSONPayload(t *testing.T) { RepoID: 3, IsActive: true, Type: webhook_module.TELEGRAM, - URL: "https://telegram.example.com/", + URL: "https://telegram.example.com/sendMessage", Meta: ``, HTTPMethod: "POST", } @@ -200,7 +200,7 @@ func TestTelegramJSONPayload(t *testing.T) { require.NoError(t, err) assert.Equal(t, "POST", req.Method) - assert.Equal(t, "https://telegram.example.com/", req.URL.String()) + assert.Equal(t, "https://telegram.example.com/sendRichMessage", req.URL.String()) assert.Equal(t, "sha256=", req.Header.Get("X-Hub-Signature-256")) assert.Equal(t, "application/json", req.Header.Get("Content-Type")) var body TelegramPayload @@ -208,5 +208,5 @@ func TestTelegramJSONPayload(t *testing.T) { assert.NoError(t, err) assert.Equal(t, `[test/repo:test] 2 new commits [2020558] commit message - user1 -[2020558] commit message - user1`, body.Message) +[2020558] commit message - user1`, body.RichMessage.HTML) }