@@ -29,9 +29,7 @@ public void StartSend(WebhookMessageBuilder builder)
29
29
logger . Warn ( "URL設定が正しくありません" ) ;
30
30
return ;
31
31
}
32
- var message = builder . ContentBuilder . ToString ( ) ;
33
- var content = new WebhookRequest ( message , builder . UserName , builder . AvatarUrl ) ;
34
- var sendTask = SendAsync ( content , url ) ;
32
+ var sendTask = SendAsync ( builder , url ) ;
35
33
sendTask . ContinueWith ( task =>
36
34
{
37
35
if ( task . Exception is { } aggregateException )
@@ -81,7 +79,39 @@ private bool ValidateUrl(string url)
81
79
}
82
80
return webhookUrlRegex . IsMatch ( url ) ;
83
81
}
84
- public async Task SendAsync ( WebhookRequest webhookRequest , string url , CancellationToken cancellationToken = default )
82
+ public async Task SendAsync ( WebhookMessageBuilder builder , string url , CancellationToken cancellationToken = default )
83
+ {
84
+ var fullMessage = builder . ContentBuilder . ToString ( ) ;
85
+ if ( fullMessage . Length <= MaxContentLength )
86
+ {
87
+ await SendInnerAsync ( fullMessage , builder . UserName , builder . AvatarUrl , url , cancellationToken ) ;
88
+ return ;
89
+ }
90
+ // 改行を区切りとして,上限文字数を超えないように分割して送信する
91
+ // 1行で上限を超えているケースは考慮しない
92
+ var lines = fullMessage . Split ( Environment . NewLine ) ;
93
+ var partBuilder = new StringBuilder ( ) ;
94
+ foreach ( var line in lines )
95
+ {
96
+ if ( partBuilder . Length + line . Length > MaxContentLength )
97
+ {
98
+ await SendInnerAsync ( partBuilder . ToString ( ) , builder . UserName , builder . AvatarUrl , url , cancellationToken ) ;
99
+ partBuilder . Clear ( ) ;
100
+ await Task . Delay ( 1000 , cancellationToken ) ;
101
+ }
102
+ partBuilder . AppendLine ( line ) ;
103
+ }
104
+ if ( partBuilder . Length > 0 )
105
+ {
106
+ await SendInnerAsync ( partBuilder . ToString ( ) , builder . UserName , builder . AvatarUrl , url , cancellationToken ) ;
107
+ }
108
+ }
109
+ private async Task SendInnerAsync ( string message , string userName , string avatarUrl , string url , CancellationToken cancellationToken = default )
110
+ {
111
+ var content = new WebhookRequest ( message , userName , avatarUrl ) ;
112
+ await SendAsync ( content , url , cancellationToken ) ;
113
+ }
114
+ private async Task SendAsync ( WebhookRequest webhookRequest , string url , CancellationToken cancellationToken = default )
85
115
{
86
116
try
87
117
{
@@ -124,4 +154,6 @@ public void Dispose()
124
154
new ( "WebhookUrl.txt" ) ;
125
155
#endif
126
156
private readonly Regex webhookUrlRegex = new ( "^(https://(ptb.|canary.)?discord(app)?.com/api/webhooks/)" ) ;
157
+ // 上限2,000文字.文字数カウントの実装が違うかもしれないけどよくわからないので余裕をもたせる
158
+ private const int MaxContentLength = 1950 ;
127
159
}
0 commit comments