]> git.giacomolli.uk - onechat/blobdiff - telegram.go
Move shared test helpers into helper files
[onechat] / telegram.go
index 4c16211c85dd4311d499593598b39a7649186c05..13c200c8481a1c47c6cb1497a7e9f84a4a869a62 100644 (file)
@@ -185,7 +185,7 @@ func (b *TelegramBot) Notify(event Event) {
 // Run polls for the messages of the owner and sends the queued events to the
 // chat until ctx ends. It returns an error only when a message or the offset
 // cannot be written, because then the bot would lose or repeat messages.
 // Run polls for the messages of the owner and sends the queued events to the
 // chat until ctx ends. It returns an error only when a message or the offset
 // cannot be written, because then the bot would lose or repeat messages.
-func (b *TelegramBot) Run(ctx context.Context, l *loop) error {
+func (b *TelegramBot) Run(ctx context.Context, l *TurnLoop) error {
        ctx, cancel := context.WithCancel(ctx)
        defer cancel()
 
        ctx, cancel := context.WithCancel(ctx)
        defer cancel()
 
@@ -247,7 +247,7 @@ func (b *TelegramBot) send(ctx context.Context) {
 // poll gets the updates from the stored offset on and handles each one, until
 // ctx ends. Each update is handled to its end also when ctx ends during it, so
 // a stop does not repeat its message.
 // poll gets the updates from the stored offset on and handles each one, until
 // ctx ends. Each update is handled to its end also when ctx ends during it, so
 // a stop does not repeat its message.
-func (b *TelegramBot) poll(ctx context.Context, l *loop) error {
+func (b *TelegramBot) poll(ctx context.Context, l *TurnLoop) error {
        offset, err := telegramLoadOffset(b.offsetPath)
        if err != nil {
                return err
        offset, err := telegramLoadOffset(b.offsetPath)
        if err != nil {
                return err
@@ -311,8 +311,9 @@ func (b *TelegramBot) typing(ctx context.Context) {
 }
 
 // post sends event to the chat. A reply goes as rich messages of its Markdown,
 }
 
 // post sends event to the chat. A reply goes as rich messages of its Markdown,
-// split with telegramSplitRich. Every other event goes as plain text, split
-// with telegramSplitMessage.
+// with each < outside code escaped by telegramEscapeTags and then split with
+// telegramSplitRich, so that the length limit counts the escaped text. Every
+// other event goes as plain text, split with telegramSplitMessage.
 func (b *TelegramBot) post(ctx context.Context, event Event) {
        if event.Kind != "reply" {
                for _, text := range telegramSplitMessage(telegramText(event), telegramMessageUnits) {
 func (b *TelegramBot) post(ctx context.Context, event Event) {
        if event.Kind != "reply" {
                for _, text := range telegramSplitMessage(telegramText(event), telegramMessageUnits) {
@@ -324,7 +325,7 @@ func (b *TelegramBot) post(ctx context.Context, event Event) {
                return
        }
 
                return
        }
 
-       for _, markdown := range telegramSplitRich(event.Text, telegramRichBytes) {
+       for _, markdown := range telegramSplitRich(telegramEscapeTags(event.Text), telegramRichBytes) {
                b.deliverRich(ctx, markdown)
        }
 }
                b.deliverRich(ctx, markdown)
        }
 }
@@ -351,7 +352,7 @@ func (b *TelegramBot) pause(ctx context.Context, err error, wait, asked time.Dur
 // /stop interrupts the turn. Any other message of the owner gets the answer
 // that only text is supported. Every other update is ignored, and its content
 // is not logged.
 // /stop interrupts the turn. Any other message of the owner gets the answer
 // that only text is supported. Every other update is ignored, and its content
 // is not logged.
-func (b *TelegramBot) handle(ctx context.Context, l *loop, update TelegramUpdate) error {
+func (b *TelegramBot) handle(ctx context.Context, l *TurnLoop, update TelegramUpdate) error {
        message := update.Message
        if message == nil || message.Chat.Type != "private" || message.Chat.ID != b.owner || message.From == nil || message.From.ID != b.owner {
                b.logger.Print("update ignored: not a message of the owner in the private chat")
        message := update.Message
        if message == nil || message.Chat.Type != "private" || message.Chat.ID != b.owner || message.From == nil || message.From.ID != b.owner {
                b.logger.Print("update ignored: not a message of the owner in the private chat")