@@ -28,21 +28,43 @@ export class TelegramPresenter implements IPresenter {
28
28
. subscribe ( async ( info ) => {
29
29
if ( info . length < 1 || info [ 0 ] === undefined ) return ;
30
30
31
- const message = info . map ( ( i ) => i . payload ) . join ( `\n${ "-" . repeat ( 20 ) } \n\n` ) ;
32
- try {
33
- await this . _bot . api . sendMessage ( info [ 0 ] ! . targetId . toString ( ) , message , {
34
- parse_mode : "HTML" ,
35
- link_preview_options : {
36
- is_disabled : true
37
- }
38
- } ) ;
39
- } catch ( err : unknown ) {
40
- Sentry . captureException ( err ) ;
41
- if ( err instanceof Error ) {
42
- this . _logger . error ( err . message ) ;
31
+ // Telegram limits each message box to have 4096 UTF-8 characters
32
+ const messages : string [ ] = [ ] ;
33
+ let currentMessage = "" ;
34
+ // This is actually the safe length of `\n${"-".repeat(20)}\n\n`
35
+ const MAGIC_DELIMITER_NUMBER = 26 ;
36
+ for ( const item of info ) {
37
+ if ( currentMessage === "" ) {
38
+ currentMessage = item . payload ;
39
+ continue ;
40
+ }
41
+
42
+ if ( currentMessage . length + item . payload . length + MAGIC_DELIMITER_NUMBER >= 4096 ) {
43
+ messages . push ( currentMessage ) ;
44
+ currentMessage = item . payload ;
45
+ continue ;
43
46
}
44
47
45
- this . _logger . error ( "Unknown error: " + err ) ;
48
+ currentMessage += `\n${ "-" . repeat ( 20 ) } \n\n` ;
49
+ currentMessage += item . payload ;
50
+ }
51
+
52
+ for ( const message of messages ) {
53
+ try {
54
+ await this . _bot . api . sendMessage ( info [ 0 ] ! . targetId . toString ( ) , message , {
55
+ parse_mode : "HTML" ,
56
+ link_preview_options : {
57
+ is_disabled : true
58
+ }
59
+ } ) ;
60
+ } catch ( err : unknown ) {
61
+ Sentry . captureException ( err ) ;
62
+ if ( err instanceof Error ) {
63
+ this . _logger . error ( err . message ) ;
64
+ }
65
+
66
+ this . _logger . error ( "Unknown error: " + err ) ;
67
+ }
46
68
}
47
69
} ) ;
48
70
}
0 commit comments