Discordの通知本文がスマホでコピペできない!原因はコードブロックの種類だった

概要

今回はGitHub Actionsから送っているDiscord通知の本文が、スマホアプリだとワンタップでコピーできなかった不具合について紹介していきます。

自分は毎朝GitHub Actionsで実行しているツールから、その日のToDoをまとめた文章をDiscordに通知する仕組みを運用してます。

細かく説明すると通勤中にスマホでDiscordを開いて、届いた文面をコピーしてカレンダーアプリの予定に貼り付ける、という運用です。

コピペのしやすさそのものが、この仕組みの一押しでした。

ところがある日、そのコピペがうまくいかなくなっていることに気づきました。

原因を追うと思っていたのとは全然違うところで引っかかっていたので、記録として残します。

それではやっていきましょう!

目次

起きていた問題

Discord通知自体は問題なく届くのですが、スマホ(Discordモバイルアプリ)から本文をコピーしようとしてもうまくいきません。

長押ししても本文だけを選択してコピーすることができませんでした。

実は過去に一度似たような問題に対処したことがありました。

導入当初は、本文をDiscordのembedに入れて通知していました。

そのあと、「embed内のテキストはコードブロックのタップ全文コピーが効かない」と判断して、本文を通常メッセージのcontent側へ移し、トリプルバッククォート(フェンス付きコードブロック)で囲む修正を入れていたんです。

ところがこの修正を入れたあとに届いた実際の通知をスマホで試したところ、フェンス付きコードブロックのボックスを長押ししても、本文単体をコピーする選択肢が出てこず、「メッセージ全体のコピー」しかできません。

つまりembedからcontentへ移した対応自体は間違っていなかったものの、根本原因は別のところにあったということです。

気づいたきっかけ

自分は他にも、画像生成AIのパラメータ管理用に、生成条件をDiscordへ通知する別のツールを運用しています。

そちらの通知には16進数のカラーコード(例: #D7F0EE)が載っているのですが、こちらはスマホでワンタップでそのままコピーできていました。

同じDiscordモバイルアプリなのに、片方はコピーできて、片方はできない。

そこで両方のマークダウン記法を見比べてみると、違いがわかりました。

  • コピーできていた方(カラーコード)
    • 単一バッククォートのインラインコード(`#D7F0EE`)
  • コピーできなかった方(ToDo本文)
    • トリプルバッククォートのフェンス付きコードブロック

ここで、「content側かembed側か」ではなく、インラインコードかフェンス付きブロックかという表記の粒度こそが原因だと気づきました。

Discordモバイルアプリは、単一バッククォートの短いインラインコードだと単体タップ・長押しでコピーできる一方、複数行のフェンス付きコードブロックは同じ単体コピー操作に対応していないみたいです。

そういう仕様だったんですね…

直した内容

通知スクリプトに次のようなヘルパー関数を追加して、本文の囲み方をフェンス付きコードブロックから単一バッククォートのインラインコードに変更しました。

notify.py

1
2
3
4
def wrap_copyable(text):
if "`" in text:
return f"```\n{text}\n```"
return f"`{text}`"

ポイントは以下の2つです。

  • 単一バッククォートのインラインコードは改行を含んでも崩れない
    • 本文が複数段落でも、Discord側で描画が壊れずそのままタップ・長押しでコピーできる
  • 本文にバッククォート自体が含まれる場合のみフェンス付きブロックにフォールバック
    • インライン化すると囲いが壊れてしまうため、その場合だけフェンス付きコードブロックにする

締め

こんな感じで無事修正できました。

なかなか変な仕様ですが、無事治ってよかったです(^^

皆さんの何らかの助けになれたら嬉しいです。

以上となります。
こんなくだらないことで結構時間使ったので、勿体無い(- -;
それではお疲れさまでした。