💩

圧倒的な異臭を放つDiscord Botを作ってみた ~Qusineを添えて~

2022/12/09に公開

この記事はクソアプリ Advent Calender 9日目(シリーズ3)の記事です。

圧倒的な異臭を放つDiscord Botを作ってみました!!!!!!!!!

リポジトリ:sevenc-nanashi/pooper

https://github.com/sevenc-nanashi/pooper/blob/main/formatted.rb

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
  1. Pooperという名前のWebhookを取得(無かったら作成)、
  2. /[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]|<a?:[a-z0-9_]+:[0-9]+>/iで置き換え(参考:Rubyで文字列に絵文字が含まれるかどうかを判定する方法(ruby-jp slackで2021/11/08に行った質問回答まとめ)
  3. 投稿者と同じ名前・アイコンで置き換え後の内容を投稿、
  4. 元メッセージを削除

といった感じになっています。

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してくださると嬉しいです。

Discussion