From 6dba23e6898069c18e7bddb7cf0712a1494bf9a2 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Tue, 28 Sep 2021 23:14:30 +0700 Subject: [PATCH] (#145) Core: move Telegram-related logic to the Funogram module --- Emulsion.Tests/Actors/Core.fs | 6 +++--- Emulsion.Tests/Telegram/FunogramTests.fs | 19 ++++++++++--------- Emulsion/Actors/Core.fs | 5 +---- Emulsion/Message.fs | 7 +------ Emulsion/Telegram/Funogram.fs | 17 +++++++++++++---- 5 files changed, 28 insertions(+), 26 deletions(-) diff --git a/Emulsion.Tests/Actors/Core.fs b/Emulsion.Tests/Actors/Core.fs index d376fca9..47127457 100644 --- a/Emulsion.Tests/Actors/Core.fs +++ b/Emulsion.Tests/Actors/Core.fs @@ -30,12 +30,12 @@ type CoreTests(testOutput: ITestOutputHelper) as this = [] member this.``Core actor should spawn successfully``() = - let core = spawnCore() + let _core = spawnCore() this.ExpectNoMsg() [] member this.``Core creates one XMPP actor and one Telegram actor``() = - let core = spawnCore() + let _core = spawnCore() this.ExpectNoMsg() Assert.Equal(2, actorsCreated) @@ -48,5 +48,5 @@ type CoreTests(testOutput: ITestOutputHelper) as this = [] member this.``Core sends Telegram message to XMPP actor``() = let core = spawnCore() - core.Tell(TelegramMessage { main = Authored { author = "Telegram user"; text = "x" }; replyTo = None }) + core.Tell(TelegramMessage(Authored { author = "Telegram user"; text = "x" })) xmppActor.ExpectMsg(OutgoingMessage (Authored { author = "Telegram user"; text = "x" })) diff --git a/Emulsion.Tests/Telegram/FunogramTests.fs b/Emulsion.Tests/Telegram/FunogramTests.fs index 5a8f823f..cd53f3f1 100644 --- a/Emulsion.Tests/Telegram/FunogramTests.fs +++ b/Emulsion.Tests/Telegram/FunogramTests.fs @@ -8,6 +8,7 @@ open Xunit open Emulsion open Emulsion.Telegram +open Emulsion.Telegram.Funogram [] let private selfUserId = 100500L @@ -140,7 +141,7 @@ let private replyingUser = createUser (Some "replyingUser") "" None let private forwardingUser = createUser (Some "forwardingUser") "" None module ReadMessageTests = - let readMessage = Funogram.MessageConverter.read selfUserId + let private readMessage = MessageConverter.read selfUserId [] let readMessageWithUnknownUser() = @@ -317,7 +318,7 @@ module ReadMessageTests = [] let multilineForwardShouldBeUnlimited(): unit = - let messageLinesLimit = Funogram.MessageConverter.DefaultMessageLinesLimit + let messageLinesLimit = MessageConverter.DefaultMessageLinesLimit let multilineMessage = String.init messageLinesLimit (fun _ -> "test\n") + "test" let forwardedMessage = createMessage (Some originalUser) (Some multilineMessage) let message = createForwardedMessage forwardingUser forwardedMessage @@ -331,7 +332,7 @@ module ReadMessageTests = [] let longForwardShouldBeUnlimited(): unit = - let messageLengthLimit = Funogram.MessageConverter.DefaultMessageLengthLimit + let messageLengthLimit = MessageConverter.DefaultMessageLengthLimit let longString = String.init (messageLengthLimit + 1) (fun _ -> "A") let forwardedMessage = createMessage (Some originalUser) (Some longString) let message = createForwardedMessage forwardingUser forwardedMessage @@ -546,20 +547,20 @@ module ProcessMessageTests = module ProcessSendResultTests = [] let processResultShouldDoNothingOnOk(): unit = - Assert.Equal((), Funogram.processSendResult(Ok())) + Assert.Equal((), processSendResult(Ok())) [] let processResultShouldThrowOnError(): unit = let result = Error({ ErrorCode = 502; Description = "Error" }) - Assert.ThrowsAny(fun () -> Funogram.processSendResult result) |> ignore + Assert.ThrowsAny(fun () -> processSendResult result) |> ignore module FlattenMessageTests = - let private flattenMessage = Funogram.MessageConverter.flatten Funogram.MessageConverter.DefaultQuoteSettings + let private flattenMessage = MessageConverter.flatten MessageConverter.DefaultQuoteSettings let private flattenMessageLineLimit limit = - let defaultSettings = Funogram.MessageConverter.DefaultQuoteSettings + let defaultSettings = MessageConverter.DefaultQuoteSettings let limits = { defaultSettings.limits with messageLengthLimit = Some limit } let quoteSettings = { defaultSettings with limits = limits } - Funogram.MessageConverter.flatten quoteSettings + MessageConverter.flatten quoteSettings [] let flattenReplyMessage() = @@ -612,5 +613,5 @@ module PrepareMessageTests = let prepareMessageEscapesHtml() = Assert.Equal( "user <3\nmy_message <&>", - Funogram.prepareHtmlMessage (Authored { author = "user <3"; text = "my_message <&>" }) + prepareHtmlMessage (Authored { author = "user <3"; text = "my_message <&>" }) ) diff --git a/Emulsion/Actors/Core.fs b/Emulsion/Actors/Core.fs index 0a1ee182..b430acb5 100644 --- a/Emulsion/Actors/Core.fs +++ b/Emulsion/Actors/Core.fs @@ -4,7 +4,6 @@ open Akka.Actor open Serilog open Emulsion -open Emulsion.Telegram type CoreActor(logger: ILogger, factories: ActorFactories) as this = inherit ReceiveActor() @@ -23,9 +22,7 @@ type CoreActor(logger: ILogger, factories: ActorFactories) as this = member this.OnMessage(message : IncomingMessage) : unit = match message with - | TelegramMessage msg -> - let message = Funogram.MessageConverter.flatten Funogram.MessageConverter.DefaultQuoteSettings msg - xmpp.Tell(OutgoingMessage message, this.Self) + | TelegramMessage msg -> xmpp.Tell(OutgoingMessage msg, this.Self) | XmppMessage msg -> telegram.Tell(OutgoingMessage msg, this.Self) let spawn (logger: ILogger) (factories: ActorFactories) (system: IActorRefFactory) (name: string): IActorRef = diff --git a/Emulsion/Message.fs b/Emulsion/Message.fs index eef44786..5ae487fd 100644 --- a/Emulsion/Message.fs +++ b/Emulsion/Message.fs @@ -23,11 +23,6 @@ module Message = type OutgoingMessage = | OutgoingMessage of Message -type TelegramMessage = { - main: Message - replyTo: Message option -} - type IncomingMessage = | XmppMessage of Message -| TelegramMessage of TelegramMessage +| TelegramMessage of Message diff --git a/Emulsion/Telegram/Funogram.fs b/Emulsion/Telegram/Funogram.fs index 5dc92b3c..eb20f21c 100644 --- a/Emulsion/Telegram/Funogram.fs +++ b/Emulsion/Telegram/Funogram.fs @@ -13,6 +13,11 @@ open Emulsion open Emulsion.Settings type private FunogramMessage = Types.Message +[] +type internal ThreadMessage = { + main: Message + replyTo: Message option +} module MessageConverter = type MessageLimits = { @@ -232,7 +237,7 @@ module MessageConverter = let private addOriginalMessage quoteSettings originalMessage replyMessageBody = sprintf "%s\n\n%s" (getQuotedMessage quoteSettings originalMessage) replyMessageBody - let internal flatten (quotedLimits: QuoteSettings) (message: TelegramMessage): Message = + let internal flatten (quotedLimits: QuoteSettings) (message: ThreadMessage): Message = match message.main with | Authored msg -> let author = msg.author @@ -284,7 +289,7 @@ module MessageConverter = let messageText = text.Substring messageTextOffset Authored { author = authorName; text = messageText } - let internal read (selfUserId: int64) (message: FunogramMessage): TelegramMessage = + let internal read (selfUserId: int64) (message: FunogramMessage): ThreadMessage = let mainMessage = extractMessageContent message match message.ReplyToMessage with | None -> { main = mainMessage; replyTo = None } @@ -302,9 +307,13 @@ let internal processSendResult(result: Result<'a, ApiResponseError>): unit = failwith $"Telegram API Call processing error {e.ErrorCode}: {e.Description}" let internal processMessage (context: {| SelfUserId: int64; GroupId: int64 |}) - (message: FunogramMessage): TelegramMessage option = + (message: FunogramMessage): Message option = if context.GroupId = message.Chat.Id - then Some <| MessageConverter.read context.SelfUserId message + then + message + |> MessageConverter.read context.SelfUserId + |> MessageConverter.flatten MessageConverter.DefaultQuoteSettings + |> Some else None let private updateArrived groupId (logger: ILogger) onMessage (ctx: Bot.UpdateContext) =