Skip to content

Commit

Permalink
Fix #133: process Telegram errors properly
Browse files Browse the repository at this point in the history
  • Loading branch information
ForNeVeR committed Jun 29, 2021
1 parent 118afed commit d84e502
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 14 deletions.
18 changes: 14 additions & 4 deletions Emulsion.Tests/Telegram/FunogramTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ module Emulsion.Tests.Telegram.Client
open System

open Funogram.Telegram.Types
open Funogram.Types
open Xunit

open Emulsion
open Emulsion.Telegram
open Emulsion.Telegram.Funogram

[<Literal>]
let private selfUserId = 100500L
Expand Down Expand Up @@ -140,7 +140,7 @@ let private replyingUser = createUser (Some "replyingUser") "" None
let private forwardingUser = createUser (Some "forwardingUser") "" None

module ReadMessageTests =
let readMessage = MessageConverter.read selfUserId
let readMessage = Funogram.MessageConverter.read selfUserId

[<Fact>]
let readMessageWithUnknownUser() =
Expand Down Expand Up @@ -317,7 +317,7 @@ module ReadMessageTests =

[<Fact>]
let multilineForwardShouldBeUnlimited(): unit =
let messageLinesLimit = MessageConverter.DefaultMessageLinesLimit
let messageLinesLimit = Funogram.MessageConverter.DefaultMessageLinesLimit
let multilineMessage = String.init messageLinesLimit (fun _ -> "test\n") + "test"
let forwardedMessage = createMessage (Some originalUser) (Some multilineMessage)
let message = createForwardedMessage forwardingUser forwardedMessage
Expand All @@ -331,7 +331,7 @@ module ReadMessageTests =

[<Fact>]
let longForwardShouldBeUnlimited(): unit =
let messageLengthLimit = MessageConverter.DefaultMessageLengthLimit
let messageLengthLimit = Funogram.MessageConverter.DefaultMessageLengthLimit
let longString = String.init (messageLengthLimit + 1) (fun _ -> "A")
let forwardedMessage = createMessage (Some originalUser) (Some longString)
let message = createForwardedMessage forwardingUser forwardedMessage
Expand Down Expand Up @@ -543,6 +543,16 @@ module ProcessMessageTests =
Chat = defaultChat }
Assert.Equal(None, processMessage message)

module ProcessSendResultTests =
[<Fact>]
let processResultShouldDoNothingOnOk(): unit =
Assert.Equal((), Funogram.processSendResult(Ok()))

[<Fact>]
let processResultShouldThrowOnError(): unit =
let result = Error({ ErrorCode = 502; Description = "Error" })
Assert.ThrowsAny<Exception>(fun () -> Funogram.processSendResult result) |> ignore

module FlattenMessageTests =
let private flattenMessage = Funogram.MessageConverter.flatten Funogram.MessageConverter.DefaultQuoteSettings
let private flattenMessageLineLimit limit =
Expand Down
2 changes: 1 addition & 1 deletion Emulsion/Telegram/Client.fs
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ type Client(ctx: ServiceContext, cancellationToken: CancellationToken, settings:
}

override _.Send message =
Funogram.send ctx.Logger settings botConfig message
Funogram.send settings botConfig message
14 changes: 5 additions & 9 deletions Emulsion/Telegram/Funogram.fs
Original file line number Diff line number Diff line change
Expand Up @@ -297,15 +297,11 @@ module MessageConverter =
else extractMessageContent replyTo
{ main = mainMessage; replyTo = Some replyToMessage }

let private processResultWithValue (logger: ILogger) (result: Result<'a, ApiResponseError>) =
let internal processSendResult(result: Result<'a, ApiResponseError>): unit =
match result with
| Ok v -> Some v
| Ok _ -> ()
| Error e ->
logger.Error("Telegram API call processing error: {Error}", e)
None

let private processResult logger (result: Result<'a, ApiResponseError>) =
processResultWithValue logger result |> ignore
failwith $"Telegram API Call processing error {e.ErrorCode}: {e.Description}"

let internal processMessage (context: {| SelfUserId: int64; GroupId: int64 |})
(message: FunogramMessage): TelegramMessage option =
Expand Down Expand Up @@ -334,15 +330,15 @@ let internal prepareHtmlMessage: Message -> string = function
| Authored {author = author; text = text} -> sprintf "<b>%s</b>\n%s" (Html.escape author) (Html.escape text)
| Event {text = text} -> sprintf "%s" (Html.escape text)

let send (logger: ILogger) (settings: TelegramSettings) (botConfig: BotConfig) (OutgoingMessage content): Async<unit> =
let send (settings: TelegramSettings) (botConfig: BotConfig) (OutgoingMessage content): Async<unit> =
let sendHtmlMessage groupId text =
Api.sendMessageBase groupId text (Some ParseMode.HTML) None None None None

let groupId = Int(int64 settings.GroupId)
let message = prepareHtmlMessage content
async {
let! result = api botConfig (sendHtmlMessage groupId message)
return processResult logger result
return processSendResult result
}

let run (logger: ILogger)
Expand Down

0 comments on commit d84e502

Please sign in to comment.