この記事はクソアプリ Advent Calender 9日目(シリーズ3)の記事です。
圧倒的な異臭を放つDiscord Botを作ってみました!!!!!!!!!
リポジトリ:sevenc-nanashi/pooper
Qusineって?
Qusine(クサイン)とは、Quineのうち、特に異臭がするものを指す。
出典:なし
仕組み
ライブラリ
今回は自作のDiscord APIラッパー、discorbを使いました。
DBはsqlite、操作にはsequelを使っています。
置き換え部分
client.on :message do |message|
next if message.author.bot?
next unless channels.include?(message.channel.id.to_s)
next unless message.channel.is_a?(Discorb::TextChannel)
channel = message.channel
(
channel.fetch_webhooks.wait.find { |w| w.name == "Pooper" } ||
channel.create_webhook("Pooper").wait
).post(
message.content.gsub(
/[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]|<a?:[a-z0-9_]+:[0-9]+>/i,
"💩"
),
username: message.author.name,
avatar_url: message.author.avatar.url,
allowed_mentions:
Discorb::AllowedMentions.new(
everyone: false,
roles: false,
users: false
)
)
message.delete
end
-
Pooper
という名前のWebhookを取得(無かったら作成)、 -
/[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]|<a?:[a-z0-9_]+:[0-9]+>/i
で置き換え(参考:Rubyで文字列に絵文字が含まれるかどうかを判定する方法(ruby-jp slackで2021/11/08に行った質問回答まとめ)) - 投稿者と同じ名前・アイコンで置き換え後の内容を投稿、
- 元メッセージを削除
といった感じになっています。
Qusine部分
client.slash(
"qusine",
"このBotのソースコードを表示します。"
) do |interaction|
interaction.post(
attachment:
Discorb::Attachment.from_string(
" " * 51 + "eval(\n" + " " * 49 + "(s='" + s +
"').gsub(/\\s/,''))",
"pooper.rb"
)
)
end
最初のeval(
と(s='
、最後の').gsub(/\s/,''))
の部分以外はsを書いているだけです。単純。
で、これ実用性あるの?
ない(断言)
けどこれを作ってるときにWebhookクラスのバグを見つけられたのでOKです。
あとがき
圧倒的・異臭。Quineは2作目ですが、結構いい作品が作れたと思います。(1作目:Bad Quine!)
最後まで読んんで下さりありがとうございました。
宣伝
discorbというRubyのDiscord APIラッパーを作っています。バグ報告やPRしてくださると嬉しいです。